Когда приходит медиагруппа, она приходит как несколько ивентов. Если сообщение является частью медиагруппы, то в объекте есть поле
media_group_id
. Как не сложно догадаться, оно отвечает за ID медиагруппы, к которой относится аттач в текущем message.
Если поставить брейкпоинты и посмотреть что приходит, можно увидеть следующее. В данном примере я отправил боту два фото в медиагруппе:
(Pdb) message
<Message {"message_id": 3722, "from": {"id": , "is_bot": false, "first_name": "", "last_name": "", "username": "", "language_code": "en"}, "chat": {"id": , "first_name": "", "last_name": "", "username": "", "type": "private"}, "date": 1684612051, "media_group_id": "13476752415654514", "photo": [{"file_id": "AgACAgIAAxkBAAIOimRo3YOZvV5o4JU9E82P5XcM20RuAAJYxzEbizpJS11D-cNh5_WcAQADAgADcwADLwQ", "file_unique_id": "AQADWMcxG4s6SUt4", "file_size": 526, "width": 90, "height": 31}, {"file_id": "AgACAgIAAxkBAAIOimRo3YOZvV5o4JU9E82P5XcM20RuAAJYxzEbizpJS11D-cNh5_WcAQADAgADbQADLwQ", "file_unique_id": "AQADWMcxG4s6SUty", "file_size": 3234, "width": 320, "height": 111}, {"file_id": "AgACAgIAAxkBAAIOimRo3YOZvV5o4JU9E82P5XcM20RuAAJYxzEbizpJS11D-cNh5_WcAQADAgADeAADLwQ", "file_unique_id": "AQADWMcxG4s6SUt9", "file_size": 6482, "width": 720, "height": 250}]}>
(Pdb) continue
-> photos = message.photo
(Pdb) message
<Message {"message_id": 3723, "from": {"id": , "is_bot": false, "first_name": "", "last_name": "", "username": "", "language_code": "en"}, "chat": {"id": , "first_name": "", "last_name": "", "username": "", "type": "private"}, "date": 1684612051, "media_group_id": "13476752415654514", "photo": [{"file_id": "AgACAgIAAxkBAAIOi2Ro3YOx2AABRU8XtUeWrywlprEjbAACXscxG4s6SUvFtnLWpbRhVAEAAwIAA3MAAy8E", "file_unique_id": "AQADXscxG4s6SUt4", "file_size": 955, "width": 90, "height": 90}, {"file_id": "AgACAgIAAxkBAAIOi2Ro3YOx2AABRU8XtUeWrywlprEjbAACXscxG4s6SUvFtnLWpbRhVAEAAwIAA20AAy8E", "file_unique_id": "AQADXscxG4s6SUty", "file_size": 6024, "width": 320, "height": 320}, {"file_id": "AgACAgIAAxkBAAIOi2Ro3YOx2AABRU8XtUeWrywlprEjbAACXscxG4s6SUvFtnLWpbRhVAEAAwIAA3gAAy8E", "file_unique_id": "AQADXscxG4s6SUt9", "file_size": 9207, "width": 512, "height": 512}]}>
(Pdb)
Видно, что ID файлов разное, поэтому поздравляю всех кто
проверяли на других библиотеках, говорят, это ошибка API
. Всё работает штатно и так есть уже несколько лет, если мне не изменяет память.
(тем не менее мне самому не нравится подход Telegram к такому типу сообщений. У Дурова всегда неплохие API были, зачем тут так сделано мне не ясно, возможно, для этого есть умное объяснение)
А что делать то?
1. В обработчик приходит сообщение, содержащее медиагруппу
2. Заносите ID файла и ID медиагруппы куда нибудь в БД / FSM / etc
3. Как говорится tricky part: одним из способов детекта, когда же кончится чудесная волна сообщений с одинаковой медиагруппой, является проверка по времени. Т.к. это по сути одно и то же сообщение, то апдейты прилетают одинаково по времени. Соответственно, после того как у вас пришло сообщение, у которого ID медиагруппы уникально, то есть такую еще не обрабатывали до этого, ставите "таймер" допустим на 1-2 секунды. На протяжении этого времени скрипт успеет отловить все файлы от этого сообщения.
4. Пока ловятся ваши апдейты, так же, в FSM / БД / etc. заносите ID файлов
5. По окончании таймера, достаете все ваши file ID, делаете из них своё сообщение, отправляете юзеру, а саму группу удаляете из FSM / БД
Есть готовые решения для обработки, не отвечаю за них, но вот:
https://github.com/WhiteMemory99/aiogram_album_han...
Как пример можете просто взять этот Middleware, либо просто переписать свой аналог. Могу и сюда приложить какое нибудь решение как освобожусь, но вряд ли оно будет отличаться чем-то от этого