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服务器就能正常访问到图片了:
- 运行ngrok命令映射端口:
ngrok http 3000
- 复制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
相关产品推荐
相关产品推荐

