Спросить ИИ
Русский RU
Перейти в Watbot

Входящий Webhook

Блок принимает запрос от стороннего сервиса и выполняет ваш код на JavaScript. Так сценарий можно продолжить по событию снаружи: пришла оплата, изменился статус заказа, сработал датчик.

Панель настроек блока «Входящий Webhook»Панель настроек блока «Входящий Webhook»

В этот блок не ведут связи из других блоков: он запускается только запросом.

Настройки

  • «URL для запросов» — адрес, который нужно вызвать. Он выдаётся блоку при создании и выглядит так: https://api.<домен платформы>/hook/<ID блока>:<секретный ключ>. Подходит любой метод — GET, POST и другие.
  • «Код JavaScript для обработки запроса» — код, который выполняется на каждый запрос, до 16 384 символов.

Внимание

Адрес содержит секретный ключ. Любой, кто знает адрес, может запустить ваш код — не публикуйте его.

Что приходит в код

Запрос лежит в объекте request:

Поле Что в нём
request.query Параметры из строки запроса
request.headers Заголовки запроса, имена — строчными буквами
request.body Тело запроса строкой, как оно пришло
request.data Все параметры запроса вместе: из строки запроса, формы и тела в формате JSON

Подробнее о полях и о том, как проверить подпись запроса, — в разделе «Встроенные переменные».

Запрос приходит не от человека, поэтому код сам должен указать, для какого контакта он выполняется. Для этого есть функции:

Функция Как ищет контакта
setContactById(id) По ID контакта на платформе
setContactByTelegramId(id) По ID человека в Telegram
setContactByMaxId(id) По ID человека в MAX
setContactByVkId(id) По ID человека во ВКонтакте
setContactByViberId(id) По ID человека в Viber

Подробнее о каждой функции — на странице «Выбор контакта».

Функция возвращает true, если контакт найден среди контактов этого бота, и false, если нет. Вызвать такую функцию можно один раз за запрос. Хотя бы одна из них обязана быть в коде — иначе блок ответит ошибкой и код не запустится.

После того как контакт найден, коду доступны его данные (id, name, phone и остальные) и все функции блока «Интерпретатор JavaScript»: переменные, теги, sendMessage, goToBlock, disableContinue.

var contactId = request.query.contact_id;

if (setContactById(contactId)) {
    setContactVariable('статус_заказа', request.data.status);
    sendMessage('Статус вашего заказа изменился.');
}

Чтобы внешний сервис знал ID контакта, передайте его заранее — например, блоком «HTTP-запрос» с автоподстановкой {{ id }}.

Важно

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

Выходы

  • «Продолжить» — срабатывает после выполнения кода, если контакт найден и код не вызвал disableContinue().

Что блок отвечает

Ответ — JSON с полями status (ok или error), message и return_value — значением последнего выражения в коде.

Код ответа Когда
200 Код выполнен. Если контакт не найден, в message будет Code executed without setting contact
404 Неправильный адрес: нет такого блока или не подходит ключ
422 Ошибка в коде, поле кода пустое, в коде нет функции поиска контакта или у владельца бота нет Pro
429 Слишком много запросов

Каждый запрос и ответ на него записываются в «Лог выполнения» блока.

«Лог выполнения» входящего webhook: метод, параметры и тело запроса, значение кода и ответ блока«Лог выполнения» входящего webhook: метод, параметры и тело запроса, значение кода и ответ блока

Ограничения

  • Блок работает, только пока у владельца бота действует Pro. Подробнее — что доступно без Pro.
  • Не более 30 запросов за 10 секунд на одного бота — на все его блоки «Входящий Webhook» вместе — и не более 180 запросов в минуту с одного IP-адреса.
  • На код действуют те же ограничения, что в блоке «Интерпретатор JavaScript»: ES5 и 5 секунд на выполнение.

Запросы от Telegram и MAX

Блок может получать всё, что мессенджер присылает вашему боту. В окне подключения Telegram или MAX включите переключатель «Ретранслировать запросы на блок "Входящий Webhook"» и в поле «Блок» выберите блок по ID или имени.

После этого каждое событие мессенджера сначала обрабатывает бот — как обычно, по сценарию, — а затем оно передаётся в код блока. Событие в том виде, в каком его прислал мессенджер, лежит в request.data.

Так можно реагировать на то, что сценарий сам не обрабатывает: сообщения в группах и каналах, добавление бота в чат. Запросы встроенного режима Telegram в блок не передаются.

var message = request.data.message;

if (message && message.from && setContactByTelegramId(message.from.id)) {
    setContactTag('писал_в_группе');
    disableContinue();
}

Такие события идут в счёт того же ограничения по числу запросов в минуту.