Вебхук

Что такое нода «Вебхук»

Вебхук — это нода, которая даёт вашему сценарию собственный публичный URL. Любая внешняя система (сайт, CRM, платёжный сервис, другой бот, скрипт) может обратиться на этот адрес обычным HTTP-запросом (GET или POST) — и это запустит выполнение сценария, как если бы пользователь написал боту.

В отличие от ноды-триггера, которая реагирует на события внутри Telegram-ресурса, вебхук реагирует на события снаружи — из любой системы, умеющей делать HTTP-запросы. В отличие от блока «API-запрос», который бот использует, чтобы самому обращаться к внешним сервисам, вебхук — это точка, куда внешние сервисы обращаются к боту.

В каких случаях используется

1. Приём данных извне. Внешняя система присылает вебхуку данные (например, «заказ оплачен», «заявка с сайта», «событие в CRM»), а сценарий сохраняет их в базу данных бота, обновляет переменные пользователя и/или отправляет ему сообщение в Telegram. Так вебхук работает как вход для интеграции с любым сервисом, который умеет отправлять HTTP-запросы, но не имеет собственного модуля для бота.

2. Отдача данных наружу — «бот как API». Внешняя система делает GET-запрос с параметрами, сценарий выполняет блоки (например, «База данных», «API-запрос», «Интеграции»), собирает нужные данные в переменные — а вебхук возвращает их одним JSON-ответом. Так конструктор превращается в простое API поверх ваших сценариев: не нужно поднимать отдельный бэкенд, чтобы отдать наружу то, что уже умеет считать сценарий.

Оба сценария можно совмещать в одной ноде: принять параметры запроса, что-то посчитать/сохранить и одновременно вернуть результат вызывающей стороне.

Как подключить в конструкторе

  1. В шапке холста нажмите иконку радиосигнала (перед кнопкой «+» добавления команды) — появится фиолетовая нода «Вебхук».

Кнопка добавления вебхука недоступна внутри подсценариев — вебхук можно разместить только в основном сценарии бота.

  1. Откройте ноду — справа откроется панель настроек.
  2. Свяжите вебхук с командой: нажмите «Создать», чтобы сразу создать и подключить новую команду, либо выберите существующую в поле «Переход к команде». Именно эта команда будет выполняться при каждом запросе.
  3. Добавьте в связанную команду нужные блоки (текст, база данных, API-запрос, установка переменных и т. д.) — они выполнятся при обращении к вебхуку и смогут использовать данные запроса через переменную вебхука (см. ниже).
  4. Опубликуйте сценарий — до публикации продакшен-ссылка не работает (см. «Тестовая и продакшен-ссылки» ниже).

Настройки вебхука

Тестовая и продакшен-ссылки

У ноды две ссылки — переключаются вкладками Test URL / Production URL в панели настроек:

Ссылка Когда работает Назначение
Test URL (/webhook-test/…) Всегда Только захват тестовых данных запроса — сценарий не выполняется (см. «Тестовый запрос» ниже)
Production URL (/webhook/…) Только после публикации сценария Реальный вызов — выполняет привязанную команду

Обе ссылки нажатием копируются в буфер обмена. Пока сценарий не опубликован, под вкладкой Production URL показывается подсказка «Опубликуйте сценарий, чтобы активировать продакшен-ссылку».

HTTP-метод и путь

Настройка Описание
HTTP метод GET или POST — запрос с другим методом получит ответ 405 Method Not Allowed
Путь Часть ссылки после адреса бота; генерируется автоматически (случайный уникальный идентификатор), можно заменить на свой. Уникальность проверяется в рамках бота — при совпадении с уже используемым путём поле подсветится красным

Пользователь по умолчанию

Многие блоки сценария (отправка сообщения, работа с базой данных пользователя и т. д.) требуют ID пользователя. Чтобы не указывать его в каждом блоке отдельно, выберите пользователя по умолчанию — он подставляется автоматически везде, где сценарию нужен ID пользователя.

