Как включить и отключить вебхук в Telegram: подробное руководство
В этой статье разберем, как правильно включить (setWebhook) и отключить (deleteWebhook) вебхук для Telegram‑бота, какие нюансы учитывать (SSL, IP‑доступ, таймауты, очередь апдейтов), разберем частые ошибки и покажем, как проверить текущий статус (getWebhookInfo). В конце дадим чек‑лист и ссылки на материалы нашего проекта Bothost.
Кратко: что такое вебхук и когда он нужен
- Вебхук: Telegram сам отправляет HTTP‑запросы на ваш URL при каждом апдейте. Требует публичный HTTPS и доступность сервера.
- Polling: ваш бот периодически сам запрашивает апдейты у Telegram. Работает без публичного HTTPS, но менее реактивен и требует фонового процесса.
Как включить вебхук (setWebhook)
Минимальный пример:curl -X POST "https://api.telegram.org/bot<BOT_TOKEN>/setWebhook" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/telegram-webhook"}'curl -X POST "https://api.telegram.org/bot<BOT_TOKEN>/setWebhook" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/telegram-webhook",
"secret_token": "<RANDOM_32_64_CHARS>",
"drop_pending_updates": false,
"max_connections": 40,
"allowed_updates": ["message","callback_query","chat_member","my_chat_member"]
}'secret_token: Telegram пришлет его в заголовкеX-Telegram-Bot-Api-Secret-Token— проверяйте на стороне сервера.drop_pending_updates: еслиtrue, старая очередь апдейтов будет сброшена при установке вебхука.max_connections: до 100, оптимально 20–50 при высокой нагрузке.allowed_updates: ограничьте типы событий для снижения нагрузки.
Проверить статус вебхука
curl "https://api.telegram.org/bot<BOT_TOKEN>/getWebhookInfo"url, has_custom_certificate, pending_update_count, last_error_date, last_error_message, max_connections, ip_address.
Как отключить вебхук (deleteWebhook)
Полностью отключить и вернуться к polling:curl -X POST "https://api.telegram.org/bot<BOT_TOKEN>/deleteWebhook"# Сбросить все накопленные апдейты
curl -X POST "https://api.telegram.org/bot<BOT_TOKEN>/deleteWebhook?drop_pending_updates=true"deleteWebhook ваш процесс на polling (например, getUpdates) снова начнет получать апдейты.
Нюансы и частые проблемы
1) HTTPS и SSL
- Домен обязателен с валидным SSL‑сертификатом (Let’s Encrypt — ок). Самоподписанные не подходят.
- Сертификат должен совпадать с доменом и не быть просроченным.
- Проверяйте цепочку доверия (full chain). Ошибки TLS приводят к
last_error_messageвgetWebhookInfo.
2) Доступность URL и таймаут
- Telegram ограничивает время ответа ~10 секунд. Возвращайте 200 как можно быстрее, тяжелую обработку — в очередь/фоновую задачу.
- URL должен быть доступен из интернета без IP‑фильтров. Если есть WAF/файрвол, разрешите IP Telegram (см. оф. доки, IP‑пулы меняются).
3) Очередь апдейтов и дубликаты
- Большая
pending_update_count= ваш обработчик не успевает. Увеличьтеmax_connections, оптимизируйте код, используйте асинхронную очередь. - При миграции polling → webhook задайте
drop_pending_updates=true, чтобы не получить старые сообщения повторно.
4) Переезд домена/SSL замена
- При смене домена/сертификата сделайте
deleteWebhook, затем новыйsetWebhook. - Проверьте редиректы: URL вебхука должен возвращать 200, а не 301/302 на другой хост без SNI.
5) Заголовки безопасности
- Проверяйте
X-Telegram-Bot-Api-Secret-Tokenпри использованииsecret_token. - Ограничьте метод только на
POST, проверьтеContent-Type: application/json.
6) Ограничения и лимиты
- Учитывайте лимиты Telegram Bot API (RPS). Пулы воркеров/очереди сообщений помогают не упираться в API‑лимиты при массовых рассылках.
7) IPv6 и прокси
- Если сайт доступен по IPv6 — убедитесь, что сервер действительно принимает трафик. Иначе отключите AAAA‑запись, если не используете.
- При использовании Cloudflare/прокси проверьте, что тело запроса не модифицируется и не урезается.
Интеграция с Bothost
На Bothost вы можете быстро разместить бота и настроить вебхук:- Вспомогательная статья: «Настройка авторизации через Telegram» — раздел про webhook.
- Примеры API в проекте:
api/telegram-notifications.php — отправка уведомлений в Telegram.
- telegram-link-bot.php — пример конечной точки для бота.
- Для Git‑автодеплоя используйте
WEBHOOK_SETUP.mdиapi/webhook.php(это про GitHub/GitLab webhooks, не путать с Telegram, но удобно для CI/CD ваших ботов).
- Настраивать
secret_tokenвsetWebhookи сверять его на своей стороне. - Логировать запросы вебхука в отдельный файл (например,
data/webhook.log) с маскированием чувствительных данных. - Отдавать быстрый 200 и уносить бизнес‑логику в очередь.
Частые ошибки и решения
- «Conflict: can't use getUpdates method while webhook is active» — при активном вебхуке
getUpdatesне работает. Решение: сначала отключите вебхук, затем переходите на polling:
bash
curl -X POST "https://api.telegram.org/bot/deleteWebhook?drop_pending_updates=true"
# затем запускайте ваш процесс polling (getUpdates)
`
- «Bad Request: bad webhook: failed to resolve host or invalid URL» — проверьте корректность HTTPS‑URL, наличие публичного DNS A/AAAA.
- «Bad Request: webhook can be set up only on ports 443, 80, 88 or 8443» — используйте один из разрешенных портов.
last_error_message в getWebhookInfo: ошибки TLS/таймаута/сетевого доступа. Проверяйте SSL‑цепочку и логи сервера.
pending_update_count растет — ваш обработчик медленный, увеличьте параллельность и оптимизируйте код.
Вебхук установлен, но бот «молчит» — убедитесь, что ваш обработчик возвращает 200 OK без долгих блокировок.
Чек‑лист перед запуском
- Домен с валидным SSL (Let’s Encrypt/доверенный CA)
- URL вебхука отдает 200 OK (быстрый ответ < 1–2 сек)
- Настроен
secret_token и проверка заголовка
Логи включены и ротация настроена
Очередь/воркеры для тяжелых задач
allowed_updates ограничены до нужных типов
getWebhookInfo показывает корректный URL и pending_update_count близок к 0
Примеры cURL
# Установить вебхук
curl -X POST "https://api.telegram.org/bot<BOT_TOKEN>/setWebhook" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/telegram-webhook"}'
# Проверить статус
curl "https://api.telegram.org/bot<BOT_TOKEN>/getWebhookInfo"
# Отключить вебхук
curl -X POST "https://api.telegram.org/bot<BOT_TOKEN>/deleteWebhook"
# Отключить и сбросить очередь
curl -X POST "https://api.telegram.org/bot<BOT_TOKEN>/deleteWebhook?drop_pending_updates=true"
Если нет cURL: как сделать через браузер
Для простых операций можно использовать адресную строку браузера (метод GET). Замените и на свои значения, при этом обязательно URL‑кодируйте (например, через urlencoder.org).
- Проверить статус вебхука (GET):
https://api.telegram.org/bot
- Установить вебхук (GET‑вариант):
https://api.telegram.org/bot
Пример:
https://api.telegram.org/bot123456:ABC.../setWebhook?url=https%3A%2F%2Fexample.com%2Ftelegram-webhook
- Отключить вебхук (GET):
https://api.telegram.org/bot
- Отключить вебхук и сбросить очередь (GET):
https://api.telegram.org/bot
Важно:
- GET не позволяет передать
secret_token и allowed_updates — для них используйте cURL/HTTP‑клиент с POST и JSON.
Не делитесь URL с токеном — это секрет. Храните его как пароль.
Ссылки
- Документация Telegram Bot API:
https://core.telegram.org/bots/api#setwebhook
Bothost: https://bothost.ru — хостинг и автодеплой ботов
Репозитории и примеры в проекте (см. каталог /blog, /api` в кодовой базе)
5281 просмотров
0 лайков
0 комментариев
Комментарии (0)
Пока нет комментариев. Будьте первым!