Inline mode в Telegram позволяет пользователям взаимодействовать с ботом без необходимости переходить в чат с ним. Вместо этого пользователь вводит имя бота и запрос прямо в поле ввода сообщения любого чата. Это активирует inline-запрос, который бот обрабатывает в реальном времени, возвращая до 50 готовых к отправке результатов.
Чтобы бот мог работать в inline-режиме, необходимо активировать его через BotFather с помощью команды /setinline
. Далее реализуется логика обработки inline_query в коде бота. Telegram присылает JSON-объект, содержащий идентификатор запроса, текст, введённый пользователем, а также ID пользователя и чата, если доступен.
Бот отвечает методом answerInlineQuery
, где передаёт массив объектов типа InlineQueryResult. Эти объекты могут быть текстовыми сообщениями, статьями, изображениями, видео, аудио и другими типами контента. Все результаты кешируются Telegram, но можно управлять временем хранения через параметр cache_time
.
Чтобы inline-бот был удобным в использовании, рекомендуется реализовать мгновенный отклик, ограничивать количество результатов и тщательно обрабатывать пустые запросы. Кроме того, при генерации результатов следует использовать уникальные идентификаторы и учитывать контекст пользователя, если это уместно.
Inline mode особенно полезен для поиска и вставки контента: гифок, статей, шаблонов сообщений. Он не подходит для интерактивных сценариев, требующих ответа от пользователя – такие задачи лучше реализовывать через callback_query
или обычные команды в чате.
Как пользователь запускает inline-режим и что отправляется боту
Inline-режим активируется пользователем прямо в поле ввода любого чата Telegram. Для этого он вводит символ @
сразу за которым следует username бота (например, @example_bot
), а затем – пробел и текст запроса. Бот должен быть предварительно разрешён для inline-режима через BotFather и иметь включённую опцию inline_query
.
После ввода запроса Telegram отправляет боту специальный тип обновления – inline_query
. Оно доставляется через вебхук или поллинг и содержит следующую структуру данных:
Поле | Описание |
---|---|
id |
Уникальный идентификатор запроса (строка, используется для ответа) |
from |
Объект пользователя, инициировавшего запрос (ID, имя, username и язык) |
query |
Текст запроса, введённый пользователем после username бота |
offset |
Текущий смещённый указатель, используется для постраничной выдачи |
chat_type |
Тип чата, из которого пришёл запрос (если доступен: sender , private , group и т.д.) |
location |
Объект геолокации пользователя (если включена) |
Бот может вернуть пользователю до 50 результатов в ответ с помощью метода answerInlineQuery
. Каждый результат формируется заранее и представляет собой один из типов: InlineQueryResultArticle
, Photo
, GIF
, Video
, Voice
и другие. Ответ должен быть отправлен в течение 10 секунд после получения запроса, иначе он будет проигнорирован клиентом.
Inline-запрос не виден другим участникам чата, пока пользователь не выберет и не отправит результат. В этот момент бот не получает дополнительных данных – выбранный результат уже заранее задан в ответе бота и передаётся Telegram автоматически.
Какие события обрабатываются в inline-режиме
InlineQuery – основной тип события, с которого начинается работа бота в inline-режиме. Telegram отправляет это обновление, когда пользователь вводит @имябота в поле ввода текста и продолжает печатать запрос. Бот получает JSON-структуру с полем inline_query, содержащим ID запроса, текст, данные о пользователе и геолокацию (если доступна).
ChosenInlineResult отправляется, когда пользователь выбирает один из ответов, предложенных ботом. Это событие фиксирует факт выбора, включая ID ранее отправленного InlineQuery, ID результата и данные о пользователе. Обработка этого события полезна для логирования, сбора статистики и выполнения отложенных действий, например – отправки подтверждающего уведомления или записи факта использования.
CallbackQuery может быть связан с inline-ответами, если они содержат встроенные кнопки. Если пользователь нажимает на кнопку с типом callback_data, бот получает это обновление. Важно учитывать, что ответить можно только один раз, и Telegram ожидает вызова метода answerCallbackQuery в течение нескольких секунд, иначе кнопка будет казаться «нерабочей».
Все события в inline-режиме поступают через Webhook или getUpdates. При использовании Webhook важно убедиться, что сервер обрабатывает события быстро, иначе Telegram может отключить доставку. Рекомендуется обрабатывать события асинхронно и минимизировать ответ сервера.
Inline-режим не предполагает получения message-обновлений, поскольку сообщения не отправляются напрямую боту. Все действия происходят внутри клиентского интерфейса Telegram, а бот лишь предоставляет готовые результаты.
Как бот формирует и возвращает список результатов
При получении inline-запроса бот получает объект InlineQuery
, содержащий идентификатор запроса, текст введённый пользователем, идентификатор пользователя и другие параметры. Обработка начинается с анализа query
и возможных параметров offset
и location
, если они присутствуют.
Бот должен сформировать список объектов InlineQueryResult
, каждый из которых представляет одну единицу контента. Это может быть текст, изображение, видео, аудиофайл, документ, геолокация или ссылка. Минимально требуется указать type
, id
и обязательные для типа поля. Идентификаторы результатов должны быть уникальными в пределах одного ответа.
Ответ формируется с помощью метода answerInlineQuery
, которому передаётся идентификатор запроса и массив результатов. Опционально можно задать cache_time
(в секундах) и is_personal
. Первый определяет время кэширования результатов на стороне Telegram, второй – доступность результатов другим пользователям.
Если бот не возвращает результатов, Telegram отображает стандартное сообщение “Ничего не найдено”. Чтобы показать собственное сообщение, можно использовать результат с типом article
и кастомным текстом.
Формат и структура объектов InlineQueryResult
Объекты типа InlineQueryResult
представляют собой ответы бота на inline-запросы. Каждый объект имеет обязательное поле type
, определяющее его вид: article
, photo
, gif
, mpeg4_gif
, video
, audio
, voice
, document
, location
, venue
, contact
, game
, sticker
.
Все объекты содержат обязательное поле id
(строка до 64 байт), уникальное в пределах одного ответа. Значения должны быть детерминированными, чтобы Telegram мог кэшировать результаты.
Каждый тип имеет строго определённый набор полей. Например, InlineQueryResultArticle
требует title
и input_message_content
. Внутри input_message_content
можно использовать один из вложенных объектов: InputTextMessageContent
, InputLocationMessageContent
, InputVenueMessageContent
, InputContactMessageContent
.
Если используется медиа-тип, как photo
или video
, нужно указать URL-файл и URL превью, а также размеры, продолжительность (если применимо), заголовки и подписи. Подписи ограничены 1024 символами. Форматирование – через HTML или MarkdownV2, но без пересечений тегов.
Для обеспечения правильного отображения следует указывать thumb_url
, особенно если основное содержимое подгружается медленно. Telegram использует это превью в интерфейсе до загрузки основного объекта.
При использовании reply_markup
в качестве встроенной клавиатуры применяют InlineKeyboardMarkup
. Не стоит передавать больше 8 кнопок в ряд и 100 кнопок всего – Telegram их обрезает или игнорирует.
Максимальное количество результатов в одном ответе – 50. Для каждой выдачи возвращается массив объектов одного или разных типов. Необходимо избегать дублирования id
между элементами.
Как обрабатывается выбор результата пользователем
Когда пользователь выбирает один из предложенных ботом вариантов в inline-режиме, Telegram отправляет боту объект chosen_inline_result
через Webhook или при опросе обновлений. Этот объект содержит информацию о выбранном результате и может использоваться для дополнительной логики.
result_id
– идентификатор выбранного результата. Должен совпадать с одним изid
, отправленных ботом вInlineQueryResult
.from
– объект пользователя, который сделал выбор.query
– исходный текст запроса, который ввёл пользователь. Может использоваться для аналитики.
Бот может использовать chosen_inline_result
для:
- Фиксации статистики использования конкретных ответов.
- Идентификации пользователя для последующей персонализации.
- Обновления внешних систем, связанных с действиями пользователя.
Важно: выбор inline-результата не является сообщением в чате с ботом, поэтому прямой обратной связи нет. Для отслеживания дальнейших действий необходимо использовать дополнительные механизмы, например, ссылки с параметрами (start_param
) или callback-запросы.
Если боту необходимо ассоциировать действие с конкретным чатом, можно использовать встроенные кнопки с switch_inline_query
и затем обрабатывать контекст уже в чате через команды или callback’и.
Ограничения и тайм-ауты inline-запросов
Inline-режим Telegram-ботов накладывает конкретные лимиты на количество и время обработки запросов, чтобы сохранить производительность и стабильность сервиса.
- Максимальное время ответа: бот должен отправить ответ на inline-запрос в течение 10 секунд с момента его получения. Если время превышено, Telegram не покажет результаты пользователю.
- Количество результатов: в ответе на inline-запрос можно вернуть не более 50 объектов (inline results). При превышении Telegram примет только первые 50 элементов.
- Частота запросов: ограничение на количество inline-запросов с одного пользователя – примерно 20 запросов в минуту. При превышении Telegram может временно блокировать дальнейшие запросы.
- Размер ответа: максимальный общий размер JSON-ответа не должен превышать 1 МБ, иначе запрос будет отклонён.
- Тайм-ауты на стороне сервера: сервер бота должен обеспечивать быстрый отклик, так как задержки могут привести к ошибкам и ухудшению опыта пользователей.
Для стабильной работы inline-режима рекомендуется:
- Оптимизировать генерацию ответов, чтобы укладываться в 10-секундный лимит.
- Кэшировать часто запрашиваемые данные, чтобы ускорить формирование ответа.
- Контролировать размер и количество возвращаемых результатов, избегая избыточных данных.
- Обрабатывать исключения и ошибки на сервере, чтобы не допускать сбоев в ответах.
Как тестировать и отлаживать inline-режим бота
Для проверки работы inline-режима необходимо вызвать бота через строку ввода любого чата, введя @username_бота и запрос. Результаты, которые бот возвращает, сразу отображаются в виде интерактивных подсказок.
Для отладки важно использовать Telegram Bot API метод answerInlineQuery
. Он должен возвращать корректно сформированные объекты InlineQueryResult с уникальными id
. Любые ошибки в формате или несоответствие типов приводят к отказу Telegram показывать результаты.
Для локального тестирования стоит применять инструменты наподобие ngrok или аналогов, чтобы настроить webhook и видеть запросы в реальном времени. Это позволяет быстро выявлять проблемы с обработкой входящих inline-запросов.
Обязательно логируйте входящие inline-запросы и ответы. Следите за параметрами offset
, отвечающим за пагинацию – неправильная обработка смещений часто приводит к циклическим или пустым результатам.
Тестируйте реакции бота на пустые запросы (пустая строка после @username) и на специальные символы, чтобы убедиться в устойчивости к нестандартным вводам.
Если результаты не отображаются, проверьте, что бот имеет включённый inline-режим в настройках BotFather и что разрешён доступ всем пользователям (или вашим тестовым аккаунтам).
Для анализа проблем с форматированием используйте JSON-валидаторы, а также проверяйте, что каждое поле соответствует спецификации Telegram API. Ошибки в URL, длине текста или пропущенные обязательные поля могут блокировать показ результата.
Регулярно проверяйте ограничения Telegram по количеству возвращаемых результатов (максимум 50) и размеру данных, чтобы избежать отказа сервера.
Вопрос-ответ:
Что такое inline mode у Telegram-ботов и как он работает?
Inline mode позволяет использовать бота прямо в любом чате Telegram, не переходя в отдельный диалог с ним. Пользователь вводит имя бота с символом @ в поле ввода сообщения, после чего бот предлагает варианты ответов или контента, которые можно отправить в чат. Бот получает запрос и возвращает результаты в формате, который Telegram отображает пользователю для выбора.
Какие основные технические шаги нужны, чтобы включить inline режим у бота?
Для активации inline режима в настройках бота необходимо включить параметр inline_query. После этого бот должен обрабатывать специальные запросы — inline queries — которые приходят, когда пользователь вводит @бота в любом чате. Сервер бота получает текст запроса, формирует список ответов и возвращает его в виде массива, где каждый элемент содержит заголовок, описание и сам контент для отправки.
Можно ли с помощью inline mode создавать сложные интерактивные элементы, например, игры или формы?
Inline mode поддерживает разные типы ответов, включая текст, картинки, видео и даже кнопки с действиями. Однако полноценных интерактивных форм или сложных игр он не предоставляет. Для таких задач лучше использовать обычные диалоги с ботом или веб-страницы, открываемые через встроенные клавиатуры или ссылки. Inline mode подходит для быстрого доступа к информации или небольшим интерактивным фрагментам.
Какие ограничения есть у inline mode с точки зрения скорости отклика и количества результатов?
Боты должны отвечать на inline-запросы очень быстро — Telegram требует ответ в течение нескольких секунд. Если ответ задерживается, пользователю может показаться, что бот не работает. Кроме того, существует лимит на количество возвращаемых результатов — обычно это до 50 вариантов. Из-за этого стоит тщательно подбирать наиболее релевантные ответы и минимизировать нагрузку на сервер.
Как защитить inline mode бота от спама и нецелевых запросов?
Для защиты можно реализовать фильтры по содержимому запросов и ограничить частоту запросов с одного пользователя или IP-адреса. Также полезно проверять авторизацию или идентификацию пользователей, если это возможно. Можно настроить ограничения на типы и количество возвращаемых данных, чтобы избежать злоупотреблений и сохранить производительность. Наконец, стоит отслеживать логи и анализировать поведение, чтобы выявлять подозрительные запросы.
Что такое inline режим у Telegram-ботов и как его активировать?
Inline режим позволяет пользователям вызывать бота прямо из поля ввода любого чата, не переходя в отдельное окно бота. Чтобы активировать этот режим, разработчик должен включить соответствующую опцию при регистрации бота через BotFather. После этого пользователи смогут писать в поле сообщения имя бота с символом «@» и вводить запросы, а бот будет возвращать варианты ответов прямо в списке выбора. Это удобно для быстрого поиска и вставки контента от бота без лишних переключений.