Если пользователь не выбран, сценарий выполняется «безлично»: переменные считаются и возвращаются в ответе, но сообщения никуда не отправляются — удобно для чистого режима «бот как API».

Если пользователь выбран, сообщения из связанной команды дополнительно отправляются ему на ту платформу, на которой он общается с ботом (Telegram, виджет на сайте, WhatsApp, Instagram, Messenger, email или SMS — в зависимости от того, как он был зарегистрирован).

Авторизация

Режим Как проверяется
Нет Проверка не выполняется
Basic Auth Логин и пароль, передаваемые заголовком Authorization: Basic …
Header Auth Значение произвольного заголовка (имя заголовка задаётся вами)

Логин/пароль и значение заголовка сохраняются отдельной кнопкой «Сохранить» рядом с полями — они хранятся отдельно от схемы сценария и не попадают в экспорт схемы, шаблоны или к ИИ-ассистенту. Запрос без верных учётных данных получает ответ 401 Unauthorized.

Ответ (Respond)

Режим Когда отдаётся ответ Что происходит со сценарием
Сразу Немедленно, до выполнения сценария Привязанная команда выполняется после отправки ответа — вызывающая сторона не ждёт её завершения
После выполнения сценария После того как команда полностью отработает Ответ строится из результата выполнения (см. ниже)

В режиме «После выполнения сценария» вебхук всегда возвращает JSON:

json
{
  "success": true,
  "variables": { "order_id": "A-114", "api": { "status": "paid" } },
  "messages": [
    { "type": "text", "text": "Заказ A-114 оплачен" }
  ]
}
  • variables — все переменные, посчитанные сценарием к моменту завершения команды (включая данные самого запроса).
  • messages — контентные блоки команды в том же виде, в котором они уходят пользователю в мессенджер (текст, медиа, кнопки), независимо от того, был ли выбран пользователь по умолчанию для реальной отправки.

В режиме «Сразу» вы настраиваете фиксированный ответ сами — код, тело и заголовки (см. «Расширенные настройки»).

Переменная запроса

Данные входящего запроса сохраняются в переменную, имя которой задаётся полем «Переменная запроса» (по умолчанию webhook). Доступны следующие свойства:

Переменная Значение
{{webhook.method}} HTTP-метод запроса
{{webhook.path}} Путь запроса
{{webhook.ip}} IP-адрес отправителя
{{webhook.query.<имя>}} Параметр из query-строки (?имя=значение)
{{webhook.body.<имя>}} Поле из тела запроса (JSON или form-данные)
{{webhook.headers.<имя>}} Заголовок запроса

Как и все переменные конструктора, вложенные поля читаются через точку: {{webhook.body.order.id}}, а не {{webhook.body.order[0].id]}} — см. Переменные.

Тестовый запрос и как его сделать

Прежде чем подключать реальную внешнюю систему, удобно проверить, какие данные она присылает, — для этого служит тестовая ссылка.

  1. В панели настроек нажмите «Прослушать тестовое событие» — конструктор откроет окно ожидания на 2 минуты.

  2. Отправьте запрос на Test URL любым удобным способом:

    Через Postman / Insomnia:

    • Создайте новый запрос, метод — тот, что выбран в настройках ноды (GET или POST).
    • В адресную строку вставьте скопированный Test URL.
    • Для GET — добавьте параметры на вкладке Params; для POST — тело запроса на вкладке Body (JSON или form-data).
    • Нажмите Send.

    Через curl:

    bash
    curl -X POST "https://<ваш-домен>/webhook-test/<slug>/<путь>" \
      -H "Content-Type: application/json" \
      -d '{"order": {"id": 114, "status": "paid"}}'
    
  3. Как только запрос дойдёт, в конструкторе появятся его данные — окно ожидания закрывается автоматически.

