Skip to content

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. Замена клавиатур для всех поддерживающих их медиа сообщений ничем не отличается от замены клавиатур в текстовых сообщениях.

Имитация действий бота

Мы уже разбирали имитацию набора текста, но ещё есть:

  • Имитация записи голосового сообщения
  • Имитация записи видео сообщения
  • Имитация отправки видео

Для имитации действий ботом нам необходимо импортировать:

python
from aiogram.utils.chat_action import ChatActionSender

Общий принцип действия следующий. Работая с ChatActionSender, используем асинхронный менеджер with. В ChatActionSender передаем объект бота, чат, в котором бот должен начать имитацию действий, и тип имитации, который тот должен сделать.

Другой вариант – это использование специальных методов из ChatActionSender. В таком случае не будет необходимости передавать параметр action.

  • typing - набор текста
  • upload_video - загрузка видео
  • record_video_note - запись видео-сообщения
  • record_voice - запись голосового сообщения

Далее, если бот может выполнить действие очень быстро (например, отправка сообщения с видео через file_id или отправка чистого текста), можем поставить асинхронную паузу в 2-3 секунды, чтобы пользователь успел увидеть имитацию.

Но бывают случаи, когда необходимо делать отправку крупного медиафайла (видео, например) напрямую с локальной машины. В этом случае данная имитация становится незаменимой. Пользователь не думает, что бот завис, а видит, что сейчас происходит загрузка видео, запись голосового сообщения, запись видео-сообщения и прочее.

Выглядит, на самом деле, интересно.

Давайте добавим имитацию в хендлеры по отправке аудио и видео сообщений.

python
@start_router.message(Command('send_voice'))
async def cmd_start(message: Message, state: FSMContext):
    async with ChatActionSender.record_voice(bot=bot, chat_id=message.from_user.id):
        await asyncio.sleep(3)
        await message.answer_voice(voice=FSInputFile(
            path=os.path.join(all_media_dir, 'krasivyie-snyi-nevinnost-zvezdnyiy-fon-zvukovyie-effektyi-43378.mp3')))

@start_router.message(Command('send_video_note'))
async def cmd_start(message: Message, state: FSMContext):
    async with ChatActionSender.record_video_note(bot=bot, chat_id=message.from_user.id):
        await asyncio.sleep(3)
        await message.answer_video_note(
            video_note="DQACAgIAAxkBAAICKGZspGExG2ZPTe6cxgrHFgl9V8caAALvSgACGKhoS8XEd0xdU4AKNQQ")

Имитация записи голосового сообщения

img.png

Имитация записи видео-сообщения

img_1.png

Contacts: teffal@mail.ru