Вхід Реєстрація
Реклама
Ваше рекламне місце
Забронюйте цей слот без конкуренції на обраний період.
Купити рекламу →
Логотип телеграм спільноти - about aiogram
Додано 14 лип 2024 🌐 UK

about aiogram

@about_aiogram
Кількість підписників: 190
Фото: 2
Відео: 1
Посилання: 27
Опис:
✏️ Про розробку телеграм ботів з використанням aiogram та інших бібліотек і технологій 🔍 Навігатор (inline mode) - @aiotipbot 🙃 Канал ведуть @Shaonis + @wakaree #aiogram #bots #python
Джерело

about aiogram | Chat Actions #цікавеІнколи може знадобитися виконати тривалу задачу, н...

Логотип телеграм спільноти - about aiogram about aiogram @about_aiogram
874 Охват/переглядів 2023-11-28 21:56 Повідомлення №31
💬 Chat Actions #цікаве

Інколи може знадобитися виконати тривалу задачу, наприклад, надіслати файл великого розміру або дочекатися відповіді від API, щоб надіслати респонс користувачу. Щоб під час її виконання бот здавався більш "живим", а не просто наче підвисав у користувача — хорошою ідеєю буде надсилати "дію в чаті".

👀 Що ж це таке?

Нам відомо, що коли юзер щось друкує, надсилає фото тощо — ми бачимо відповідний статус під його іменем. Це дає зрозуміти, що співрозмовник не просто проігнорував твоє повідомлення, а збирається відповісти.
Так само і з ботом — щоб показати користувачу, що на його стороні щось відбувається, ми використовуєм аналогічний метод sendChatAction. Даний метод буде відображати вказаний розробником статус до п'яти секунд.

🤔 А якщо на виконання задачі мені потрібно більше, ніж п'ять секунд?

Це також передбачено фреймворком. Він забезпечує утиліту ChatActionSender.
Простий приклад:
@router.message(Command("generate_photo"))
async def generate_photo(message: Message, bot: Bot) -> Any:
async with ChatActionSender.upload_photo(bot=bot, chat_id=message.chat.id):
# Do something for a long time to get result
result = await generate_photo(...)
await message.answer_photo(photo=result)


⚒️ Є також спосіб забезпечити використовування chat action у всіх обробниках.


Спочатку потрібно зареєструвати ChatActionMiddleware (що таке мідлварі?) на подію message:
<router або dispatcher>.message.middleware(ChatActionMiddleware())

Тепер замість створення ChatActionSender у обробникуgenerate_photo ми можемо повісити мітку на обробник:
@router.message(Command("generate_photo"))
@flags.chat_action(ChatAction. UPLOAD_PHOTO)
async def generate_photo(message: Message) -> Any:
# Do something for a long time to get result
result = await generate_photo(...)
await message.answer_photo(photo=result)

За потребою можна змінювати й конфігурацію ChatActionSender, а не тільки тип дії, що надсилаємо:
@router.message(Command("generate_photo"))
@flags.chat_action(initial_sleep=2, action=ChatAction. UPLOAD_PHOTO, interval=3)
async def generate_photo(message: Message) -> Any:
# Do something for a long time to get result
result = await generate_photo(...)
await message.answer_photo(photo=result)

📚 Не полінися завітати в документацію!