Webhook – ключевой механизм для мгновенного получения обновлений от Telegram сервера, который заменяет классический метод опроса API. Его настройка требует точного указания URL-адреса, где размещён ваш сервер, и применения валидного SSL-сертификата, обеспечивающего защищённое соединение по HTTPS.
Для установки webhook необходимо подготовить публичный HTTPS-адрес с корректно работающим сервером, способным принимать POST-запросы от Telegram. При этом Telegram ограничивает размер передаваемых данных и накладывает требования к скорости обработки запросов – ответ должен быть отправлен в течение 5 секунд.
Важным этапом является вызов метода setWebhook через API Telegram с передачей параметров: URL, параметра max_connections для ограничения одновременных запросов и опционально списка разрешённых IP-адресов. В этой статье подробно рассмотрим пример успешной конфигурации, а также способы проверки статуса webhook через getWebhookInfo.
Как получить URL для webhook и проверить его доступность
URL для webhook формируется на основе адреса вашего сервера с установленным SSL-сертификатом и пути, по которому бот будет принимать запросы. Формат: https://your_domain_or_ip/путь_к_webhook. Например, если сервер доступен по адресу https://example.com, а путь webhook – /telegram-webhook, итоговый URL будет https://example.com/telegram-webhook.
Важно, чтобы сертификат был валиден и не самоподписан – Telegram требует защищённое HTTPS-соединение. Если сертификат не подходит, webhook не будет работать.
Для регистрации webhook используйте метод Telegram Bot API setWebhook, передав URL в параметре url. Пример запроса через curl:
curl -F "url=https://example.com/telegram-webhook" https://api.telegram.org/bot<TOKEN>/setWebhook
Ответ должен содержать «ok»:true, подтверждающий успешную регистрацию.
Проверить доступность URL можно двумя способами:
- Через браузер или curl: выполните GET-запрос к URL webhook. Сервер должен вернуть статус 200 или 405 (Method Not Allowed), так как Telegram отправляет POST-запросы. Ошибки SSL или тайм-ауты указывают на проблемы с доступностью.
- Метод getWebhookInfo: отправьте запрос к Telegram API:
curl https://api.telegram.org/bot<TOKEN>/getWebhookInfo
В ответе проверьте поле url и статус last_error_message – отсутствие ошибок означает, что Telegram видит ваш webhook.
Если возникают ошибки, проверьте настройки DNS, SSL-сертификата и доступность порта сервера (обычно 443). Убедитесь, что на сервере настроен правильный маршрут для обработки POST-запросов по указанному пути.
Подготовка HTTPS-сервера для приёма запросов от Telegram
Telegram требует, чтобы вебхук-URL был доступен по защищённому протоколу HTTPS и использовал валидный SSL-сертификат. Самоподписанные сертификаты не подходят. Рекомендуется использовать сертификаты от Let’s Encrypt, которые можно получить бесплатно.
Установите Nginx или другой веб-сервер с поддержкой SSL. Пример конфигурации Nginx для проксирования запросов к Telegram-боту:
server { listen 443 ssl; server_name your-domain.com; ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; location / { proxy_pass http://localhost:3000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
Убедитесь, что порт 443 открыт на сервере и не блокируется фаерволом. Проверьте корректность сертификатов с помощью команды:
openssl s_client -connect your-domain.com:443
Путь в proxy_pass должен указывать на локальное приложение, обрабатывающее входящие запросы от Telegram. Если приложение работает на другом порту, укажите его явно.
После настройки убедитесь, что ваш сервер возвращает код 200 OK на POST-запросы от Telegram. Это обязательное условие для успешной регистрации и работы webhook.
Регистрация webhook через Telegram Bot API с помощью метода setWebhook
Для активации webhook необходимо отправить HTTP-запрос на метод setWebhook
Telegram Bot API. Адрес запроса:
https://api.telegram.org/botТОКЕН_БОТА/setWebhook
Параметры передаются методом POST
или GET
. Минимально требуется параметр url
– это HTTPS-адрес, на который Telegram будет пересылать обновления.
url
– обязательный. Пример:https://yourdomain.com/bot/webhook
certificate
– опциональный. Необходим, если используется самоподписанный SSL-сертификат.max_connections
– по умолчанию 40. Рекомендуется указывать не более 100.allowed_updates
– список типов обновлений (например,["message", "callback_query"]
), которые бот будет получать.secret_token
– рекомендуется задавать. Это значение Telegram будет передавать в заголовкеX-Telegram-Bot-Api-Secret-Token
для проверки подлинности запросов.
Пример запроса с помощью curl
:
curl -F "url=https://yourdomain.com/bot/webhook" \
-F "secret_token=ваш_секрет" \
https://api.telegram.org/botТОКЕН_БОТА/setWebhook
Ответ Telegram содержит поле ok
и описание результата. Убедитесь, что сервер принимает только HTTPS и имеет корректный SSL-сертификат, иначе регистрация завершится с ошибкой.
Для проверки текущих параметров webhook используйте метод getWebhookInfo
:
https://api.telegram.org/botТОКЕН_БОТА/getWebhookInfo
Если используется новый endpoint, старый webhook необходимо удалить вызовом setWebhook
с пустым параметром url
.
Настройка SSL-сертификата для защищённого соединения webhook
Telegram требует, чтобы webhook-URL работал по HTTPS с валидным SSL-сертификатом. Сертификат должен быть выдан доверенным центром сертификации (CA) и соответствовать доменному имени, на котором размещён сервер.
- Используйте домен с действующей DNS-записью, указывающей на IP-адрес вашего сервера.
- Убедитесь, что порт
443
открыт для входящих соединений – Telegram использует его по умолчанию для webhook.
Рекомендуется получить сертификат от Let’s Encrypt:
- Установите Certbot:
sudo apt install certbot
(для Debian/Ubuntu). - Запустите команду:
sudo certbot certonly --standalone -d yourdomain.com
- После получения сертификатов путь к полному цепочечному сертификату будет:
/etc/letsencrypt/live/yourdomain.com/fullchain.pem
, а к приватному ключу:/etc/letsencrypt/live/yourdomain.com/privkey.pem
Если вы используете самописный сервер на Python или Node.js, настройте HTTPS через библиотеку, принимающую путь к сертификату и ключу. Пример для Node.js:
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/fullchain.pem')
};
https.createServer(options, (req, res) => {
// обработка запроса Telegram
}).listen(443);
Telegram принимает только сертификаты от доверенных CA. Самоподписанные сертификаты допустимы только при использовании собственного IP и передаче сертификата в методе setWebhook
параметром certificate
в формате PEM.
После настройки HTTPS вызовите метод setWebhook
через Telegram API с указанием вашего URL: https://api.telegram.org/bot<ваш_токен>/setWebhook?url=https://yourdomain.com
Проверка статуса webhook и диагностика ошибок с помощью getWebhookInfo
Для получения технической информации о текущем состоянии webhook вызовите метод getWebhookInfo
через HTTP-запрос к Telegram Bot API:
https://api.telegram.org/bot<ваш_токен>/getWebhookInfo
В ответе вы получите JSON-объект с ключевыми параметрами:
url – текущий URL webhook. Если пустой, webhook не установлен.
has_custom_certificate – true, если используется собственный SSL-сертификат.
pending_update_count – количество обновлений, ожидающих обработки. Если число стабильно высокое – бот не обрабатывает события вовремя.
last_error_date – метка времени последней ошибки. Используйте date -d @
в Linux для расшифровки.
last_error_message – описание ошибки, например: «SSL certificate problem: self signed certificate».
max_connections – количество параллельных соединений, обычно 40 по умолчанию.
Если поле last_error_message
присутствует, устраните причину. Частые ошибки:
– Недоступность URL (проверьте, что порт 443 открыт, сервер работает и принимает HTTPS-запросы).
– Неправильный SSL-сертификат (используйте только сертификаты от доверенных CA или правильно установленные самоподписанные).
– Ошибка 500 на стороне сервера бота (проверьте логи, отладьте код).
После устранения проблемы рекомендуется повторно вызвать getWebhookInfo
и убедиться в отсутствии ошибок и нулевом значении pending_update_count
.
Обработка входящих обновлений (update) на сервере webhook
При срабатывании webhook Telegram отправляет POST-запрос с JSON-телом на указанный вами URL. Обработка обновлений должна быть максимально быстрой – Telegram ждёт ответ не более 10 секунд. Если время ожидания превышено или сервер вернул ошибку, сообщение будет считаться недоставленным.
Для надёжной работы сервиса используйте следующий алгоритм:
- Принимайте запросы только с заголовком
Content-Type: application/json
. - Парсите JSON строго по документации Telegram Bot API: каждый объект update может содержать только одно из полей (
message
,callback_query
и т.д.). - Сохраняйте входящие обновления в очередь (например, Redis, PostgreSQL) и сразу отправляйте HTTP 200, не дожидаясь полной обработки.
- Обрабатывайте очередь в фоне отдельным воркером, избегая логики в теле webhook-обработчика.
Пример минимального обработчика на PHP:
file_put_contents('php://stderr', file_get_contents('php://input'));
http_response_code(200);
Валидация запроса необходима. Telegram не отправляет подписи, но можно ограничить доступ по IP, используя список IP-адресов Telegram:
149.154.160.0/20
91.108.4.0/22
Настройте firewall или используйте nginx с директивой allow
:
location /webhook {
allow 149.154.160.0/20;
allow 91.108.4.0/22;
deny all;
proxy_pass http://localhost:8080;
}
Не логируйте тело запроса в продакшене без маскировки персональных данных. Telegram может передавать имена, телефоны, ID и текст сообщений.
Сервер должен поддерживать HTTPS с валидным сертификатом. Telegram не принимает самоподписанные сертификаты. Используйте Let’s Encrypt или аналогичный CA.
Обновление webhook при изменении URL или SSL-сертификата
При смене домена, IP-адреса или замене SSL-сертификата необходимо немедленно обновить webhook, иначе Telegram перестанет доставлять сообщения боту.
Для удаления старого webhook выполните запрос:
https://api.telegram.org/bot<токен_бота>/deleteWebhook
После успешного удаления настройте новый webhook с учётом изменений. Используйте HTTPS-URL с корректным SSL-сертификатом, выданным доверенным центром сертификации. Telegram не принимает самоподписанные сертификаты.
Пример команды для установки нового webhook:
curl -F "url=https://your-domain.com/bot" https://api.telegram.org/bot<токен_бота>/setWebhook
Если используется самописный сервер, убедитесь, что SSL-сертификат установлен корректно и проходит проверку через openssl:
openssl s_client -connect your-domain.com:443
При использовании Let’s Encrypt сертификат обновляется автоматически, но перезапуск веб-сервера обязателен после каждого обновления.
Проверьте статус webhook после установки:
https://api.telegram.org/bot<токен_бота>/getWebhookInfo
Если поле last_error_message
содержит ошибки, проверьте доступность URL и корректность SSL. При использовании CDN (например, Cloudflare) убедитесь, что SSL-режим установлен в Full (strict).
Отмена webhook и переход на режим polling при необходимости
Для отключения webhook и активации режима polling необходимо выполнить запрос к Telegram API:
https://api.telegram.org/botВАШ_ТОКЕН/deleteWebhook
После успешного выполнения запроса сервер Telegram прекратит отправку обновлений по заданному URL. Ответ должен содержать "ok": true
, что подтверждает деактивацию webhook.
Для перехода на polling, убедитесь, что ваш бот запускается с методом getUpdates
. Пример для библиотеки python-telegram-bot
:
from telegram.ext import Updater
updater = Updater("ВАШ_ТОКЕН")
updater.start_polling()
updater.idle()
Если используется aiogram
:
from aiogram import Bot, Dispatcher, executor
bot = Bot(token="ВАШ_ТОКЕН")
dp = Dispatcher(bot)
executor.start_polling(dp)
Убедитесь, что порт 443, 80 или 88 не занят, чтобы избежать конфликтов, если ранее был задействован webhook. Также проверьте, что сервер не ожидает входящих соединений, иначе polling
не сможет работать корректно.
Важно: режим polling менее устойчив при высоких нагрузках и не предназначен для продакшн-серверов. Используйте его только для локальной отладки или в ограниченных средах.
Вопрос-ответ:
Что такое webhook и зачем он нужен при работе с Telegram ботом?
Webhook — это способ, при котором Telegram отправляет обновления (сообщения, команды и прочие события) на указанный сервер сразу после их получения. Это позволяет боту реагировать на действия пользователей практически мгновенно, без постоянного опроса серверов Telegram (polling). Такой подход снижает нагрузку на сервер и делает отклик более быстрым.
Какие требования к серверу нужно учитывать перед установкой webhook?
Для корректной работы webhook сервер должен иметь публичный IP-адрес и работать через HTTPS. Это значит, что на сервере должен быть установлен SSL-сертификат (например, от Let’s Encrypt). Кроме того, необходимо обеспечить стабильное соединение и корректную обработку POST-запросов на стороне приложения, принимающего сообщения от Telegram.
Как установить webhook для Telegram бота вручную?
Для установки webhook нужно отправить GET-запрос на адрес `https://api.telegram.org/bot<токен>/setWebhook?url=https://<ваш_домен>/<путь>`, где `<токен>` — это токен вашего бота, а `<ваш_домен>/<путь>` — URL, по которому Telegram будет отправлять обновления. Убедитесь, что этот адрес доступен извне и использует защищённое соединение HTTPS. После установки можно проверить статус вебхука через метод `getWebhookInfo`.
Что делать, если Telegram не принимает адрес webhook?
Если Telegram не принимает указанный адрес, в первую очередь нужно проверить наличие действующего SSL-сертификата на сервере. Также важно, чтобы URL был доступен извне и принимал POST-запросы. Нередко причиной проблемы может быть ошибка в коде бота, которая мешает правильно обрабатывать входящие данные. В таких случаях полезно просмотреть логи сервера и убедиться, что бот отвечает HTTP-статусом 200 на запросы Telegram.
Можно ли использовать ngrok для тестирования webhook на локальном компьютере?
Да, можно. Ngrok позволяет создать временный HTTPS-туннель к локальному серверу. Это удобно для разработки и тестирования, когда бот ещё не размещён на реальном хостинге. Достаточно установить ngrok, запустить команду вида `ngrok http 3000` (или другой порт, на котором работает бот), а затем указать полученный HTTPS-адрес при установке webhook.