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
相关产品推荐
相关产品推荐

