pyTelegramBotAPI发送本地图片媒体组报错400,求修复方法
问题修复方案
错误原因
- 重复复用同一个打开的文件对象
current_image_file:文件指针在第一次读取后会移动到文件末尾,第二次使用该对象时已无数据可读,导致Telegram API无法识别有效媒体,触发400错误。 - 媒体组中仅第一个媒体元素的
caption会生效,后续元素设置的caption会被忽略(虽不是直接报错原因,但需规范写法)。
修复代码
方案一:每次创建新的文件对象
import telebot from telegram import InputMediaPhoto from telegram.constants import ParseMode bot = telebot.TeleBot(API_KEY) all_photos = [] IMAGE_FILE_PATH = "images/image.jpg" # 第一个图片,设置caption all_photos.append(InputMediaPhoto( media=open(IMAGE_FILE_PATH, 'rb'), parse_mode=ParseMode.HTML, caption="Sample <b>Text</b>" )) # 第二个图片,无需设置caption all_photos.append(InputMediaPhoto( media=open(IMAGE_FILE_PATH, 'rb'), parse_mode=ParseMode.HTML )) bot.send_media_group(CHAT_ID, all_photos)
方案二:读取文件内容到内存复用(更高效)
import telebot from telegram import InputMediaPhoto from telegram.constants import ParseMode bot = telebot.TeleBot(API_KEY) all_photos = [] IMAGE_FILE_PATH = "images/image.jpg" # 一次性读取文件内容到内存 with open(IMAGE_FILE_PATH, 'rb') as f: image_bytes = f.read() # 第一个图片带caption all_photos.append(InputMediaPhoto( media=image_bytes, parse_mode=ParseMode.HTML, caption="Sample <b>Text</b>" )) # 第二个图片复用内存中的字节数据 all_photos.append(InputMediaPhoto( media=image_bytes, parse_mode=ParseMode.HTML )) bot.send_media_group(CHAT_ID, all_photos)
额外说明
- 若使用方案一,建议用
with语句管理文件对象,确保文件正确关闭,比如:with open(IMAGE_FILE_PATH, 'rb') as f: all_photos.append(InputMediaPhoto(media=f, parse_mode=ParseMode.HTML, caption="Sample <b>Text</b>")) - 媒体组最多支持10个媒体元素,需符合Telegram API限制。
内容的提问来源于stack exchange,提问作者Yuretz
相关产品推荐
相关产品推荐

