You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Telepot sendAudio/sendPhoto报400错误请求问题求助

问题:telepot的sendAudio/sendPhoto报错"Bad Request: wrong HTTP URL specified",但直接用requests调用API正常

我在用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。


分析与解决方案

可能的原因

  1. URL格式或有效性问题:telepot对远程文件URL的校验可能比直接用requests更严格。比如你的file_url可能存在拼写错误、多余空格,或者是Telegram不支持的协议(比如不是HTTPS/HTTP),也可能URL指向的资源有重定向、无法直接访问,或者返回的MIME类型不符合要求。

  2. telepot的参数处理逻辑:telepot的sendAudio/sendPhoto方法在处理远程URL时,可能会对URL进行额外的转义或格式处理,导致最终传给Telegram API的URL不符合要求。而直接用requests时,你手动控制了参数,避免了这个问题。

  3. 参数类型混淆: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

火山引擎 最新活动