Webhook или long polling? Как работает Botxona
Telegram-боты могут получать обновления (сообщения, нажатия кнопок) двумя способами: через webhook (Telegram сам отправляет их на ваш сервер) или через long polling (бот сам постоянно опрашивает Telegram, getUpdates). Botxona выбрала второй вариант — long polling, — и мы объясним почему.
Почему Botxona использует long polling
Botxona рассчитана на работу тысяч ботов на одной инфраструктуре, на недорогих серверах. Для этого каждый бот работает по модели scale-to-zero — то есть при неактивности полностью останавливается (подробнее). В режиме webhook бот уже должен работать в момент, когда Telegram отправляет сообщение на сервер; если бот остановлен, Telegram может потерять сообщение или израсходовать повторные попытки.
В режиме long polling постоянно работает прокси Botxona на уровне платформы (он не засыпает) и ставит каждое обновление от Telegram в очередь; как только бот просыпается, он забирает накопившиеся сообщения у прокси. Это гарантирует, что ни одно обновление не потеряется (доставка at-least-once) и порядок не нарушится, даже если бот временно спит.
Как это влияет на ваш код
Ваш код не должен вызывать setWebhook — Botxona его не использует, и если ваш код (например, перенесённый с другого хостинга) ранее установил webhook, Telegram продолжит пытаться отправлять сообщения на старый адрес, который больше не работает. Решение — один раз вызвать deleteWebhook при запуске (это безвредно, даже если webhook не был установлен):
await bot.delete_webhook(drop_pending_updates=False)
await bot.telegram.deleteWebhook()
В обычной ситуации, если используются стандартные методы вроде start_polling() / run_polling() / bot.launch() (aiogram, python-telegram-bot, grammY, Telegraf), никаких дополнительных настроек не нужно — они уже основаны на getUpdates.
Как работает прокси (для любопытных)
Когда ваш бот вызывает getUpdates, запрос (даже если в коде ничего не настроено) автоматически уходит на node-прокси Botxona. Прокси отдаёт ответ не из Telegram, а из своего внутреннего буфера — так бот никогда не получает устаревших или повторных обновлений, а подключение в каждый момент возможно только из одного места (второе подключение получает ошибку 409).
Если появилась ошибка «409 Conflict»
Это значит, что к одному токену пытаются подключиться одновременно из двух мест (например, с вашего компьютера и с Botxona). Бот должен работать только в одном месте — остановите лишний экземпляр. Подробнее: Ошибки и решения.
Следующий шаг
Загрузите своего бота: Первый бот за 10 минут.