NetrunНа главную

Что выбрать

Polling или webhook для Telegram-бота: что выбрать

· 6 мин чтения

Коротко

Для большинства небольших Telegram-ботов проще polling: бот сам спрашивает Telegram о новых сообщениях, и ему не нужен ни публичный адрес, ни HTTPS. Webhook устроен наоборот: Telegram сам присылает сообщения на ваш адрес с HTTPS, поэтому бот становится маленьким веб-приложением. Скорость ответа у обоих способов для обычного бота практически одинаковая. Выбирайте webhook, если бот уже живёт внутри сайта или вам нужен именно веб-адрес, а в остальных случаях начинайте с polling.

  • При polling бот вызывает метод getUpdates и ждёт новых сообщений, при webhook Telegram сам отправляет сообщения POST-запросом на адрес бота.
  • Webhook работает только по HTTPS и только на портах 443, 80, 88 или 8443.
  • Пока у бота настроен webhook, метод getUpdates не работает: Telegram отвечает ошибкой 409 Conflict.
  • Если бот недоступен, Telegram хранит новые сообщения до 24 часов при обоих способах.
  • Polling удобнее для отладки: бот запускается на компьютере без публичного адреса и без настройки сертификата.

Первый бот почти всегда пишется на polling, то есть опросе: в конце кода стоит строка вроде start_polling или run_polling, и бот работает. Потом в статьях и чатах встречается слово webhook, его называют «правильным» и «продакшен-способом», и возникает вопрос, не пора ли переделать. Ответ зависит не от моды, а от того, где живёт бот и как вам удобнее его отлаживать.

При polling бот раз за разом спрашивает Telegram: «есть новые сообщения?» — и ждёт ответа. При webhook (вебхук, дословно «веб-крючок») вы один раз сообщаете Telegram адрес бота, и дальше Telegram сам отправляет туда каждое новое сообщение. Ниже — чем способы отличаются на практике и как выбрать.

Polling и webhook для Telegram-бота
КритерийPolling (getUpdates)Webhook (setWebhook)
Кто начинает разговорбот сам спрашивает TelegramTelegram сам приходит к боту
Нужен публичный адрес и HTTPSнет, хватает выхода в интернетда, адрес с HTTPS на порту 443, 80, 88 или 8443
Скорость ответапрактически мгновенно благодаря длинному ожиданиюпрактически мгновенно
Нагрузка, когда сообщений нетпроцесс работает постоянно и держит соединениеприложение просто ждёт входящих запросов
Сложность настройкиодна строка запуска в библиотекевеб-сервер в коде плюс вызов setWebhook с адресом
Если бот выключен или перезапускаетсяпосле запуска заберёт накопленные сообщенияTelegram повторяет доставку, сообщения хранятся до 24 часов
Отладка на компьютерепросто запустить скриптнужен публичный адрес, например туннель
Две копии бота с одним токеномвыбивают друг друга с ошибкой 409сообщения уходят на один адрес из setWebhook
  1. Начните с polling, если бот небольшой#

    Для бота с командами, кнопками и парой сотен пользователей polling полностью достаточен. Он не требует публичного адреса, сертификата и веб-сервера в коде: бот запускается одной строкой и одинаково работает на компьютере и на сервере. Задержки тоже нет: библиотеки используют длинное ожидание, при котором Telegram держит запрос открытым и отвечает, как только приходит сообщение. Единственное требование — процесс бота должен работать непрерывно.

  2. Выберите webhook, если бот живёт внутри веб-приложения#

    Webhook удобен, когда у вас уже есть сайт или API, например на FastAPI, Django или Express, и бот — его часть. Тогда сообщения от Telegram приходят как обычные запросы на один из адресов приложения, и отдельный процесс для бота не нужен. Ещё webhook выбирают, когда сообщений очень много или когда платформа рассчитана именно на веб-приложения. Для webhook нужен адрес с HTTPS на одном из портов, которые принимает Telegram.

  3. Не включайте оба способа сразу#

    Пока у бота задан webhook, Telegram не отдаёт сообщения через getUpdates и отвечает ошибкой 409 Conflict. Поэтому, переходя с webhook обратно на polling, снимите webhook методом deleteWebhook, а переходя на webhook, уберите из кода запуск опроса. Проверить текущее состояние можно методом getWebhookInfo: он покажет адрес и последнюю ошибку доставки, если она была.

  4. Продумайте отладку#

    С polling тестового бота можно запускать прямо на компьютере: никаких адресов и сертификатов. Для webhook локальная отладка сложнее: Telegram должен достучаться до вашей машины, поэтому нужен туннель с публичным адресом или тестовая копия на сервере. Практичное правило для обоих способов: рабочий бот живёт на сервере, а для экспериментов заведите у BotFather отдельного тестового бота со своим токеном.

  5. Поймите, как способ влияет на хостинг#

    Бот на polling — это фоновый процесс без адреса: ему нужно место, где он работает круглосуточно и перезапускается после сбоя. Бот на webhook — веб-приложение: ему нужна публичная ссылка с HTTPS, и он должен быстро отвечать на входящие запросы. Ни в одном из случаев не нужно открывать порты на домашнем роутере или покупать сертификат, если хостинг выдаёт адрес с HTTPS сам.

