Вы разработали Telegram-бота. Он работает на вашем компьютере. Но как только вы закрываете терминал - бот исчезает. Это нормально для тестирования. Но не для реального использования. Чтобы бот работал 24/7, его нужно развернуть на сервере. И тут возникает главный вопрос: вебхуки или поллинг? Оба метода доставляют сообщения от Telegram к вашему боту. Но один из них - намного надежнее, дешевле и быстрее. Разберемся, какой именно.
Что такое вебхуки и поллинг?
Представьте, что Telegram - это почтальон. Он приносит вам сообщения от пользователей. Как он их доставит?
Поллинг - это когда вы сами ходите к почтальону каждые 5 секунд и спрашиваете: «Есть ли мне письма?». Вы проверяете сервер Telegram, запрашивая новые сообщения. Это как постоянно нажимать кнопку «Обновить» в почтовом ящике.
Вебхуки - это когда почтальон сам приходит к вам с письмом, как только оно появляется. Telegram отправляет данные напрямую на ваш сервер по указанному URL. Никаких запросов с вашей стороны - только когда есть новость.
Оба метода работают с Telegram Bot API. Но их поведение и требования кардинально разные.
Как работает поллинг?
Поллинг - самый простой способ начать. Вы используете метод getUpdates из Telegram Bot API. Ваш бот периодически (каждые 1-5 секунд) отправляет запрос на адрес https://api.telegram.org/bot. Если есть новые сообщения - Telegram отвечает с данными. Если нет - возвращает пустой ответ.
Это подходит для:
- Маленьких ботов с 10-50 пользователями
- Тестирования на локальной машине
- Разработчиков, которые не хотят настраивать сервер
Но есть минусы. Каждый запрос - это нагрузка. Даже если ничего не происходит, вы делаете 12 запросов в минуту. За день - 17 280 запросов. Telegram позволяет до 30 запросов в секунду на бота, так что вы не сломаете систему. Но вы тратите ресурсы сервера и трафик. И если ваш сервер упадет на 10 секунд - вы пропустите сообщения. Telegram хранит их только 24 часа, но только если вы не пропустили более 100 обновлений подряд.
Поллинг - это как слушать радио в режиме «постоянного переключения каналов». Вы не знаете, когда включится ваша любимая песня. Придется ждать.
Как работают вебхуки?
Вебхуки - это обратная связь. Вы говорите Telegram: «Отправляй все новые сообщения сюда: https://yourdomain.com/webhook». Telegram отправляет POST-запрос с JSON-данными сразу, как только пользователь пишет боту.
Вот как это выглядит в коде (Python + Flask):
from flask import Flask, request
import telebot
bot = telebot.TeleBot('YOUR_TOKEN')
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
json_str = request.get_data(as_text=True)
update = telebot.types.Update.de_json(json_str)
bot.process_new_updates([update])
return 'OK', 200
bot.set_webhook(url='https://yourdomain.com/webhook')
Теперь Telegram сам звонит вашему серверу. Нет постоянных запросов. Нет задержек. Ответ приходит за 200-500 миллисекунд.
Вебхуки требуют:
- Домен с HTTPS-сертификатом (Telegram не принимает HTTP)
- Стабильный сервер, который не падает
- Правильная настройка firewall и портов
Но это разовая настройка. После этого бот работает, как часы.
Сравнение: вебхуки vs поллинг
Вот что реально важно, когда вы выбираете между ними:
| Критерий | Вебхуки | Поллинг |
|---|---|---|
| Задержка доставки | 200-500 мс | 1-5 секунд (настройка интервала) |
| Нагрузка на сервер | Низкая (только при входящих сообщениях) | Высокая (постоянные запросы) |
| Требуется HTTPS | Да, обязательно | Нет |
| Надежность | Высокая (если сервер стабилен) | Средняя (пропускает сообщения при падении) |
| Сложность настройки | Высокая (сервер, домен, SSL) | Низкая (работает даже на Raspberry Pi) |
| Подходит для | Ботов с 100+ пользователями, бизнес-приложения | Маленькие боты, тесты, личные проекты |
Если вы запускаете бота для магазина, который принимает заказы - вебхуки. Если вы делаете бота для напоминаний о погоде для себя и двух друзей - поллинг.
Почему Telegram требует HTTPS для вебхуков?
Telegram - это мессенджер с миллиардами пользователей. Он не может позволить себе, чтобы кто-то перехватил сообщения, отправленные вашему боту. HTTPS шифрует все данные между Telegram и вашим сервером. Без SSL-сертификата - вебхук не сработает.
Это значит, что вы не можете использовать вебхуки на бесплатных хостингах вроде PythonAnywhere или Glitch, если они не предоставляют HTTPS. Но есть простое решение: ngrok. Это инструмент, который создает временный HTTPS-адрес, который перенаправляет трафик на ваш локальный сервер. Отлично подходит для тестирования. Но не для продакшена. Для продакшена нужен настоящий домен и SSL-сертификат от Let’s Encrypt - он бесплатный и автоматически обновляется.
Как настроить вебхук на реальном сервере?
Вот пошаговая инструкция для Ubuntu 22.04:
- Установите Python 3.12 и pip
- Установите библиотеку
python-telegram-botилиpyTelegramBotAPI - Купите домен (например, через Namecheap) и настройте DNS на IP вашего сервера
- Установите Nginx и Certbot для получения бесплатного SSL-сертификата
- Настройте Nginx как прокси для вашего Python-приложения (например, через Gunicorn)
- Запустите бота как системный сервис:
sudo systemctl enable bot.service - Вызовите
bot.set_webhook(url='https://yourdomain.com/webhook')
После этого ваш бот будет работать даже если вы выключите компьютер. Сервер продолжит получать сообщения.
Когда поллинг всё ещё хорош?
Несмотря на все преимущества вебхуков, поллинг не умер. Он живёт в трёх случаях:
- Вы разрабатываете бота и не хотите тратить время на настройку сервера
- У вас нет домена или вы не хотите платить за хостинг
- Бот работает на Raspberry Pi или старом устройстве, которое не может стабильно работать 24/7
Если вы используете поллинг, включите параметр timeout=10 и allowed_updates=["message"]. Это снижает нагрузку и исключает ненужные обновления (например, callback-кнопки, если вы их не обрабатываете).
Что происходит, если сервер упадёт?
С вебхуками - Telegram отправляет сообщение, но ваш сервер не отвечает. Он получает HTTP 500 или таймаут. Telegram попытается отправить сообщение ещё 3 раза с интервалом в 1-5 секунд. Если всё равно не получится - сообщение будет потеряно.
С поллингом - если сервер упал на 10 минут, он пропустит 120-600 запросов. Но как только он включится - он получит все сообщения, которые Telegram хранил за это время (до 100 обновлений). После этого он начнёт работать с новыми.
Вывод: вебхуки требуют надёжности. Поллинг - терпим к сбоям. Но если вы хотите, чтобы бот работал как часы - вебхуки единственный правильный выбор.
Какой метод выбрать?
Если вы:
- Делаете бота для бизнеса, с автоматизацией, заказами, оплатой - вебхуки
- Создаёте бота для личного использования, с небольшим числом пользователей - поллинг
- Планируете масштабироваться до 1000+ пользователей - вебхуки
- Не знаете, с чего начать - начните с поллинга, потом перейдите на вебхуки
Большинство успешных Telegram-ботов в России и СНГ используют вебхуки. Instagram, Tinkoff, Сбер - все они используют вебхуки. Почему? Потому что они не могут позволить себе задержку в 5 секунд при ответе на запрос клиента.
Часто задаваемые вопросы
Можно ли использовать вебхуки без домена?
Нет, Telegram требует HTTPS. Но для тестирования можно использовать ngrok - он создаёт временный HTTPS-адрес. Например: https://abc123.ngrok.io/webhook. Это подходит для разработки, но не для продакшена. Для постоянной работы нужен настоящий домен и SSL-сертификат.
Сколько стоит развернуть бота на сервере?
Минимальная стоимость - около $3 в месяц. Это VPS на DigitalOcean, Hetzner или AWS Lightsail. Там хватит 1 ГБ ОЗУ и 25 ГБ диска. Вы можете разместить там несколько ботов. Домен стоит ещё $10-15 в год. SSL-сертификат - бесплатно через Certbot. Итого - меньше $5 в месяц.
Что делать, если бот перестал отвечать?
Сначала проверьте логи: journalctl -u bot.service -f. Убедитесь, что сервер запущен и слушает порт. Проверьте, что вебхук установлен: https://api.telegram.org/bot. Если в ответе стоит "last_error_message" - там будет причина. Часто это SSL-ошибка или неправильный URL.
Можно ли использовать оба метода одновременно?
Нет. Telegram позволяет установить только один метод: либо вебхук, либо поллинг. Если вы вызываете setWebhook() - поллинг автоматически отключается. Если вы не вызываете setWebhook() - бот работает в режиме поллинга. Выбор - только один.
Почему мой вебхук не работает, хотя всё настроено?
Самая частая причина - SSL-сертификат. Telegram не принимает самоподписанные сертификаты. Убедитесь, что вы используете сертификат от Let’s Encrypt, DigiCert или другого доверенного центра. Проверить можно через SSL Labs. Также проверьте, что порт 443 открыт в фаерволе. И что ваш бот не блокирует POST-запросы от Telegram.
Что делать дальше?
Если вы только начинаете - начните с поллинга. Сделайте бота, протестируйте его. Когда он будет работать стабильно - перейдите на вебхуки. Это не сложнее, чем настроить сайт на WordPress. Только вместо плагинов - код на Python, Node.js или Go.
Telegram - это мощная платформа. Боты там работают быстрее, чем в WhatsApp или Viber. Но только если они надёжны. Выбирайте вебхуки - и ваш бот будет работать, даже когда вы спите.