Appearance
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")
Имитация записи голосового сообщения
Имитация записи видео-сообщения