从电报机器人下载多个图像

问题描述 投票:0回答:1

我有这个代码

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)

此代码查找电报网址

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 telegram-bot python-telegram-bot telegram-api
1个回答
0
投票

一条消息中的多张照片实际上是用唯一的

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
更新。

© www.soinside.com 2019 - 2024. All rights reserved.