По каким причинам мой Telegram-бот может не работать?

Пишу бота на <b>Webhook</b>, хостинг — <b>Beget</b>. Nginx настроен, HTTPS подключён, в логах ошибок нет, домен вроде бы рабочий, но бот не отвечает (в статусе отключки).
  • 30 апреля 2026 г. 1:01
Ответы на вопрос 1
Кратко — причин много. Ниже — проверки и типичные ошибки по порядку, с командами и советами, что смотреть.

1) Проверить состояние webhook у Telegram
- Выполните:  
  curl "https://api.telegram.org/bot<ТОКЕН>/getWebhookInfo"  
  В ответе смотрите: url, pending_update_count, last_error_date, last_error_message, last_error_description. Эти поля чаще всего дают причину (например, ошибка SSL, 5xx от сервера, таймауты).

2) Доступность вашего URL извне
- Попробуйте с любого внешнего хоста:  
  curl -v -X POST https://ваш.домен/путь_вебхука -d '{"test":1}' -H "Content-Type: application/json"  
  Ожидается HTTP 200 (или ваш обработчик должен вернуть 200). Если запрос не доходит — Telegram тоже не дойдёт.

3) SSL / сертификат
- Telegram требует валидный HTTPS. Проверьте цепочку сертификатов:  
  openssl s_client -connect ваш.домен:443 -servername ваш.домен  
  Убедитесь, что цепочка полная (full chain) и сертификат не самоподписан. Если сертификат самоподписан — при setWebhook нужно передавать публичный сертификат. Если Let's Encrypt — используйте fullchain.pem, не только cert.pem.
- Проверьте поддержку нужных TLS версий (TLS 1.2/1.3).

4) Nginx / проксирование / редиректы
- Убедитесь, что nginx слушает 443 и server_name совпадает с доменом (SNI). Если на IP несколько сайтов — SNI должен срабатывать.
- Проверить, что нет редиректов с HTTPS на HTTP или на страницу логина/защиты (Basic auth, .htaccess). Telegram не пройдёт через форму логина.
- Если вы проксируете запрос дальше (php-fpm, uwsgi), проверьте, что тело запроса и заголовки передаются (proxy_set_header, fastcgi_pass, fastcgi_param и т.д.). Убедитесь, что Content-Type application/json и тело не отбрасывается.
- Посмотрите access.log nginx: приходят ли POST-запросы от Telegram IP? Если нет — проблема на сетевом уровне / DNS / SSL.

5) Время ответа и коды статуса
- Ваш обработчик должен отвечать быстро и возвращать HTTP 200. Если обработка долгая — выполняйте асинхронную обработку и быстро возвращайте 200. Telegram считает попытку неуспешной при таймаутах/ошибках и может отключить webhook после серии неудач.

6) Правильность URL и токена
- setWebhook задаётся на адрес с корректным токеном (или без, в любом случае ваш код должен сверять токен, если вы его используете в URL). Проверьте, что путь в setWebhook совпадает с реальным location в nginx (включая/без трейлинг-слеша).
- Если вы добавили параметр secret_token при setWebhook, Telegram пришлёт заголовок X-Telegram-Bot-Api-Secret-Token — ваш сервер должен проверять этот заголовок, иначе вы будете отклонять запрос.

7) Формат запроса
- Telegram посылает POST с JSON (application/json). Ваш обработчик должен читать raw body и парсить JSON, а не ожидать form-data или x-www-form-urlencoded.

8) Логи — где смотреть
- Nginx access.log и error.log (появляются ли запросы от Telegram IP).
- Логи приложения / php-fpm. Часто в логах веб-хостинга скрыты ошибки PHP — включите display_errors только для отладки или посмотрите error_log PHP.
- Результат getWebhookInfo (last_error_message).

9) DNS / IP / Cloudflare / прокси
- Если домен за Cloudflare и включён режим проксирования (оранжевый cloud), пробуйте выключить проксирование (установить «серый» режим), потому что Cloudflare может мешать корректной передаче SNI/сертификата или блокировать Telegram. Аналогично — другие CDN/WAF могут блокировать.
- Убедитесь, что A-запись указывает на правильный IP.

10) Хостинг-специфика (Beget)
- На основном shared-хостинге возможно особенности: проверьте у поддержки, нет ли блокировок входящих соединений с Telegram IP, открыты ли порты 443 и т.д.
- Убедитесь, что php-fpm/nginx действительно запущены и привязаны к вашему сайту на Beget (иногда конфигурация в панели отличается от фактической).

11) Тестирование обходных путей
- Временно переключиться на getUpdates (long polling) — это проверит логику бота независимо от webhook. Если long polling работает — проблема в вебхуке/сервере.
- Можно временно поднять ngrok / другой публичный туннель и задать webhook на его URL — если с ним бот работает, значит проблема на стороне вашего хостинга/сертификата/nginx.

12) Полезные команды
- getWebhookInfo: curl "https://api.telegram.org/bot<TOKEN>/getWebhookInfo"
- setWebhook: curl -F "url=https://ваш.домен/путь" "https://api.telegram.org/bot<TOKEN>/setWebhook"
- тест URL: curl -v -X POST https://ваш.домен/путь -H "Content-Type: application/json" -d '{"test":1}'
- проверить SSL: openssl s_client -connect ваш.домен:443 -servername ваш.домен

Короткий чеклист (что проверить в первую очередь)
- Выполнить getWebhookInfo => посмотреть last_error_message.
- Посмотреть nginx access.log — приходят ли запросы.
- Протестировать URL внешним curl.
- Проверить SSL-цепочку (full chain), SNI, Cloudflare/прокси.
- Убедиться, что endpoint принимает POST JSON и быстро возвращает 200.
- Проверить, правильно ли вы выполняли setWebhook (url совпадает).

Если хотите, пришлите:
- вывод getWebhookInfo (замаскируйте токен),
- вывод curl -v к вашему URL,
- фрагмент nginx-конфига для этого сайта (server{} и location для пути),
и я подскажу более точно.
Похожие вопросы