Telegram Bot通过URL发图触发Bad Request错误的排查求助
解决Telegram Bot sendPhoto接口返回400错误的问题
我来帮你排查这个Bad Request: wrong file identifier/HTTP URL specified错误的原因,这类问题通常和图片URL的合规性或者Telegram的限制有关,下面是常见的几个原因和对应的解决办法:
1. URL格式或编码问题
Telegram对传入的URL有严格的格式要求:
- 确保URL是完整的HTTPS/HTTP链接,不能缺失协议头(比如不能只写
drscdn.500px.org/xxx,必须带https://) - 检查URL是否正确编码,虽然你例子里用了
https%3A%2F%2F编码,但有些特殊字符(比如空格、中文、特殊符号)可能没正确转义。建议用标准的URL编码工具处理后再传入,避免出现Telegram无法解析的字符。
2. 图片URL的访问限制
很多图片托管服务器会有防盗链或者User-Agent限制:
- Telegram Bot在拉取图片时,会使用自己的专属User-Agent,部分网站会拒绝这类请求。你可以先测试:直接在浏览器里打开失败的图片URL,如果能正常显示,但Bot无法拉取,大概率是网站的防盗链策略阻止了Telegram的请求。
- 解决办法:要么换一个允许公开访问的图片托管服务,要么先把图片下载到本地,再用
multipart/form-data的方式上传给Telegram(而不是直接传URL)。
3. 图片文件的大小或格式不符合要求
Telegram对sendPhoto接口的图片有明确限制:
- 图片文件大小不能超过10MB
- 支持的格式仅限JPG、PNG、WebP、静态GIF,如果是其他格式(比如SVG、BMP),Telegram会直接拒绝处理。
4. URL的有效期问题
有些图片URL是临时生成的(比如带签名、过期时间的链接),当链接过期后,Telegram再去拉取就会返回错误。你可以检查失败的URL是否还能正常访问,如果已经失效,需要重新生成有效的图片链接。
测试与代码示例
你可以先把失败的图片URL放到浏览器里打开,确认:
- 链接是否能正常加载图片
- 链接是否是完整的HTTPS/HTTP地址
- 图片大小和格式是否符合Telegram的要求
如果以上都没问题,那大概率是网站的防盗链限制,这时候建议先下载图片到本地,再通过本地文件上传的方式调用sendPhoto接口,这里给你一个Python的示例代码:
import requests bot_token = "你的Bot Token" chat_id = "你的Chat ID" image_url = "你要发送的图片URL" # 先下载图片到本地 response = requests.get(image_url) with open("temp_image.jpg", "wb") as f: f.write(response.content) # 上传本地图片到Telegram api_url = f"https://api.telegram.org/bot{bot_token}/sendPhoto" files = {"photo": open("temp_image.jpg", "rb")} payload = {"chat_id": chat_id} requests.post(api_url, files=files, data=payload)
内容的提问来源于stack exchange,提问作者Ali Khalili




