Как обрабатывать медиагруппу через telegraf.js?

У меня есть бот, и в одном из модулей я в сцене создаю объект, в который заносится сообщение пользователя, и который он может потом отредактировать. Сейчас код сцены выглядит так:

getTaskScene.on("message", async (ctx) => {
    let data = {};
    data.text = ctx.message.text ||= "";
    if (ctx.message.photo) {
        data.files = [{ type: "photo", media: `${ctx.message.photo[3].file_id}` }];
        data.type = "photo";
    } else if (ctx.message.document) {
        data.files = ctx.message.document.map((value) => {
            return { type: "document", media: { source: value.file_id } };
        });
        data.type = "document";
    } else {
        data.type = "text";
    }
    ctx.scene.enter("editTaskScene", { data: data });
});

Этот код не обрабатывает медиагруппу корректно: если я прикреплю 4 фото, то код отработает 4 раза, а не один. Есть ли способ обрабатывать медиагруппу как одно сообщение и добавлять все фото сразу же? Я пробовал использовать в главном файле bot.use(mediaGroup()), но это, почему-то, не сработало для меня.


Ответы (1 шт):

Автор решения: Anatoly

Можно воспользоваться событием "media_group" вместо "message":

bot.on('media_group', async (ctx) => {
  const mediaGroup = ctx.update.message.media_group;

  // Обработка медиагруппы
  // mediaGroup содержит массив объектов с информацией о каждом медиафайле

  // Ваша логика обработки медиагруппы здесь

  // К примеру выводим количество фото в медиагруппе
  const photoCount = mediaGroup.filter((item) => item.type === 'photo').length;
  ctx.reply(`Количество изображений: ${photoCount}`);
});

bot.launch();
→ Ссылка