Как сделать так, чтобы после отправки 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 шт):
Описанный случай - отправка медиагруппы. Сколько тебе прилетит сообщений, ты не знаешь, поэтому ответам в комментариях не верь.
В объекте Message есть идентификатор media_group_id, который совпадает у сообщений из одной группы.
Создай временное хранилище, например set().
В обработчик добавь логику:
- Если уже отвечал на сообщение с таким идентификатором - ничего не делаешь.
- Если ещё не отвечал - добавь идентификатор в хранилище.
Таким образом ответ улетит только 1 раз при получении нескольких сообщений из одной группы.
Если говорить об 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()