Как получить доступ к объекту 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 шт):
Если 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(...)