Aiogram Есть ли возможность вывода текста ботом через симуляцию печатания человеком?

Чуть более нормальная формулировка: Нужно, что бы у пользователя сверху появлялась надпись о том, что бот печатает, а через какое-то время (секунды 3 например) всё тому же пользователю приходило сообщение. Такое есть в aiogram ? Или можно это как-то другим способом реализовать, но что-бы главной библиотекой оставался aiogram ?


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

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

Да, это реализуется с помощью метода API sendChatAction. В aiogram выглядеть это будет так:

import asyncio
from aiogram.types import ChatActions

...

await bot.send_chat_action(message.chat.id, ChatActions.TYPING)
await asyncio.sleep(3)
await bot.send_message(message.chat.id, "Test message")
→ Ссылка
Автор решения: Developer Tony

Да, это реализуется, но для версии aiogram 3 и выше выглядеть это будет так ?

await bot.send_chat_action(chat_id=msg.from_user.id, action="typing")
→ Ссылка
Автор решения: Konard

Если нужно чтобы это было дольше 5 секунд, то нужно делать вот так:

async def keep_typing_while(chat_id, func):
    cancel = { 'cancel': False }

    async def keep_typing():
        while not cancel['cancel']:
            await bot.send_chat_action(chat_id, 'typing')
            await asyncio.sleep(5)

    async def executor():
        await func()
        cancel['cancel'] = True

    await asyncio.gather(
        keep_typing(),
        executor(),
    )

А вызывать вот так:

answer = {}

async def openai_caller():
    local_answer = await get_openai_completion(user_context.get_messages())
    answer['role'] = local_answer['role']
    answer['content'] = local_answer['content']

await keep_typing_while(message.chat.id, openai_caller)
→ Ссылка