Botxona

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 минут.