Polling — это не «устаревший» способ, а самый простой: для большинства небольших ботов его хватает с запасом, и менять его без причины не нужно. Webhook стоит выбирать, когда бот встроен в веб-приложение или вам нужен именно веб-адрес. В Netrun работают оба варианта: бот на polling запускается как фоновый процесс, а боту на webhook нужна ссылка с HTTPS — если платформа её не выдала, нажмите на странице проекта «Мне нужна ссылка» и передайте адрес в setWebhook. На бесплатном тарифе бот работает 3 часа, поэтому для бота, который должен отвечать всегда и сразу, выбирайте Pro при любом способе. Попробовать Netrun.

Частые вопросы

Что быстрее отвечает — polling или webhook?

Для обычного бота разницы практически нет. Библиотеки используют длинное ожидание: запрос к Telegram висит открытым и возвращается сразу, как только приходит сообщение. Webhook выигрывает в скорости только при очень большом потоке сообщений.

Нужен ли свой домен для webhook?

Нет, нужен любой публичный адрес с HTTPS на одном из портов 443, 80, 88 или 8443. Если хостинг сам выдаёт ссылку с HTTPS, покупать домен и сертификат не нужно. Свой домен можно подключить позже, если он нужен для других целей.

Потеряются ли сообщения, пока бот выключен?

Обычно нет: Telegram хранит новые сообщения до 24 часов при любом способе. Бот на polling заберёт их после запуска, а боту на webhook Telegram повторит доставку. Если бот был недоступен дольше суток, старые сообщения пропадут.

Можно ли перейти с polling на webhook без переписывания бота?

Логику ответов переписывать не придётся, меняется только запуск. В aiogram, python-telegram-bot и Telegraf есть встроенный режим webhook: вместо запуска опроса бот поднимает маленький веб-сервер и регистрирует свой адрес через setWebhook. Не забудьте, что приложение должно слушать порт, который ему выдаёт хостинг.

Почему после перехода на polling бот выдаёт ошибку 409?

Скорее всего, у бота остался заданный webhook. Пока он есть, Telegram не отдаёт сообщения через getUpdates. Удалите webhook методом deleteWebhook или включите в библиотеке настройку, которая снимает его при старте.

Можно ли разместить Telegram-бота?

Да. Загрузите код бота и укажите токен от BotFather (его выдаёт сам Telegram при создании бота) — Netrun запустит бота, VPS и ручная настройка не нужны. На бесплатном тарифе бот работает 3 часа, чтобы вы всё проверили; чтобы он работал круглосуточно, подключите тариф Pro.

Что будет с ботом через 3 часа на бесплатном тарифе?

Бот выключится, но код, настройки и секреты останутся на месте — мы ничего не удаляем. Незадолго до выключения мы пришлём предупреждение. Три часа считаются только по работе бота: пока он остановлен, не собрался или упал с ошибкой, время не идёт — можно спокойно чинить код и запускать заново. Подключите тариф Pro, и бот запустится с того же места и будет работать круглосуточно. Новый бот, загруженный после этого, тоже соберётся, но работать не начнёт: бесплатное время считается на аккаунт, а не на каждый проект.

Почему мой сайт иногда засыпает?

На бесплатном тарифе сайты засыпают после простоя и просыпаются за пару секунд при первом запросе. На тарифе Pro проект работает без сна.

Запустите свой проект

Загрузите код, ответьте на пару вопросов — и получите рабочую ссылку. Есть бесплатный тариф

Попробовать Netrun
Все статьи блога