Appearance
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)
Особенности, на которые нужно обратить внимание:
- К медиагруппе нельзя привязать клавиатуру никакую (разве что вы привяжете текстовую клавиатуру к какому-то сообщению до медиагруппы).
- Если оставить комментарий к первому объекту медиагруппы, то он будет общим. Но если вы будете привязывать описание к нескольким элементам медиагруппы, то для его прочтения нужно будет открывать каждый элемент и читать.
- Медиагруппа может состоять только из фото, видео, фото + видео.