Тестовая ссылка не выполняет сценарий и не имеет побочных эффектов (ничего не пишет в базу, никому не отправляет сообщений) — она нужна исключительно для того, чтобы увидеть реальную форму присылаемых данных. Последний захваченный запрос сохраняется и остаётся видимым в панели настроек даже после того, как вы переключитесь на другую ноду и вернётесь обратно — до следующего тестового запроса.

Как использовать тестовые данные в сценарии

После захвата тестового запроса под кнопкой прослушивания появляется таблица «Доступные переменные» с конкретными путями к полям присланных данных (например, {{webhook.query.order_id}}, {{webhook.body.customer.email}}) — рядом с каждым показан фактически полученный пример значения.

Эти переменные сразу доступны в автодополнении по всему сценарию: начните вводить {{webhook. в любом текстовом поле блока (текст сообщения, URL API-запроса, условие и т. д.) — появится список с найденными полями. Нажатие на переменную в таблице копирует её в буфер обмена.

Типичный порядок работы:

  1. Отправить тестовый запрос с реалистичными данными.
  2. Открыть таблицу переменных, скопировать нужные пути.
  3. Использовать их в блоках связанной команды: например, в блоке «Установка переменных» сохранить {{webhook.body.order.id}} в переменную order_id, затем текстовым блоком отправить Заказ {{order_id}} принят.
  4. Проверить результат ещё одним тестовым запросом при необходимости.
  5. Переключиться на Production URL и опубликовать сценарий.

Расширенные настройки

Раскрываются по ссылке «Дополнительные настройки» внизу панели.

Настройка На что влияет
Allowed Origins (CORS) Список разрешённых доменов через запятую для запросов из браузера (fetch/XHR с другого сайта). Пусто или * — разрешить с любого домена. Если указан конкретный список и Origin запроса в него не входит — браузер заблокирует чтение ответа политикой CORS
Ignore Bots Если включено, запросы с характерными User-Agent превьюшников ссылок и веб-краулеров (Slackbot, TelegramBot, facebookexternalhit и т. п.) не выполняют сценарий — вебхук просто отвечает 200 OK с пустым телом. Полезно, если ссылку на вебхук где-то публикуют или пересылают в мессенджерах
IP(s) Allowlist Список разрешённых IP-адресов или подсетей (CIDR) через запятую, например 127.0.0.1, 192.168.1.0/24. Запрос с другого адреса получает 403 Forbidden. Пусто — доступ разрешён с любого адреса
Response Code HTTP-код ответа в режиме «Сразу»
Response Data Тело ответа в режиме «Сразу». Поддерживает {{webhook.*}} — на этом этапе сценарий ещё не выполнялся, поэтому доступны только данные самого запроса, не переменные, посчитанные командой
Response Headers Произвольные заголовки ответа в режиме «Сразу» (пары имя/значение, тоже поддерживают {{webhook.*}}). Если не указать Content-Type, конструктор подставит его автоматически: application/json, если тело — валидный JSON, иначе text/plain

IP-адрес запроса и заголовки авторизации проверяются до выполнения сценария — если запрос не прошёл фильтр Ignore Bots, IP Allowlist или авторизацию, привязанная команда не запускается вовсе.

Лог запросов и экспорт

В нижней части панели настроек — свёрнутый блок «Лог запросов» с общим числом записей в заголовке. При раскрытии доступны:

  • Фильтры — период (дата от/до), статус (все / успешные / ошибки), поиск по параметрам запроса.
  • Компактный список записей: время, статус-код, метод, режим (тест/прод), длительность выполнения, краткая сводка присланных параметров и ответа.
  • Пагинация — по 30 записей на страницу.
  • Экспорт — кнопка со значком скачивания выгружает все записи, попадающие под текущие фильтры, в JSON-файл с полными данными (заголовки, тело запроса и ответа целиком, без сокращений) — удобно для разбора инцидента или передачи в поддержку.

Записи лога хранятся 7 дней, затем удаляются автоматически ежедневной очисткой. Для истории дольше недели используйте экспорт заранее.