You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中使用Telegram Bot API发送图片的问题排查

解决Telegram Bot SendPhoto 400错误的方案

核心问题在于:Telegram服务器无法访问你的localhost本地地址——哪怕你用Postman能正常访问本地API,Telegram的服务器处于公网环境,无法穿透到你的本地网络,因此就会返回400 Bad Request: wrong HTTP URL specified错误。

下面是几种可行的解决方法:

1. 直接发送图片字节流

绕过URL访问,把图片数据直接传给Telegram Bot API。可以从本地文件读取,或者先通过HTTP请求从你的本地API拿到字节流,再用字节流构造InputFile:

从本地文件读取示例

File imageFile = new File("你的本地图片绝对路径/photo_97@05-06-2023_00-22-51.jpg");
InputFile inputFile = new InputFile(imageFile);

SendPhoto sendPhoto = new SendPhoto();
sendPhoto.setChatId(chatId);
sendPhoto.setPhoto(inputFile);

从本地API获取字节流示例(以RestTemplate为例)

// 先从本地API获取图片字节数组
byte[] imageBytes = restTemplate.getForObject("http://localhost:3000/media/photo_97@05-06-2023_00-22-51.jpg", byte[].class);
// 用字节流构造InputFile,第二个参数是文件名
InputFile inputFile = new InputFile(new ByteArrayInputStream(imageBytes), "photo.jpg");

SendPhoto sendPhoto = new SendPhoto();
sendPhoto.setChatId(chatId);
sendPhoto.setPhoto(inputFile);

2. 将本地服务暴露到公网

使用工具(如ngrok)把你的本地3000端口映射为公网可访问的URL,这样Telegram服务器就能正常访问到图片了:

  1. 运行ngrok命令映射端口:
ngrok http 3000
  1. 复制ngrok生成的公网域名(类似https://abc123.ngrok.io),替换代码中的localhost地址:
sendPhoto.setPhoto(new InputFile("https://abc123.ngrok.io/media/photo_97@05-06-2023_00-22-51.jpg"));

3. 使用已上传的文件ID(若适用)

如果这张图片之前已经通过该Bot发送过,Telegram会为它生成一个唯一的文件ID。直接使用这个ID构造InputFile,无需再传URL:

sendPhoto.setPhoto(new InputFile("你的图片文件ID"));

内容的提问来源于stack exchange,提问作者Ahmed Mohamed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:56:14