Откройте BotFather и проверьте, что токен актуален и вы не делали недавно /revoke (отзыв токена). Сверьте /setcommands и нужный scope (область: по умолчанию/для групп/для лички) с тем, что зашито в коде. Убедитесь, что /setprivacy соответствует сценарию: Enabled для команд или Disabled, если нужно читать обычные сообщения. Несоответствие токена/команд/локалей часто даёт «тишину» без ошибок.
Когда токен, команды, scope и privacy приведены в порядок, проверьте конверсию на малыx волнах реального трафика: аккуратная накрутка подписчиков тг небольшими партиями поможет быстро замерить отклик на команды, p95 ответа и долю целевых действий. Подавайте равномерно 30–60 минут, сравните метрики до и после и зафиксируйте безопасный темп.
Определите один способ приёма событий: либо webhook (веб-хук), либо long polling (опрос). Два канала одновременно дают 409 Conflict и дубли. Для опроса остановите веб-хук через deleteWebhook?drop_pending_updates=true, для веб-хука остановите поллер. Это базовая проверка, которая экономит часы дебага.
Выполните getWebhookInfo и посмотрите поля url, last_error_message, max_connections. Если есть TLS/timeout/wrong response, лечите сеть и обработчик. Ваш хук должен возвращать 200 OK быстро (лучше до 2 секунд, максимум 10 секунд) и без редиректов. После фикса снимите веб-хук с drop_pending_updates и зарегистрируйте заново.
Проверьте, что бот не заблокирован пользователем и имеет право «писать» в нужной группе/канале. В группах с включённым Privacy Mode команды вызывают формой /cmd@YourBot, иначе бот их не увидит. Для каналов бот должен быть админом, иначе публикации не пройдут. Это простые причины «немоты», которые правятся за минуты.
Отправьте /start в личку и тестовую команду в чистую группу без ограничений. Включите расширенный лог апдейтов: update_id, chat_id, type, handler, duration_ms, reply_status. Если в логах пусто – проблема в доставке апдейтов, если есть – в логике/правах. Такой тест отделяет «сеть/настройки» от «кода» за пару минут.
Отозванный токен, неверный scope команд или несоответствие локалей ломают автодополнение и триггеры. Всегда обновляйте токен в переменных окружения и перезапускайте воркеры после /revoke. Храните команды в репозитории и заливайте их автоматически на релизе. Это снижает риск «тихих» отказов.
Два канала одновременно, редиректы, неверный сертификат или медленный ответ блокируют доставку. Проверьте getWebhookInfo и скорость ответа обработчика, а при опросе – timeout/offset. Временно включите polling, чтобы исключить сеть/TLS и проверить логику хэндлеров. Этот приём быстро локализует проблему.
Без права «писать/медиа/закреплять» бот в группе будет «молчать», даже если код верный. В супергруппах могут мешать slow mode и антиспам-фильтры. В личке пользователь должен написать первым – иначе 403 Forbidden. Всегда начинайте с проверки прав и формы вызова команды.
Непойманные исключения и блокирующие вызовы приводят к «тихому» падению. Добавьте глобальный перехват ошибок и обратите внимание на очереди/латентность. Вынесите тяжёлые операции во внешние воркеры или очереди. Перезапуск по watchdog возвращает доступность до фикса.
400/401/403/409/413/429 и 5xx встречаются чаще, чем кажется. Валидируйте JSON и длины полей, экранируйте Markdown/HTML, следите за размерами файлов. На 429 включайте бэкофф (повтор с паузами и джиттером) и снижайте частоту. Это избавляет от невидимых блокеров.
Если делали /revoke, старый ключ перестаёт работать мгновенно. Получите новый /token у BotFather и обновите секреты в env/CI/CD. Перезапустите сервисы и убедитесь, что нет старых контейнеров со «старыми» переменными. Рассинхрон токенов – топ-причина «тишины».
Когда токен синхронизирован и вебхук стабилен, проверьте доставку постов на реальном трафике: аккуратная накрутка просмотров телеграм малыми волнами даст первичные сигналы по скорости появления показов, CTR и дочитываниям. Подавайте равномерно 30–60 минут, сравните метрики до и после и зафиксируйте безопасный темп для последующих публикаций.
Включённый Privacy Mode скрывает обычные сообщения, бот видит только команды со слэшем. Если сценарий требует читать фразы – переключите /setprivacy на Disabled. Помните, что отключение приватности требует фильтров по чатам/ролям. Так вы избежите «шума» и жалоб.
Поддерживайте два набора команд: для лички и для групп (scope у BotFather). Проверьте локали описаний – клиент подхватывает язык пользователя. Названия команд должны совпадать с кодом и подсказками. Это возвращает автодополнение и снижает ошибки запуска.
Регистрируйте веб-хук на публичном HTTPS-домене с доступом из интернета. Не держите параллельно polling, иначе будет 409. При миграциях снимайте хвост drop_pending_updates=true, чтобы не ловить лавину старых событий. Это сокращает время восстановления.
Сертификат должен соответствовать домену (CN/SAN), цепочка должна быть полной (intermediate присутствуют), SNI настроен. Просроченные или самоподписанные сертификаты приводят к «тихому» молчанию. Проверка одной командой:
echo | openssl s_client -servername your.domain -connect your.domain:443 -showcerts 2>/dev/null | openssl x509 -noout -issuer -subject -datesСверьте issuer/subject/dates и что CN/SAN совпадает с доменом.
Посмотрите getWebhookInfo: пустой ли last_error_message, нет ли timeout/TLS/wrong response. Проверьте серверные логи и попробуйте curl -i https://your.domain/bot-hook – нужен быстрый 200 OK без редиректа. После фикса снимите веб-хук и поставьте заново, очистив отложенные апдейты. Повторная проверка должна показать пустой last_error_message.
Задайте timeout=25–30 и храните last_update_id, двигая offset на +1. Следите за limit, чтобы не плодить пустые запросы и не упираться в лимиты. Такой режим экономит ресурсы и стабилизирует поток событий. Это база для дев-сред и отладки.
Идемпотентность (повтор безопасен) и таблица/Redis для уже обработанных update_id закрывают дубли. Фиксируйте побочные действия (платёж/выдача) только после отметки «обработано». Это убирает «призраков» при ретраях и перебоях сети. Простая техника, а пользы много.
Всегда снимайте веб-хук с drop_pending_updates=true перед запуском polling и наоборот. Держите одну точку приёма апдейтов – иначе получите 409 и дубли. Зафиксируйте порядок переключений в runbook, чтобы команда не путалась. Это исключает «гонки» на входе.
Включённый Privacy Mode требует явного обращения /команда@YourBot или reply на сообщение бота. Иначе команду «не видно» и реакция не придёт. Объясните это пользователям в описании или закрепе. Это простая настройка, которая снимает половину вопросов.
Проверьте права «Отправлять сообщения/медиа», «Закреплять/Удалять», если сценарий это требует. В каналах без админки бот не публикует по правилам платформы. После выдачи прав перезапустите бот, чтобы кэш ролей обновился. Это самая частая быстрая победа.
Супергруппы нередко включают slow mode и антиспам, ограничивающие частоту и ссылки. Проверьте, не попадает ли бот под фильтры или запреты на приглашения. Тестируйте те же команды в песочнице без ограничений – так вы отделите политику группы от кода. При необходимости согласуйте исключения с владельцами чата.
В PM боту нельзя писать первым – пользователь должен начать диалог. Дайте пользователю понятную инструкцию «нажмите Start/напишите /start», это снимает 403. Не шлите повторно в заблокированный чат – это тратит лимиты и ухудшает траст. Это правило по дизайну, его не обойти кодом.
Если получили 403 Forbidden, прекратите попытки отправки в этот чат. Предложите альтернативный канал связи в FAQ/описании. Логируйте такие случаи, чтобы не повторять попытки. Это экономит лимиты и нервы.
429 Too Many Requests означает, что вы упёрлись в лимит частоты. Включите очереди и экспоненциальный бэкофф с джиттером, сократите частоту ответов. Группируйте похожие реплики и шлите один итог вместо десяти. Так вы не перегреете лимиты и сохраните доставку.
Проверяйте Content-Type: application/json, длины полей и экранирование Markdown/HTML. Валидируйте эмодзи и RTL-текст, чтобы не ловить «тихие» 400. Тестируйте длинные подписи и кнопки заранее. Это избавляет от ночных «падений» без стека ошибок.
401 = токен неверный/отозван – обновите ключ в окружении и перезапустите сервисы. 403 = нет прав/пользователь заблокировал – проверьте права/попросите пользователя написать первым. Не ретратьте одно и то же сообщение – это выглядит как спам. Логируйте код/место возникновения для быстрого поиска.
409 = одновременно включены polling и веб-хук – снимите один канал. 413 = файл слишком большой – сжимайте/режьте и отправляйте как документ. 429 = превышен лимит – очереди, бэкофф, снижение частоты и батчинг. 5xx = сбой апстрима (внешний шлюз/сервер) – ретраи и мониторинг времени ответа.
Добавьте глобальный перехват ошибок и алерты на падения процессов. Проверьте перезапуск воркеров по watchdog и ресурсы контейнеров. Логируйте стек и входящие данные для ускорения поиска причины. Это возвращает бота «в эфир» до больших правок.
Убедитесь, что вы подписаны на типы событий, которые реально приходят: message/command, callback_query, edited_message, channel_post. Добавьте заглушки и лог на неожиданные типы, чтобы не «падать» молча. Это убирает «слепые зоны» и делает реакцию предсказуемой. Список типов проверьте по документации Bot API.
Перенесите внешние вызовы и тяжёлые вычисления в очереди/воркеры. Поставьте таймауты и ретраи с джиттером, чтобы не блокировать веб-хук. Ограничьте параллелизм, чтобы не ловить 429 и дедлоки. Это поднимет стабильность и снизит задержки.
Проверьте валидность ключей и квоты у партнёров, следите за SLA. Ловите 4xx/5xx и отвечайте «мягкой» деградацией функционала, а не молчанием. Держите статус-страницы провайдеров под рукой. Так вы не «роняете» бота из-за чужих сбоев.
Включите экспоненциальный бэкофф и circuit breaker (автовыключатель запросов) на нестабильных направлениях. Сообщайте пользователю понятный текст при деградации, а не «пустоту». Это экономит лимиты и нервы. Не бойтесь временно отключать вторичные функции.
Валидируйте входящие JSON/формы по схеме и экранируйте спецсимволы. Не доверяйте длинам и типам «по документации» – проверяйте. Санитизируйте Markdown/HTML в кнопках и подписях. Это снижает риск XSS и «тихих» 400.
| Симптом | Причина | Что проверить/сделать |
|---|---|---|
| Команды не срабатывают | Неверный/отозванный токен | BotFather /token, обновить env, перезапуск воркера |
| В личке ок, в группе молчит | Privacy Mode или нет прав | /setprivacy, выдать права, вызывать /cmd@Bot |
| Не приходят апдейты | Webhook не активен | getWebhookInfo, 200 OK, TLS цепочка, no redirect |
| Двойные сообщения | Параллельный polling или offset не сдвигается | Остановить лишние воркеры, сохранять last_update_id |
| 409 Conflict | Включены и webhook, и polling | deleteWebhook?drop_pending_updates=true |
| 429 Too Many Requests | Превышен rate limit | Бэкофф/очереди, снизить частоту |
| 400 Bad Request | Неверные параметры | Валидация JSON, длины полей, escape Markdown/HTML |
| 403 Forbidden | Блок/нет прав | Пользователь заблокировал, нет прав писать в чат |
| 413 Payload Too Large | Файл слишком большой | Сжимать, резать, отправлять как документ |
| 502/504 | Сеть/шлюз | Ретраи, проверка хостинга, таймауты сервера |
curl -s https://api.telegram.org/bot<TOKEN>/getWebhookInfo
curl -s -F "url=https://your.domain/bot-hook" https://api.telegram.org/bot<TOKEN>/setWebhook
curl -s "https://api.telegram.org/bot<TOKEN>/deleteWebhook?drop_pending_updates=true"curl -s "https://api.telegram.org/bot<TOKEN>/getUpdates?timeout=30"Health: GET /bot-hook/health должен возвращать 200 OK, версию билда и uptime. Мониторьте p95/p99 latency веб-хука, долю 5xx и событие «getWebhookInfo.last_error_message != пусто» с алертом. Следите за глубиной очередей и временем обработки, чтобы вовремя масштабировать воркеры. Такие сигналы сокращают MTTR и снимают риски.
Токен обновлён и един в dev/stage/prod, /setcommands и /setprivacy соответствуют сценарию. Веб-хук даёт быстрый 200 OK, TLS цепочка полная, SNI/CN верные. Выбран один канал апдейтов (webhook или polling), второй гарантированно выключен. Мониторинг и алерты настроены, логи включены.
Зафиксируйте, что сейчас активно (webhook или polling), и выключите второй канал. Включите расширенный лог, перезапустите воркеры/контейнер и проверьте токен. При сетевых/TLS проблемах временно перейдите на polling и чините веб-хук. После фикса верните веб-хук и убедитесь, что last_error_message пустой, а p95 в норме.
Проверьте токен в окружении, выберите один канал апдейтов и проверьте getWebhookInfo. Убедитесь, что веб-хук даёт 200 OK без редиректов и что сертификат валиден. Посмотрите логи хэндлеров и включите polling на время проверки. Это отделит «сеть» от «кода» за 5 минут.
В BotFather выполните /setprivacy и переключите режим на Disabled, если нужно читать обычные сообщения. Выдайте боту права «писать/медиа/закреплять» в нужной группе. Просите вызывать команды формой /cmd@YourBot, если приватность оставили включённой. После изменений перезапустите процесс, чтобы обновить кэш ролей.
Это конфликт каналов: одновременно включены webhook и polling. Снимите веб-хук с drop_pending_updates=true или остановите поллер, оставив один канал. Проверьте .env переменную режима и процессы на всех инстансах. После стабилизации верните необходимый режим и проверьте getWebhookInfo.
Если last_error_message указывает на TLS/timeout/wrong response, ищите проблему в сети/сертификате/веб-сервере. Проверьте цепочку и SNI командой openssl s_client, затем повторите тест getWebhookInfo. Если polling получает апдейты, а веб-хук нет – код, скорее всего, ни при чём. После фикса ошибки в getWebhookInfo исчезают за несколько минут.
Смотрите на 429 и частоту вызовов методов – возможно, упёрлись в лимит. Проверьте глубину очередей и время обработки хэндлеров – это признак узких мест. Включите бэкофф с джиттером и ограничьте параллелизм. Если задержки остаются, масштабируйте воркеры и оптимизируйте блокирующие участки.