Skip to content

Aiogram 3: Отправка медиа группы

https://habr.com/ru/articles/822061/

Для понимания работы с медиа сообщениями, так как для текстовых сообщений, используются схожие методы с небольшими отличиями, зависящими от типа сообщения. Например, для работы с фото используются методы answer_photo, reply_photo, send_photo, а для документов — answer_document, reply_document, send_document и так далее.

Также важно помнить, что правила, применяемые к текстовым сообщениям, распространяются и на медиа сообщения, за исключением того, что в медиа отсутствует объект текста message.text. Там, где это возможно (например, при добавлении подписи к фото или видео), используется элемент caption.

Методы для редактирования текста в медиа заменяются на методы для редактирования подписей edit_caption, а для замены медиа контента используется метод edit_media. Замена клавиатур для всех поддерживающих их медиа сообщений ничем не отличается от замены клавиатур в текстовых сообщениях.

Отправка медиа группы

Медиа группа в Telegram API - это самый странный и самый недоработанный элемент. Несмотря на то, что медиагруппа это вроде как отдельный объект, воспринимается она как совокупность отдельных объектов.

Никакого хендлера и фильтра нет для того, чтобы вычислить конкретно медиагруппу. Получается, что когда появляется необходимость обработать файлы из медиагруппы, приходится отдельно обрабатывать фото и видео (медиагруппа может состоять только из фото, видео, фото + видео). Это полбеды, но aiogram 3 асинхронный. Вот и получается дурдом при обработке.

Для отправки медиагруппы нам нужно будет импортировать из aiogram.types InputMediaVideo и InputMediaPhoto.

Далее нам необходимо отдельно сформировать список из медиаобъектов. В список могут попасть до 10 медиа. Сейчас соберем свой список:

python
@start_router.message(Command('send_media_group'))
async def cmd_start(message: Message, state: FSMContext):
    photo_1 = InputMediaPhoto(type='photo',
                              media=FSInputFile(path=os.path.join(all_media_dir, 'photo_2024-06-05_09-32-15.jpg')),
                              caption='Описание ко <b>ВСЕЙ</b> медиагруппе')
    photo_2 = InputMediaPhoto(type='photo',
                              media=FSInputFile(path=os.path.join(all_media_dir, 'photo_2024-06-14_20-13-40.jpg')))
    photo_3 = InputMediaPhoto(type='photo',
                              media=FSInputFile(path=os.path.join(all_media_dir, 'photo_2024-06-05_09-32-15.jpg')))
    video_1 = InputMediaVideo(type='video',
                              media=FSInputFile(path=os.path.join(all_media_dir, 'IMG_4045.MP4')))
    photo_4 = InputMediaPhoto(type='photo',
                              media=FSInputFile(path=os.path.join(all_media_dir, 'photo_2024-06-14_20-16-27.jpg')))
    video_2 = InputMediaVideo(type='video',
                              media=FSInputFile(path=os.path.join(all_media_dir, 'IMG_3978.MP4')))

    media = [photo_1, photo_2, photo_3, video_1, photo_4, video_2]
    await message.answer_media_group(media=media)

Особенности, на которые нужно обратить внимание:

  • К медиагруппе нельзя привязать клавиатуру никакую (разве что вы привяжете текстовую клавиатуру к какому-то сообщению до медиагруппы).
  • Если оставить комментарий к первому объекту медиагруппы, то он будет общим. Но если вы будете привязывать описание к нескольким элементам медиагруппы, то для его прочтения нужно будет открывать каждый элемент и читать.
  • Медиагруппа может состоять только из фото, видео, фото + видео.

Contacts: teffal@mail.ru