Как использовать sendChatAction внутри кастомного роутера Aiogram бота?

Из документации известно, что бот может отправить (отобразить) ChatAction-действие ("пишет", "загружает фото" и т.д.) с помощью таких вариантов:
1. result: bool = await bot.send_chat_action(...)
2. result: bool = await bot(SendChatAction(...))
*вебхуки не рассматриваю

Но проблема в том, что мои хендлеры находятся в нескольких файлах и подключены к диспетчеру через роутеры. Естественно, сам объект бота находится в корневом файле. Ниже упрощённый пример для демонстрации проблемы.

Содержимое base_router.py:
import asyncio

from aiogram import Router, types
from aiogram.filters import Command

router = Router()


@router.message(Command("start"))
async def cmd_start(message: types.Message):
    reaction = types.ReactionTypeEmoji(emoji='')
    await message.react([reaction], is_big=True)

    await bot.send_chat_action(message.chat.id, 'typing')  # Не сработает потому что не импортирован бот
    await asyncio.sleep(5)
    await message.reply('Hello, glad to see you!)')


Содержимое main.py:
from aiogram import Dispatcher, Bot
from datetime import datetime
import asyncio

import config as cfg
from handlers import base_router

dp = Dispatcher()
bot = Bot(cfg.TOKEN)
dp.include_routers(base_router.router)


async def main():
    await dp.start_polling(bot)


if __name__ == "__main__":
    try:
        print(f"Program running at {datetime.now().strftime(cfg.dt_format)}")
        asyncio.run(main())
    except KeyboardInterrupt:
        print(f"Program finished at {datetime.now().strftime(cfg.dt_format)}")


Если импортировать бота в файл с роутером, то будет ошибка: в корневом файле роутер пропадёт из видимости. Каким образом мне в обработчике команды, внутри кастомного роутера, использовать send_chat_action(...) ? Как в роутерах использовать конструкцию await bot.method(...)?
  • Вопрос задан
  • 259 просмотров
Решения вопроса 1
febday
@febday
Ну во-первых, bot незачем импортировать, он возвращается в каждый хэндлер как аргумент функции, достаточно исправить функцию на:
async def cmd_start(message: types.Message, bot: Bot):


Во-вторых: bot также находится почти в каждом объекте апдейта (types.Message, types.CallbackQuery и т.п.). Для этого вам нужно вызвать его следующим образом:
await message.bot.send_chat_action(message.chat.id, 'typing')
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы