Telepot sendAudio/sendPhoto报400错误请求问题求助
我在用telepot.Bot(bot_id).sendAudio(chat_id, file_url)发送音频时遇到了如下报错:
Traceback (most recent call last): File "C:\Users\vinu\AppData\Local\Programs\Python\Python37\lib\site-packages\telepot\__init__.py", line 1158, in collector callback(item) File "bot.py", line 72, in handle bot.sendAudio(chat_id, url) File "C:\Users\vinu\AppData\Local\Programs\Python\Python37\lib\site-packages\telepot\__init__.py", line 556, in sendAudio return self._api_request_with_file('sendAudio', _rectify(p), 'audio', audio) File "C:\Users\vinu\AppData\Local\Programs\Python\Python37\lib\site-packages\telepot\__init__.py", line 496, in _api_request_with_file return self._api_request(method, _rectify(params), **kwargs) File "C:\Users\vinu\AppData\Local\Programs\Python\Python37\lib\site-packages\telepot\__init__.py", line 491, in _api_request return api.request((self._token, method, params, files), **kwargs) File "C:\Users\vinu\AppData\Local\Programs\Python\Python37\lib\site-packages\telepot\api.py", line 155, in request return _parse(r) File "C:\Users\vinu\AppData\Local\Programs\Python\Python37\lib\site-packages\telepot\api.py", line 150, in _parse raise exception.TelegramError(description, error_code, data) telepot.exception.TelegramError: ('Bad Request: wrong HTTP URL specified', 400, {'ok': False, 'error_code': 400, 'description': 'Bad Request: wrong HTTP URL specified'})
同时sendPhoto方法也出现相同错误,但我用Python requests直接发送图片却能正常运行:
response = requests.post('https://api.telegram.org/bot<your_token>/sendphoto', files=files)
我想知道这两个方法故障的原因,以及发送音频的正确HTTP请求URL。
可能的原因
URL格式或有效性问题:telepot对远程文件URL的校验可能比直接用requests更严格。比如你的
file_url可能存在拼写错误、多余空格,或者是Telegram不支持的协议(比如不是HTTPS/HTTP),也可能URL指向的资源有重定向、无法直接访问,或者返回的MIME类型不符合要求。telepot的参数处理逻辑:telepot的
sendAudio/sendPhoto方法在处理远程URL时,可能会对URL进行额外的转义或格式处理,导致最终传给Telegram API的URL不符合要求。而直接用requests时,你手动控制了参数,避免了这个问题。参数类型混淆:telepot允许
audio参数接收多种类型(file_id、本地文件路径、文件对象、远程URL),如果你的URL看起来像file_id(比如格式不对),可能会被telepot误判,导致错误的请求。
解决步骤
1. 先验证你的file_url是否符合Telegram API要求
确保你的URL满足:
- 是有效的HTTPS或HTTP链接,没有空格、拼写错误
- 可以直接在浏览器中打开,返回对应的音频/图片文件(没有重定向到其他页面)
- 文件的MIME类型正确(比如音频是
audio/mpeg,图片是image/jpeg等)
2. 尝试用本地文件测试telepot方法
先排除URL的问题,试试传递本地文件对象:
with open("your_audio_file.mp3", "rb") as audio_file: bot.sendAudio(chat_id, audio_file)
如果这个能正常运行,说明问题确实出在远程URL的处理上。
3. 手动构造sendAudio的API请求(替代方案)
既然你用requests调用sendPhoto正常,那也可以用同样的方式调用sendAudio,正确的API URL格式是:
https://api.telegram.org/bot<你的机器人token>/sendAudio
示例代码:
# 发送远程URL的音频 import requests url = "https://api.telegram.org/bot<your_bot_token>/sendAudio" data = { "chat_id": chat_id, "audio": file_url # 这里填你的远程音频URL } response = requests.post(url, data=data) # 如果是发送本地音频文件 files = { "audio": open("your_audio.mp3", "rb") } data = {"chat_id": chat_id} response = requests.post(url, data=data, files=files)
这样可以绕过telepot的参数处理逻辑,直接和Telegram API交互,应该能解决问题。
4. 检查telepot版本和更新
可能你用的telepot版本存在bug,尝试更新到最新版:
pip install --upgrade telepot
更新后再测试sendAudio方法,看是否解决问题。
内容的提问来源于stack exchange,提问作者Ram Prakash




