纯Python无框架向Telegram发送相册多图遇400错误求解决
Telegram Bot sendMediaGroup接口400错误排查与修复
问题根源
你遇到的Bad Request: can't parse media JSON object错误,核心原因有两个:
- 手动拼接JSON字符串不规范:用
str(files_content_to_send).replace("'", '"')生成的字符串并非标准JSON格式,一旦文件名或描述包含空格、引号等特殊字符,就会导致API无法解析。 - caption参数违反API规则:sendMediaGroup接口中,只有媒体组的第一个元素的
caption和parse_mode会生效,给每个元素都添加这两个参数属于冗余操作,还可能干扰解析逻辑。
修复方案
- 使用
json.dumps()序列化media列表,生成标准JSON字符串,替代手动拼接的方式。 - 仅给第一个媒体对象添加
caption和parse_mode,其余对象只保留type和media字段。 - 优化文件标识:用简洁的序号命名(如
photo_0)作为attach的键,避免文件名含特殊字符导致的匹配失败。
修正后的代码
import json import requests def sendMediaGroup(pict_full_filename__list, description, to_whom=None, silent=True): command = (T_url + "sendMediaGroup") sent_picture__dict = dict() files_content_to_send = list() for idx, one_pict in enumerate(pict_full_filename__list): # 用序号作为attach标识,规避文件名特殊字符问题 attach_key = f"photo_{idx}" sent_picture__dict[attach_key] = open(one_pict, 'rb') media_item = { 'type': 'photo', 'media': f'attach://{attach_key}' } # 仅第一个媒体对象设置caption和解析模式 if idx == 0: media_item['caption'] = description media_item['parse_mode'] = 'HTML' files_content_to_send.append(media_item) parameters = { "chat_id": str(to_whom), "media": json.dumps(files_content_to_send), # 正确序列化JSON "disable_notification": silent } response = requests.post(command, data=parameters, files=sent_picture__dict) response_data = json.loads(response.text) if not response_data["ok"]: print('FAILED') print(f'Recipient: {to_whom}') print(f'Reply: {response.text}') print() # 统一关闭文件句柄 for f in sent_picture__dict.values(): f.close()
额外说明
- 确保
T_url已正确配置为Telegram Bot API基础地址(格式为https://api.telegram.org/bot<你的BotToken>/)。 - 若发送视频、文档等其他媒体,只需修改
type字段为对应值(如video、document),规则与图片一致。
内容的提问来源于stack exchange,提问作者C4H7Cl2O4P
相关产品推荐
相关产品推荐

