Что выбрать
Polling или webhook для Telegram-бота: что выбрать
Коротко
Для большинства небольших 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 (getUpdates) | Webhook (setWebhook) |
|---|---|---|
| Кто начинает разговор | бот сам спрашивает Telegram | Telegram сам приходит к боту |
| Нужен публичный адрес и HTTPS | нет, хватает выхода в интернет | да, адрес с HTTPS на порту 443, 80, 88 или 8443 |
| Скорость ответа | практически мгновенно благодаря длинному ожиданию | практически мгновенно |
| Нагрузка, когда сообщений нет | процесс работает постоянно и держит соединение | приложение просто ждёт входящих запросов |
| Сложность настройки | одна строка запуска в библиотеке | веб-сервер в коде плюс вызов setWebhook с адресом |
| Если бот выключен или перезапускается | после запуска заберёт накопленные сообщения | Telegram повторяет доставку, сообщения хранятся до 24 часов |
| Отладка на компьютере | просто запустить скрипт | нужен публичный адрес, например туннель |
| Две копии бота с одним токеном | выбивают друг друга с ошибкой 409 | сообщения уходят на один адрес из setWebhook |
Начните с polling, если бот небольшой#
Для бота с командами, кнопками и парой сотен пользователей polling полностью достаточен. Он не требует публичного адреса, сертификата и веб-сервера в коде: бот запускается одной строкой и одинаково работает на компьютере и на сервере. Задержки тоже нет: библиотеки используют длинное ожидание, при котором Telegram держит запрос открытым и отвечает, как только приходит сообщение. Единственное требование — процесс бота должен работать непрерывно.
Выберите webhook, если бот живёт внутри веб-приложения#
Webhook удобен, когда у вас уже есть сайт или API, например на FastAPI, Django или Express, и бот — его часть. Тогда сообщения от Telegram приходят как обычные запросы на один из адресов приложения, и отдельный процесс для бота не нужен. Ещё webhook выбирают, когда сообщений очень много или когда платформа рассчитана именно на веб-приложения. Для webhook нужен адрес с HTTPS на одном из портов, которые принимает Telegram.
Не включайте оба способа сразу#
Пока у бота задан webhook, Telegram не отдаёт сообщения через getUpdates и отвечает ошибкой 409 Conflict. Поэтому, переходя с webhook обратно на polling, снимите webhook методом deleteWebhook, а переходя на webhook, уберите из кода запуск опроса. Проверить текущее состояние можно методом getWebhookInfo: он покажет адрес и последнюю ошибку доставки, если она была.
Продумайте отладку#
С polling тестового бота можно запускать прямо на компьютере: никаких адресов и сертификатов. Для webhook локальная отладка сложнее: Telegram должен достучаться до вашей машины, поэтому нужен туннель с публичным адресом или тестовая копия на сервере. Практичное правило для обоих способов: рабочий бот живёт на сервере, а для экспериментов заведите у BotFather отдельного тестового бота со своим токеном.
Поймите, как способ влияет на хостинг#
Бот на 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 проект работает без сна.