使用java-telegram-bot-api的EditMessageMedia将单图消息改为多图
使用java-telegram-bot-api修改消息为多图格式的问题
我原本用java-telegram-bot-api库修改单图消息的代码运行正常,但现在要改成多图形式,遇到了问题:编辑多图消息时,无法通过EditMessageCaption单独修改标题,需要解决方案。
原单图运行正常的代码
EditMessageMedia editMessageMedia = new EditMessageMedia(chatId, messageID, new InputMediaPhoto(new File("images" + File.separator + "money.png"))); this.bot.execute(editMessageMedia); EditMessageCaption editMessageText = new EditMessageCaption(chatId, messageID).caption(Main.getDictionary(languageCode) .get("invoice")) .parseMode(ParseMode.Markdown) .replyMarkup(inlineKeyboardMarkup);
我尝试的多图代码
File[] filesList = new File("images" + File.separator + "treasures" + File.separator + treasure.getId()).listFiles(); List<InputMediaPhoto> inl = new ArrayList<>(); for (File file : filesList) if (file.isFile()) inl.add(new InputMediaPhoto(file)); EditMessageMedia editMessageMedia = new EditMessageMedia(invoice.getChatId(), invoice.getMessageId(), inl); this.bot.execute(editMessageMedia); EditMessageCaption editMessageText = new EditMessageCaption(invoice.getChatId(), invoice.getMessageId()) .caption("*" + treasure.getX() + " " + treasure.getY() + "*\n" + "_" + treasure.getDescription() + "_") .parseMode(ParseMode.Markdown); this.bot.execute(editMessageText);
解决方案
Telegram API规则:媒体组(多图)消息的标题不能通过EditMessageCaption单独修改,必须在EditMessageMedia中,将标题绑定到媒体组的第一个媒体对象上,一起提交编辑。
修正后的代码如下:
File[] filesList = new File("images" + File.separator + "treasures" + File.separator + treasure.getId()).listFiles(); List<InputMediaPhoto> mediaList = new ArrayList<>(); // 判空避免空指针 if (filesList != null) { for (int i = 0; i < filesList.length; i++) { File file = filesList[i]; if (file.isFile()) { InputMediaPhoto media = new InputMediaPhoto(file); // 仅给第一个媒体设置标题,Telegram会将其作为整个媒体组的标题 if (i == 0) { String caption = "*" + treasure.getX() + " " + treasure.getY() + "*\n_" + treasure.getDescription() + "_"; media.setCaption(caption); media.setParseMode(ParseMode.Markdown); } mediaList.add(media); } } } // 确保有媒体才执行编辑 if (!mediaList.isEmpty()) { EditMessageMedia editMessageMedia = new EditMessageMedia(invoice.getChatId(), invoice.getMessageId(), mediaList); this.bot.execute(editMessageMedia); }
关键说明
- 媒体组的标题仅需设置给第一个
InputMediaPhoto对象,Telegram会自动将该标题显示在整个媒体组下方。 - 无需再调用
EditMessageCaption,该接口仅支持单媒体消息的标题修改,不兼容媒体组类型。 - 增加了
filesList和媒体列表的判空处理,避免因目录为空或无文件导致的报错。
内容的提问来源于stack exchange,提问作者Yaroslav Peretiatko
相关产品推荐
相关产品推荐

