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

Java Telegram Bot如何获取发送图片的链接?调用getFile返回404

问题描述

我通过Java Telegram Bot向群组发送多张图片,代码如下:

public void executeImages() {

        InputMediaPhoto photo1 = new InputMediaPhoto();
        photo1.setMedia(new File("image.jpg"), "image.jpg");
        photo1.setCaption("Hello World");

        InputMediaPhoto photo2 = new InputMediaPhoto();
        photo2.setMedia(new File("image2.jpg"), "image2.jpg");
        
        // ......... 另外8张图片

        List<InputMedia> mediaItems = new ArrayList<>();
        mediaItems.add(photo1);
        mediaItems.add(photo2);

        SendMediaGroup sendMediaGroup = new SendMediaGroup();
        sendMediaGroup.setChatId("1234");
        sendMediaGroup.setMedias(mediaItems);

        Message response = execute(sendMediaGroup);
        System.out.println(response);

}

发送后得到的响应片段如下:

......
"photo="[
   PhotoSize(fileId=AgACAgIAAx0EdU4tbQACArplMYIf1aguPWCCTyJtJdyDtv22SwACCdIxG8qriUmXo4IzUpGK7wEAAwIAA3MAAzAE,
   fileUniqueId=AQADCdIxG8qriUl4,
   width=90,
   height=90,
   fileSize=2673,
   "filePath=null)",
   PhotoSize(fileId=AgACAgIAAx0EdU4tbQACArplMYIf1aguPWCCTyJtJdyDtv22SwACCdIxG8qriUmXo4IzUpGK7wEAAwIAA20AAzAE,
   fileUniqueId=AQADCdIxG8qriUly,
   width=225,
   height=225,
   fileSize=14378,
   "filePath=null)"
]
......

我尝试调用接口获取图片链接时返回404错误:

请求地址:
https://api.telegram.org/file/bot5882468685:AAH3QIsQt3849xI-yKMJ_MV7QcN8XK7e32Q/getFile?file_id=AgACAgIAAx0EdU4tbQACArplMYIf1aguPWCCTyJtJdyDtv22SwACCdIxG8qriUmXo4IzUpGK7wEAAwIAA3MAAzAE

返回结果:
{"ok":false,"error_code":404,"description":"Not Found"}

请问如何通过返回的响应获取所有图片的链接?

解决方法

1. 修正getFile接口的调用格式

你遇到404是因为URL格式错误,正确的getFile接口地址应该是https://api.telegram.org/bot<机器人令牌>/getFile,不能把file/放在bot<令牌>前面。

修正后的请求示例:

https://api.telegram.org/bot5882468685:AAH3QIsQt3849xI-yKMJ_MV7QcN8XK7e32Q/getFile?file_id=AgACAgIAAx0EdU4tbQACArplMYIf1aguPWCCTyJtJdyDtv22SwACCdIxG8qriUmXo4IzUpGK7wEAAwIAA3MAAzAE

2. 获取文件路径并拼接下载链接

调用修正后的接口后,会返回包含file_path的响应,示例如下:

{"ok":true,"result":{"file_id":"AgACAgIAAx0EdU4tbQACArplMYIf1aguPWCCTyJtJdyDtv22SwACCdIxG8qriUmXo4IzUpGK7wEAAwIAA3MAAzAE","file_unique_id":"AQADCdIxG8qriUl4","file_size":2673,"file_path":"photos/file_0.jpg"}}

用返回的file_path拼接最终下载链接,格式为:https://api.telegram.org/file/bot<机器人令牌>/<file_path>

示例下载链接:

https://api.telegram.org/file/bot5882468685:AAH3QIsQt3849xI-yKMJ_MV7QcN8XK7e32Q/photos/file_0.jpg

3. 批量处理所有图片

发送媒体组后,execute(sendMediaGroup)返回的是消息列表(每个消息对应一张图片)。每个消息的photo数组包含不同尺寸的图片,通常数组最后一个元素是最大尺寸的图片。你可以遍历消息列表,批量获取所有图片的下载链接:

// 注意:SendMediaGroup返回的是List<Message>,而非单个Message
List<Message> messages = execute(sendMediaGroup);
List<String> imageUrls = new ArrayList<>();
String botToken = "5882468685:AAH3QIsQt3849xI-yKMJ_MV7QcN8XK7e32Q";

for (Message msg : messages) {
    List<PhotoSize> photos = msg.getPhoto();
    if (photos != null && !photos.isEmpty()) {
        // 取最大尺寸的图片(数组最后一个元素)
        PhotoSize largestPhoto = photos.get(photos.size() - 1);
        String fileId = largestPhoto.getFileId();

        // 调用getFile接口获取file_path
        GetFile getFile = new GetFile();
        getFile.setFileId(fileId);
        File file = execute(getFile);
        String filePath = file.getFilePath();

        // 拼接下载链接
        String imageUrl = "https://api.telegram.org/file/bot" + botToken + "/" + filePath;
        imageUrls.add(imageUrl);
    }
}

// 输出所有图片链接
for (String url : imageUrls) {
    System.out.println(url);
}

注意:文件在Telegram服务器上会保留一段时间,过期后无法获取,请及时处理。

内容的提问来源于stack exchange,提问作者Jackie Chan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:24:57