Запитати ШІ
Українська UK
Перейти до 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();
}

Такі події йдуть у рахунок того самого обмеження за кількістю запитів на хвилину.