Top.Mail.Ru
Ответы

Как написать бота телеграмм, который считывает метаданные фото (данные EXIF) ?

Какие библиотеки есть и есть ли какие-то примеры проектов ?
Важное условия: чтобы он не ссылался на локальное расположение у меня в папке. Чтобы не только я мог узнать метаданные своих фото, но и кто-то другой, загрузив в чат с ботом фото с метками.

По дате
По рейтингу
Аватар пользователя
Новичок
8мес

на

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
 import os 
import logging 
from telegram import Update, InputFile, ReplyKeyboardMarkup, KeyboardButton 
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext 
from PIL import Image 
from io import BytesIO 
 
# Настройка логирования 
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO) 
logger = logging.getLogger(__name__) 
 
def start(update: Update, context: CallbackContext) -> None: 
    keyboard = [[KeyboardButton("Отправить фото")]] 
    reply_markup = ReplyKeyboardMarkup(keyboard, one_time_keyboard=True) 
    update.message.reply_text('Привет! Отправьте мне фото, и я покажу его метаданные!', reply_markup=reply_markup) 
 
def handle_photo(update: Update, context: CallbackContext) -> None: 
    try: 
        photo_file = update.message.photo[-1].get_file() 
        photo_file.download('photo.jpg') 
 
        # Открываем изображение и извлекаем EXIF данные 
        image = Image.open('photo.jpg') 
        exif_data = image._getexif() 
 
        if exif_data: 
            metadata = format_exif_data(exif_data) 
            update.message.reply_text(f"*Метаданные EXIF:*\n{metadata}", parse_mode='Markdown') 
        else: 
            update.message.reply_text("EXIF данные отсутствуют.") 
    except Exception as e: 
        logger.error(f"Ошибка при обработке фото: {str(e)}") 
        update.message.reply_text("Произошла ошибка при обработке вашего фото. Попробуйте еще раз.") 
 
def format_exif_data(exif_data): 
    formatted_data = [] 
    for key, value in exif_data.items(): 
        tag_name = Image.ExifTags.TAGS.get(key, key) 
        formatted_data.append(f"{tag_name}: {value}") 
    return "\n".join(formatted_data) 
 
def main() -> None: 
    updater = Updater("YOUR_TOKEN") 
    dispatcher = updater.dispatcher 
 
    dispatcher.add_handler(CommandHandler("start", start)) 
    dispatcher.add_handler(MessageHandler(Filters.photo, handle_photo)) 
 
    updater.start_polling() 
    updater.idle() 
 
if __name__ == '__main__': 
    main() 
Аватар пользователя
Мыслитель
8мес

Ты скрипты знаешь?