Представим такую картину, что к телеграм боту может подключаться очень много людей. Каждый раз на сервере для пользователя будет создаваться свой экземпляр бота. Вопрос — то есть каждый раз он будет устанавливать веб-хук для этого бота? Это неверное поведение. Экземпляров класса бота может сколь угодно много — столько и пользователей, но веб-хук надо установить 1 раз.
async def on_startup() -> None:
"""
Handler for on "startup" event for fastAPI application
- register all bots commands
- register all bots routers
- set webhook url for bot
"""
await register_bot_commands(bot=bot)
await register_bot_routers(dispatcher=dispatcher)
webhook_info: WebhookInfo = await bot.get_webhook_info()
# if webhook url already set - do nothing
if webhook_info.url != WEBHOOK_URL:
abdt_logger.info(
f"[on_startup] service set webhook[{WEBHOOK_URL}] "
f"for bot: {bot.id}"
)
# bot can receive all messages with/without attachments,
# as well as handle inline mod (callback) events
await bot.set_webhook(
url=WEBHOOK_URL,
allowed_updates=["message", "callback_query"],
)
Объяснение
Именно для этого сделаем следующие шаги:
- получим информацию о webhook бота => bot.get_webhook_info
- проверим, есть ли у него уже установленный webhook => if webhook_info.url != WEBHOOK_URL
тем самым исключим необходимость обращаться к Telegram API каждый раз и установим webhook 1 раз для всех запущенных ботов на глобальном уровне.
Я использую aiogram в написании ботов. По мне он самый прогрессивный, ассинхронный и постоянно ведутся обновления над библиотекой, что плюс - аналогичные библиотеки или не обновляются часто или не поддерживают работу с ассинхронным кодом.
Для сравнения, когда только начинал разрабатывать телеграм ботов, версия пакета aiogram была 3.4, затем она очень быстро обновилась до версии 3.7, которая уже была настолько видоизменена, что многие фитчи не работали. На момент написания статьи - это 3.11 версия.
В последних версиях библиотеки метод bot.set_webhook по умолчанию сразу для разрешенных апдейтов не разрешает все действия для приема ботом: Updates (различные сообщения с вложением и без него), события callback_query (это события для нажатия на кнопки клавиатуры). Теперь это нужно прописывать руками => allowed_updates=["message", "callback_query"].