Получение нескольких изображений для загрузки из бота Telegram

У меня есть этот код

file_name = f'photo_{update.message.message_id}_{photo.file_unique_id}.jpg'


full_download_url = f"https://api.telegram.org/file/bot{BOT_TOKEN}/{download_url}"
logger.info(f'Downloading photo from URL: {full_download_url}')   
response = requests.get(full_download_url)
response.raise_for_status()   
with open(file_name, 'wb') as f:
    f.write(response.content)

Этот код находит URL-адрес телеграммы

Telegram отправляет изображения в нескольких сообщениях или обновлениях в одном и том же контексте. Мне трудно заставить эту часть работать, когда она загружает изображения. В настоящее время этот код загружает одно и то же изображение 4 раза вместо проверки фактического количества изображений в обновлении. Таким образом, даже если я отправлю 2 изображения, он все равно просто загружает первое изображение и перебирает его, переименовывая и сохраняя его 4 раза. Не могли бы вы подсказать, как решить эту проблему?

async def download_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
 
    photos = update.message.photo
    media_paths = []

    for photo in photos:
        file_id = photo.file_id
        logger.info(f'Processing photo with file_id: {file_id}')  
        try:
            file_info = await context.bot.get_file(file_id)
            download_url = file_info.file_path  # Use the file_path directly

            # Create a unique filename for each photo
            file_name = f'photo_{update.message.message_id}_{photo.file_unique_id}.jpg'

            # Log the full download URL
            full_download_url = f"https://api.telegram.org/file/bot{BOT_TOKEN}/{download_url}"
            logger.info(f'Downloading photo from URL: {full_download_url}')  

            # Download the photo using the full download URL
            response = requests.get(full_download_url)
            response.raise_for_status()  
            with open(file_name, 'wb') as f:
                f.write(response.content)
            media_paths.append(file_name)
            logger.info(f'Downloaded photo successfully with file_id: {file_id}')
        except Exception as e:
            logger.error(f'Error downloading photo with file_id {file_id}: {e}')

    logger.info(f'All downloaded media paths: {media_paths}')  
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
2
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Несколько фотографий в одном сообщении на самом деле представляют собой несколько сообщений, сгруппированных вместе с уникальным media_group_id. Каждое обновление сообщения, которое вы получаете, содержит только одну фотографию. Поле photos в обновлении message представляет собой массив объектов PhotoSize (см. документацию Message). Telegram отправляет в этом массиве одно и то же изображение нескольких размеров, отсортированное от меньшего к большему.

Чтобы загрузить все фотографии в сообщении, вам необходимо обработать все обновления сообщения и для каждого загрузить последнее изображение в массиве (самое высокое разрешение).

Вот как вы можете изменить свой цикл с помощью условия:

async def download_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):

    photo = update.message.photo
    media_paths = []

    if photo:
        file_id = photo[-1].file_id
        ... # proceed with the rest of your logic
        

И внедрите эту логику в своего бота, чтобы он обрабатывал все соответствующие message обновления.

Другие вопросы по теме