Как получить доступ к объекту bot из импортируемого модуля

Просьба помочь в следующем вопросе. После запуска телеграм-бота скрипт на Python начинает выполнять ряд операций. В какой-то момент скрипт должен отправить в чат телеграма короткое сообщение о текущем состоянии своей работы. Для отправки можно использовать метод bot.send_message(chat_id, text), но в данном случае объект bot создается внутри функции и никак не пойму как к нему получить доступ из другого импортируемого модуля.

import asyncio
from aiogram import Bot, Dispatcher
from config import TOKEN
from app.handlers import router
from app.database.models import async_main

async def main():
  await async_main()
  
  bot = Bot(token=TOKEN)
  dp = Dispatcher()
  dp.include_router(router)
  
  await dp.start_polling(bot)

if __name__ == "__main__":
  try:
    asyncio.run(main())
  except KeyboardInterrupt:
    print("Exit")
  except Exception as e:
    print("An error occurred:", str(e))

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

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

Если handlers у вас находятся в отдельном модуле и вызываются через router, то запись bot.send_message(chat_id, text) неверна.

Правильно так:

@router.message(CommandStart) # обрабатывает только команду старт
async def cmd_start(message: Message):
    await message.answer('text')

И вот main.py для запуска бота (импорты добавьте сами):

async def main():
  # удалил это await async_main()

  bot = Bot(token=TOKEN)
  dp = Dispatcher()
  dp.include_router(router)
  
  await dp.start_polling(bot)

if __name__ == "__main__":
  try:
    asyncio.run(main())
  except KeyboardInterrupt:
    print("Exit")
  except Exception as e:
    print("An error occurred:", str(e))
→ Ссылка
Автор решения: Сергей

Просто в аргументы функции добавь bot и наследуй его от Bot

@router.message()
async def foo(message: Message, bot: Bot):
    await bot.send_message(...)
→ Ссылка