Telegram-бот на n8n: inline-кнопки, меню и кнопка для открытия Mini App
В n8n бот строится из Telegram Trigger, ветвления по типу события и узла отправки. Нажатия inline-кнопок приходят как callback_query и требуют ответа. Кнопку, открывающую Mini App, проще отправить через HTTP Request, а у бота может быть только один webhook.
В n8n бота можно собрать без отдельного кода: приём сообщений, меню, кнопки и ответы. Разберём схему сценария, обработку нажатий и кнопку, которая открывает Mini App.
Из чего состоит бот в n8n
- Telegram Trigger: принимает обновления (сообщения и нажатия на кнопки).
- Ветвление (Switch или IF): определяет, что пришло: команда, текст или нажатие кнопки.
- Узлы обработки: запросы к базе, API, расчёты.
- Узел отправки Telegram или HTTP Request: отправляет ответ пользователю.
Чтобы триггер работал на постоянной основе, workflow должен быть активирован: тестовый режим подходит только для проверки, а боевой webhook регистрируется при активации. Для этого у n8n должен быть публичный адрес с HTTPS.
Команды и меню
Команды вида /start приходят обычным сообщением, поэтому в ветвлении проверяйте начало текста. Подсказки команд в интерфейсе Telegram задаются у @BotFather (команда /setcommands): это только список для пользователя, логику обрабатывает ваш сценарий.
Inline-кнопки
Inline-кнопки отправляются в узле отправки сообщения через настройку клавиатуры (Reply Markup, Inline Keyboard). У каждой кнопки есть текст и либо callback_data, либо ссылка.
Когда пользователь нажимает кнопку с callback_data, Telegram присылает обновление callback_query, а не сообщение. В нём лежат данные кнопки и идентификатор запроса.
Важные правила:
- Отвечайте на нажатие. Нужно вызвать ответ на callback-запрос (в узле Telegram это операция Answer Query), иначе у пользователя на кнопке будет крутиться индикатор загрузки.
- Разбирайте
callback_dataветвлением: например,catalog:next,sub:on,sub:off. Держите значения короткими: у Telegram есть ограничение на длину. - Редактируйте исходное сообщение вместо отправки нового, если это переключение страницы или состояния. Так чат не засоряется.
Кнопка, которая открывает Mini App
Кнопку с открытием Mini App удобнее всего отправлять через узел HTTP Request, обращаясь к Bot API напрямую. Адрес: https://api.telegram.org/bot<токен>/sendMessage, тело в JSON:
{
"chat_id": "{{ $json.message.chat.id }}",
"text": "Открыть каталог",
"reply_markup": {
"inline_keyboard": [[
{ "text": "Каталог", "web_app": { "url": "https://example.com/app" } }
]]
}
}
Адрес Mini App должен быть доступен по HTTPS. Токен бота храните в учётных данных n8n, а не в тексте узла.
Подводные камни
- Один webhook на бота. У бота может быть только один активный webhook. Если вы запускаете в n8n Telegram Trigger и одновременно опрашиваете
getUpdatesкодом или регистрируете другой webhook, получите конфликты и потерянные сообщения. - Тестовые и боевые адреса. В тестовом режиме у webhook другой адрес. Не оставляйте в боте тестовый URL.
- Повторные сообщения. Telegram повторяет доставку, если не получил быстрый ответ. Не делайте в сценарии долгих операций до ответа и защитите критичные действия от повторов (запоминайте
update_id). - Лимиты отправки. Не рассылайте много сообщений подряд: используйте паузы и очередь.
- Ошибки пользователю. Если запрос к базе не удался, отправьте понятное сообщение, а не оставляйте бота молчать.
Где это применено
На n8n работает, например, ИИ-консультант HotTrip: n8n принимает сообщения, вызывает инструменты и API, а ответы приходят в Telegram. У проектов с Mini App кнопки бота ведут в приложение. Подробности в проектах HotTrip и Da Nang House, а также в услугах «Telegram-боты и Mini App» и «Автоматизация процессов».
Частые вопросы
Нужен ли код, чтобы сделать бота в n8n?
Для типового бота нет: меню, кнопки, ответы и запросы к API собираются из узлов. Код понадобится для нестандартной логики или функций, которых нет в узле Telegram.
Почему кнопка «зависает» после нажатия?
Не отправлен ответ на callback-запрос. Добавьте в сценарий операцию ответа на нажатие.
Можно ли сделать бота и Mini App вместе?
Да. Бот отправляет кнопку с `web_app`, Mini App открывается внутри Telegram и обращается к вашему API. Данные пользователя нужно проверять по подписи `initData`.
Что делать, если бот перестал получать сообщения?
Проверьте, что workflow активирован, что у бота установлен нужный webhook и что нет конфликта с другим процессом, который использует тот же токен.
Версия для ИИ и чтения без оформления: Markdown.