我有这个代码
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}')
一条消息中的多张照片实际上是用唯一的
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
更新。