Как сделать так, чтобы после отправки 3 фотографий выводилось только 1 сообщение?

Допустим пользователь отправляет 3 фотографии одним сообщением, и нужно сделать так, чтобы после 3 json выводилось только 1 сообщение. Мне в голове не укладывается, за что нужно зацепиться, чтобы понять - когда пришло последнее сообщение.

Когда отправляются 3 фото, то приходит 3 json, и вот после 3 json и нужно отправить сообщение пользователю, а вообще заранее неизвестно, сколько отправится фото, может 2, а может и 5. Я написал небольшой код, но в моем случае он либо выведет 3 сообщения bot.send_message(message.chat.id, 'Описание') либо не выведет ничего, если поставить в моем коде return. Нужно примерно похожее на message[-1], но это не работает. Подскажите, как такое реализовать?

Пример кода:

@bot.message_handler(content_types=['photo', 'video'])  
def second(message):    
    specification = message.text
    if message.media_group_id:
        idphoto = message.photo[0].file_id
        conn, cursor = connecting()
        cursor.execute("INSERT INTO orders VALUES (?,?)", (message.chat.id, idphoto))
        conn.commit()
        #return # либо будет выводить 3 сообщения ниже, либо ни одного
    bot.send_message(message.chat.id, 'Описание')

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

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

Описанный случай - отправка медиагруппы. Сколько тебе прилетит сообщений, ты не знаешь, поэтому ответам в комментариях не верь.

В объекте Message есть идентификатор media_group_id, который совпадает у сообщений из одной группы.

Создай временное хранилище, например set().

В обработчик добавь логику:

  1. Если уже отвечал на сообщение с таким идентификатором - ничего не делаешь.
  2. Если ещё не отвечал - добавь идентификатор в хранилище.

Таким образом ответ улетит только 1 раз при получении нескольких сообщений из одной группы.

→ Ссылка
Автор решения: DeNRuDi

Если говорить об aiogram, то есть гораздо лучшее и элегантное решение, как отправить только 1 сообщение, если приходят 2 и больше изображений (до 10) от пользователя за один раз.

Во-первых: не нужно будет создавать лишнее хранилище - fsm от aiogram и так уже его предоставляет

Во-вторых: не нужно делать проверку по media_group_id, для каждого юзера выделяется собственный словарь, куда можно записать идентификаторы изображений. Итого, пример кода:

class MyState(StatesGroup):
    brand = State()
    model = State()


async def start_state(message: types.Message):
    await bot.send_message(message.chat.id, "Прикрепите до 10 изображений")
    await MyState.brand.set()


@dp.message_handler(content_types=ContentType.PHOTO, state=MyState.brand)
async def my_brand(message: types.Message, state: FSMContext):
    if not await state.get_data():
        await state.update_data(photo=[message.photo[-1].file_id])
        await bot.send_message(message.chat.id, "Укажите название")
        await MyState.model.set()
    else:
        my_list = await state.get_data()
        photos = my_list.get("photo")
        photos.append(message.photo[-1].file_id)
        await state.update_data(photo=photos)


@dp.message_handler(state=MyState.model)
async def my_model(message, state: FSMContext):
    print(await state.get_data()) # вот здесь и будут находиться все фото
    # которые отправил юзер
    await state.finish()

→ Ссылка