Inline-кнопка Telegram зависла на загрузке? Проверьте answerCallbackQuery
Если inline-кнопка Telegram с callback продолжает показывать загрузку, проверьте, вызывает ли бот answerCallbackQuery для полученного callback_query. Возврат HTTP 200 из webhook не заменяет этот вызов. Telegram требует отвечать на callback даже тогда, когда уведомление пользователю не нужно. Отвечайте на взаимодействие оперативно, а результат длительной бизнес-операции отслеживайте отдельно.
Главное
- Callback-кнопка создаёт
callback_query, а не обычное текстовое сообщение для обработчика сообщений. - Передавайте
idзапроса вcallback_query_id, а не идентификатор сообщения, чата или обновления. - Текст уведомления необязателен: ответ без текста тоже нужен.
- Исчезновение индикатора загрузки не подтверждает завершение платежа, согласования или операции поддержки.
Почему зависшей кнопке нужен answerCallbackQuery
Официальный справочник Telegram Bot API различает callback-кнопку и URL-кнопку. Значение callback_data передаётся боту в callback-запросе, а URL-кнопка открывает настроенную ссылку. Сначала уточните, какой тип кнопки вы создали.
У callback-взаимодействия есть три отдельных результата:
| Результат | Чем подтверждается | Чего не подтверждает |
|---|---|---|
| Доставка webhook подтверждена | Успешный HTTP-ответ получателя | Что бот ответил на callback |
| На нажатие дан ответ | answerCallbackQuery для этого запроса | Что бизнес-операция выполнена |
| Бизнес-операция завершена | Зафиксированный результат приложения | Одного получения или подтверждения нажатия недостаточно |
Telegram документирует, что answerCallbackQuery может показать уведомление или всплывающее предупреждение и возвращает True при успехе. Обязательный параметр — callback_query_id; text необязателен. Обычное подтверждение webhook не заменяет этот метод.
Если вопрос в том, вызывать ли метод Bot API через тело ответа webhook или отдельным запросом, прочитайте сравнение ответа webhook и отдельного API-запроса. Это выбор способа вызова. Здесь рассматривается отсутствие ответа на само взаимодействие с кнопкой.
Найдите участок, где возникает сбой
Callback вообще не попадает в обработчик
Проверяйте тип входящего обновления, а не только журналы обычных сообщений. Убедитесь, что диспетчер обрабатывает callback_query, а явно заданный фильтр allowed_updates включает этот тип. Telegram указывает: если allowed_updates не передан, сохраняется прежняя настройка. Пропуск параметра в следующем запросе настройки не сбрасывает фильтр.
Если не приходит всё обновление, используйте диагностику доставки через getWebhookInfo. Сбой доставки и обработчик, который молча игнорирует callback, требуют разных исправлений.
Callback приходит, но кнопка продолжает загружаться
Сопоставьте поля с фактически полученным обновлением:
| Входящее поле | Назначение |
|---|---|
callback_query.id | Передать как callback_query_id в answerCallbackQuery |
callback_query.data | Обрабатывать как входные данные приложения, если поле присутствует |
callback_query.message | Контекст сообщения, если присутствует; нельзя требовать его для всех callback |
callback_query.inline_message_id | Контекст сообщения, отправленного через inline-режим, если присутствует |
Telegram предоставляет разный контекст для обычных сообщений бота и сообщений inline-режима. Обработчик, который всегда обращается к callback_query.message.chat, может завершиться с ошибкой ещё до ответа на callback.
Если нужен наблюдаемый результат, отправляйте answerCallbackQuery отдельным запросом. Сохраняйте фактический успех или ошибку, не раскрывая токен бота. Не ставьте ответ на взаимодействие в зависимость от долгого запроса к AI, CRM или другому сервису.
Загрузка завершилась, но действие выполнено неверно
Данные callback — это входные данные, а не разрешение на действие. Telegram предупреждает: исходное сообщение может уже не содержать кнопку с полученным значением данных. Рекомендуется проверять допустимые действия, права пользователя и актуальное состояние объекта на сервере.
В гипотетическом процессе согласования ответ на нажатие не должен автоматически переводить заявку в одобренное состояние. Проверьте запрос, выполните допустимый переход состояния один раз и отдельно покажите фактический результат. Устранение повторных доставок обновления и защита от повторных нажатий — разные задачи: для второй нужна проверка на уровне бизнес-операции.
Проверяйте взаимодействие целиком, а не только webhook
До выпуска проверьте следующие сценарии:
- На корректный callback можно ответить без текста уведомления.
- Длительная бизнес-задача не блокирует ответ на взаимодействие.
- Отсутствие
messageне приводит к падению обработчика. - Неизвестные или устаревшие данные не запускают неразрешённое действие.
- Повторная доставка или нажатие не повторяет необратимую операцию.
Это рекомендуемые приёмочные проверки, а не результаты проведённых тестов и не гарантия времени ответа Telegram.
Где уместен UnifyPort
Для inline-клавиатур бота и ответов на callback сохраняйте официальный Telegram Bot API. Неофициальный интерфейс UnifyPort предназначен для подключённых аккаунтов обмена сообщениями и использует отдельный контракт нормализованных событий. В публичном каталоге событий webhook есть message.received, но не документированы событие callback_query или операция answerCallbackQuery. Не переименовывайте событие сообщения в callback и не считайте, что единый webhook ответит на кнопку бота.
Если приложению также нужен приём сообщений на уровне аккаунта, отделите этот получатель от обработчика взаимодействий бота. Справочник доставки UnifyPort указывает, что тело ответа отбрасывается. Возврат JSON с методом Bot API в этом ответе не выполняет ответ на callback.
Частые вопросы
Остановит ли HTTP 200 индикатор загрузки кнопки Telegram?
Сам по себе — нет. HTTP подтверждает доставку обновления, а callback требует answerCallbackQuery.
Обязателен ли текст в answerCallbackQuery?
Нет. Параметр text необязателен: можно ответить, не показывая уведомление.
Нужно ли передавать ID сообщения в callback_query_id?
Нет. Используйте id полученного объекта CallbackQuery.
Может ли единый webhook сообщений заменить этот обработчик?
По документированному контракту UnifyPort — нет. Обработку callback следует оставить в официальной интеграции Telegram-бота.
Следующий шаг и источник
Выполните одно контролируемое нажатие и проследите путь от получения callback_query до фактического результата answerCallbackQuery. Если нужен также приём сообщений аккаунта, изучите контракт стандартных событий webhook перед тем, как объединять прикладную логику двух обработчиков.
Официальный источник проверен 2026-09-22: Telegram Bot API — CallbackQuery, answerCallbackQuery, InlineKeyboardButton и allowed_updates.
Превратите интеграцию сообщений в стабильный продуктовый pipeline.
Начните с отправки через единый API, затем возвращайте входящие сообщения в бизнес-систему стандартными событиями.