
本文详解在 Java 中调用 Telegram Bot API 发送远程 URL 图片的正确方法,重点解决 InputFile 构造方式误区及 “Bad Request: wrong HTTP URL specified” 错误。
本文详解在 java 中调用 telegram bot api 发送远程 url 图片的正确方法,重点解决 `inputfile` 构造方式误区及 “bad request: wrong http url specified” 错误。
在使用 Telegram Bot API 的 Java SDK(如 TelegramBots)发送图片时,一个常见误区是认为 SendPhoto.setPhoto() 可直接传入 HTTP URL 字符串或 new InputFile("https://...") —— 实际上,Telegram 官方 API 不支持直接传递远程 URL 给 InputFile 构造函数(除非使用 InputFile(String filePath) 且该路径为本地文件系统路径)。当你传入 new InputFile("http://..."),SDK 会尝试将其当作本地文件路径解析,导致请求失败并返回 [400] Bad Request: wrong HTTP URL specified。
✅ 正确做法是:将远程图片 URL 转换为 InputStream,再配合自定义文件名(推荐使用带扩展名的合理名称),构造 InputFile 实例。示例如下:
import java.io.InputStream;
import java.net.URL;
// 假设 chatId 已获取,myUrl 是可公开访问的图片地址(注意:Telegram 服务器需能直连该地址)
String myUrl = "http://localhost:3000/media/photo_97@05-06-2023_00-22-51.jpg";
try (InputStream stream = new URL(myUrl).openStream()) {
SendPhoto sendPhoto = new SendPhoto();
sendPhoto.setChatId(chatId);
// 关键:使用 InputStream + 显式文件名(扩展名必须正确,如 .jpg/.png)
sendPhoto.setPhoto(new InputFile(stream, "photo.jpg"));
// 通过 execute() 方法发送(需已配置 BotSession 或 TelegramBot 实例)
bot.execute(sendPhoto);
} catch (Exception e) {
e.printStackTrace();
}⚠️ 注意事项:
-
URL 可访问性:Telegram 服务器必须能直接访问你提供的图片 URL。若使用
localhost(如示例中的http://localhost:3000/...),Telegram 无法解析,会导致发送失败。生产环境请替换为公网可访问的 HTTPS 地址(HTTP 在部分版本中可能被拒绝)。 -
文件名重要性:
InputFile(InputStream, String fileName)中的fileName用于告知 Telegram 文件类型和原始名称,必须包含正确扩展名(如"image.png"),否则可能触发 MIME 类型识别错误。 -
资源管理:务必使用 try-with-resources 确保
InputStream及时关闭,避免连接泄漏。 - 替代方案:如需更高可靠性,建议先将远程图片下载到内存(
ByteArrayInputStream)或临时文件,再封装为InputFile;对于高频调用,可考虑缓存图片流。
总结:InputFile 不接受纯 URL 字符串,也不支持直接通过 new InputFile("http://...") 上传远程图。唯一可靠方式是获取 InputStream 并显式指定带扩展名的文件名——这是符合 Telegram Bot API 设计规范的标准实践。
立即学习“Java免费学习笔记(深入)”;


















