Развертывание Telegram-бота на сервере: вебхуки против поллинга

Вы разработали Telegram-бота. Он работает на вашем компьютере. Но как только вы закрываете терминал - бот исчезает. Это нормально для тестирования. Но не для реального использования. Чтобы бот работал 24/7, его нужно развернуть на сервере. И тут возникает главный вопрос: вебхуки или поллинг? Оба метода доставляют сообщения от Telegram к вашему боту. Но один из них - намного надежнее, дешевле и быстрее. Разберемся, какой именно.

Что такое вебхуки и поллинг?

Представьте, что Telegram - это почтальон. Он приносит вам сообщения от пользователей. Как он их доставит?

Поллинг - это когда вы сами ходите к почтальону каждые 5 секунд и спрашиваете: «Есть ли мне письма?». Вы проверяете сервер Telegram, запрашивая новые сообщения. Это как постоянно нажимать кнопку «Обновить» в почтовом ящике.

Вебхуки - это когда почтальон сам приходит к вам с письмом, как только оно появляется. Telegram отправляет данные напрямую на ваш сервер по указанному URL. Никаких запросов с вашей стороны - только когда есть новость.

Оба метода работают с Telegram Bot API. Но их поведение и требования кардинально разные.

Как работает поллинг?

Поллинг - самый простой способ начать. Вы используете метод getUpdates из Telegram Bot API. Ваш бот периодически (каждые 1-5 секунд) отправляет запрос на адрес https://api.telegram.org/bot/getUpdates. Если есть новые сообщения - 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 поллинг

Вот что реально важно, когда вы выбираете между ними:

Сравнение вебхуков и поллинга для Telegram-ботов
Критерий Вебхуки Поллинг
Задержка доставки 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:

  1. Установите Python 3.12 и pip
  2. Установите библиотеку python-telegram-bot или pyTelegramBotAPI
  3. Купите домен (например, через Namecheap) и настройте DNS на IP вашего сервера
  4. Установите Nginx и Certbot для получения бесплатного SSL-сертификата
  5. Настройте Nginx как прокси для вашего Python-приложения (например, через Gunicorn)
  6. Запустите бота как системный сервис: sudo systemctl enable bot.service
  7. Вызовите bot.set_webhook(url='https://yourdomain.com/webhook')

После этого ваш бот будет работать даже если вы выключите компьютер. Сервер продолжит получать сообщения.

Когда поллинг всё ещё хорош?

Несмотря на все преимущества вебхуков, поллинг не умер. Он живёт в трёх случаях:

  • Вы разрабатываете бота и не хотите тратить время на настройку сервера
  • У вас нет домена или вы не хотите платить за хостинг
  • Бот работает на Raspberry Pi или старом устройстве, которое не может стабильно работать 24/7

Если вы используете поллинг, включите параметр timeout=10 и allowed_updates=["message"]. Это снижает нагрузку и исключает ненужные обновления (например, callback-кнопки, если вы их не обрабатываете).

Сравнение: мерцающая лампочка 'Поллинг' и стабильный световой луч 'Вебхук', проходящий через защищенный HTTPS-туннель.

Что происходит, если сервер упадёт?

С вебхуками - 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/getWebhookInfo. Если в ответе стоит "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. Но только если они надёжны. Выбирайте вебхуки - и ваш бот будет работать, даже когда вы спите.