Відкрийте BotFather і перевірте, що токен актуальний і ви не робили нещодавно /revoke (відклик токена). Звірте /setcommands і потрібний scope (область: за замовчуванням/для груп/для особистих чатів) із тим, що прописано в коді. Переконайтеся, що /setprivacy відповідає сценарію: Enabled для команд або Disabled, якщо потрібно читати звичайні повідомлення. Невідповідність токена/команд/локалей часто дає «тишу» без помилок.
Коли токен, команди, scope і privacy наведені до ладу, перевірте реакцію на невеликому трафіку: акуратна накрутка підписників тг малими партіями допоможе швидко виміряти відгук на команди, 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, щоб не плодити порожні запити й не впиратися в ліміти. Такий режим економить ресурси та стабілізує потік подій. Це основа для dev-середовищ і відладки.
Ідемпотентність (повтор безпечний) і таблиця/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 ланцюжок, без редиректу |
| Подвійні повідомлення | Паралельний 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 і частоту викликів методів — можливо, вперлися в ліміт. Перевірте глибину черг і час обробки хендлерів — це ознака вузьких місць. Увімкніть бекофф із джиттером і обмежте паралелізм. Якщо затримки залишаються — масштабуйте воркери й оптимізуйте блокуючі ділянки.