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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:40:10