如何使用Python Requests向Telegram Bot API发送BytesIO音频文件对象?
Telegram 语音消息发送代码修复方案
原代码存在的问题
- 使用了错误的API端点:发送语音需要调用
sendVoice接口,而非文本消息的sendMessage data变量末尾多了逗号,导致其变成元组类型,requests无法正确解析该参数- 手动设置
Content-Type: multipart/form-data是多余的,requests在传递files参数时会自动生成正确的请求头,手动设置可能引发格式冲突 - BytesIO对象未指定文件名,Telegram无法识别文件类型,需要明确带后缀的文件名(如
voice.ogg)
修复后的代码
import requests from io import BytesIO def send_voice_msg(chat_id: int, voice_file: BytesIO) -> None: token = TELEGRAM_BOT_TOKEN # 更换为正确的sendVoice接口 url = f"https://api.telegram.org/bot{token}/sendVoice" # 移除多余逗号,确保data是字典类型 data = {"chat_id": chat_id} # 给BytesIO对象指定文件名,让Telegram识别文件类型 files = {'voice': ('voice.ogg', voice_file)} try: r = requests.post(url, data=data, files=files, timeout=3) # 检查响应状态,确认发送是否成功 r.raise_for_status() print("语音消息发送成功") except requests.exceptions.RequestException as err: print(f"发送失败: {err}") # 可选:打印响应内容辅助排查问题 # print(r.json() if r.content else "无响应内容")
额外说明
- 确保
voice_file是Telegram支持的音频格式(推荐OGG编码,采样率不超过48kHz) - 如果需要给语音添加说明文本,可在
data字典中加入caption字段,例如data = {"chat_id": chat_id, "caption": "这是一条语音消息"}
内容的提问来源于stack exchange,提问作者Kirill Meha
相关产品推荐
相关产品推荐

