@danila2930

Как отправить группу фото через библиотеку aiogram?

ребят. Возникла такая проблема с aiogram. Хочу получить от пользователя группу фотографий и после этого отправить её обратно с дополнительной информацией. Но бот в место того что бы отправить 3 фотографии после того как принял 3. отправляет 3 группы по 4 фотографии. Смотрел айди фотографий при приеме там не 3 разных айди, а 4 одинаковых. Спрашивал на других форумах, те проверяли на других библиотеках, говорят, это ошибка API. Есть ли обходные пути?
@dp.message_handler(content_types=types.ContentType.PHOTO, state=CREATEPOSTFSM.Photo_state)
async def process_photos_step(message: Message, state: FSMContext):
    photos: List[types.PhotoSize] = message.photo
    await state.update_data(photos=photos)
    data = await state.get_data()
    photos = data.get('photos')
    caption = data.get('Info_state')
    media_group = [InputMediaPhoto(photo.file_id) for photo in photos]
    await message.answer(f'Название продукта: {data.get("Name_state")}')
    await message.answer('Вот как будет выглядеть ваш пост:')
    await bot.send_media_group(chat_id=message.chat.id, media=media_group)
    await state.finish()
  • Вопрос задан
  • 937 просмотров
Решения вопроса 1
SoreMix
@SoreMix
yellow
Когда приходит медиагруппа, она приходит как несколько ивентов. Если сообщение является частью медиагруппы, то в объекте есть поле 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, либо просто переписать свой аналог. Могу и сюда приложить какое нибудь решение как освобожусь, но вряд ли оно будет отличаться чем-то от этого
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
RimMirK
@RimMirK
Вроде человек. Вроде учусь. Вроде пайтону
сейчас это баг телеграма, надо ждать пока пофиксят. Во всех фреймах тг такое.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы