Как написать бота телеграмм, который считывает метаданные фото (данные EXIF) ?
Какие библиотеки есть и есть ли какие-то примеры проектов ?
Важное условия: чтобы он не ссылался на локальное расположение у меня в папке. Чтобы не только я мог узнать метаданные своих фото, но и кто-то другой, загрузив в чат с ботом фото с метками.
По дате
По рейтингу
на
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()
Ты скрипты знаешь?