Botbrother
Новое: действие «HTTP-запрос»

Данные подписчика — на ваш сервер прямо из сценария

Шаг сценария отправляет событие на ваш адрес — свой сервер, n8n, Make, Zapier или CRM: id подписчика в мессенджере, имя, телефон, email и переменные. Ответ сервера бот сохранит в переменную и поведёт подписчика дальше.

Telegram, MAX и ВКонтакте id подписчика в мессенджере Подпись секретом и повторы без дублей
Возможности

Что умеет действие «HTTP-запрос»

Одно действие — и данные из бота попадают в систему, где вы работаете, без выгрузок и ручного переноса.

01

Событие из нужного шага

Поставьте действие «HTTP-запрос» в рубрику — после анкеты, записи или оплаты. Бот отправит событие ровно тогда, когда подписчик дошёл до этого шага, а не раз в час по расписанию.

02

id подписчика в мессенджере

В событии есть platformId — id человека в Telegram, MAX или ВКонтакте — и chatId — id чата с ботом (у MAX это другое число). По ним ваша система найдёт подписчика без ручной сверки.

03

Контакты и переменные

Имя, username, телефон и email, если подписчик ими поделился, и все его заполненные переменные — ответы анкеты, город, выбранный тариф. Ключи — те же, что в шаблонах {{$Variable->ключ}}.

04

POST или GET

POST отправляет JSON со всеми данными. GET уходит без тела: нужные значения вставляются в адрес — https://example.com/hook?id={{$SystemVar->userid}}. Значения экранируются сами, а хост переменной быть не может.

05

Ответ — в переменную

Ответ сервера можно сохранить в переменную подписчика целиком или взять одно поле по пути: data.link, items[0].url. Дальше его можно показать в сообщении или проверить условием.

06

Ветки успеха и ошибки

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

07

Повторы без дублей

Бот ждёт ответа до 10 секунд. При сбое сети, таймауте или ответе 408, 429, 5xx — ещё две попытки, через 10 и 60 секунд. Заголовок X-Webhook-Delivery одинаков во всех попытках: повтор легко отличить от нового события.

08

Подпись секретом

Каждый запрос несёт время отправки в X-Webhook-Timestamp. Задайте секрет — и к нему добавится подпись HMAC-SHA256 в X-Webhook-Signature: ваш сервер проверит, что событие пришло от вашего бота и не устарело.

09

Telegram, MAX и ВКонтакте

Действие одинаково работает на трёх платформах. Создаётся в панели или через нейросеть по MCP — там только ключом с полным доступом: действие решает, куда уходят данные подписчиков.

Для разработчика

Что придёт на ваш адрес

POST-запрос несёт JSON такого вида — здесь подписчик бота MAX:

{
  "event": "step",
  "deliveryId": "9f1c…",
  "time": "2026-10-27T18:00:00+03:00",
  "bot": {"id": 7, "platform": "max", "username": "shopbot"},
  "step": {"id": 11, "category": 5, "name": "В CRM"},
  "user": {
    "id": 42,
    "platform": "max",
    "platformId": "5550001",
    "chatId": "-70001234",
    "firstName": "Анна",
    "username": "anna",
    "phone": "+79990001122",
    "email": "a@b.ru"
  },
  "variables": {"city": "Казань"}
}

Поле user.id — id подписчика в BotBrother, platformId — его id в мессенджере, chatId — id чата с ботом (у MAX он отличается от id пользователя). В variables — заполненные переменные подписчика по их ключам. Телефона, почты или переменных нет — поля придут пустыми.

Вместе с телом приходят заголовки:

POST /hook HTTP/1.1
Content-Type: application/json
User-Agent: Bot-Webhook/1
X-Webhook-Event: step
X-Webhook-Delivery: 9f1c…
X-Webhook-Timestamp: 1793113200
X-Webhook-Signature: sha256=5d41…

GET-запрос уходит без тела: в нём только то, что вы вставили в адрес, например https://example.com/hook?id={{$SystemVar->userid}}&city={{$Variable->city}}.

Как проверить подпись

Если в действии задан секрет, заголовок X-Webhook-Signature содержит sha256= и HMAC-SHA256 от строки «время + точка + данные запроса», где время — значение X-Webhook-Timestamp (секунды Unix, у каждой попытки своё). Данные — сырое тело для POST и путь с параметрами для GET. Пример на Python:

import hashlib
import hmac
import time

SECRET = b"ваш-секрет"

def verify_signature(headers, payload: bytes) -> bool:
    # payload — сырое тело POST-запроса, как пришло,
    # или путь с параметрами для GET-запроса
    ts = headers.get("X-Webhook-Timestamp", "")
    sig = headers.get("X-Webhook-Signature", "")
    # старше 5 минут — отклоняем: у каждой попытки своё время, дубли отсекайте по X-Webhook-Delivery
    if not ts.isdigit() or abs(time.time() - int(ts)) > 300:
        return False
    msg = ts.encode() + b"." + payload
    digest = hmac.new(SECRET, msg, hashlib.sha256).hexdigest()
    return hmac.compare_digest("sha256=" + digest, sig)

Считайте подпись по телу в том виде, в каком оно пришло, — до разбора JSON: после разбора и обратной сборки байты могут отличаться. Сравнивайте через hmac.compare_digest, а не обычным равенством.

Как вернуть ответ

Любой ответ 2xx — успех. Если в действии выбрана переменная, бот сохранит в неё ответ целиком или одно поле по пути. Для ответа ниже путь data.link запишет в переменную ссылку, и следующее «Сообщение» покажет её подписчику:

HTTP/1.1 200 OK
Content-Type: application/json

{"data": {"link": "https://example.com/pay/42"}}

Пошаговая настройка — в инструкции в блоге.

Сценарии

Для чего подключают «HTTP-запрос»

01

Лид в CRM

Подписчик заполнил анкету — шаг отправляет имя, телефон, ответы и id в мессенджере в вашу CRM. Менеджер видит заявку сразу, а не после выгрузки.

02

n8n, Make, Zapier

Вставьте адрес вебхука сценария n8n или Make — дальше событие разойдётся куда нужно: в таблицу, мессенджер команды, почту, сервис рассылок.

03

Свой сервер

Обработчик на любом языке принимает JSON, проверяет подпись и делает своё: заводит заказ, начисляет доступ, пишет в базу.

04

Лид из MAX с id чата

У подписчика MAX событие несёт и id пользователя, и id чата с ботом. Ваша система сохраняет их вместе с заявкой — и знает, кому именно в MAX она принадлежит.

05

Персональная ссылка от сервера

Сервер создаёт ссылку на оплату, личный кабинет или промокод и возвращает её в ответе. Бот сохраняет поле data.link в переменную и тут же показывает подписчику.

06

Проверка по вашей базе

GET-запрос с id подписчика в адресе спрашивает ваш сервер: есть ли такой клиент, какой у него статус. Ответ — в переменную, дальше — условие.

Как это работает

Как настроить: 3 шага

Адрес, подпись и ветки — без кода на стороне бота.

1

Добавьте действие

В рубрике нажмите «новое действие» → «HTTP-запрос». Укажите адрес (https://…) и метод: POST — с данными подписчика, GET — только адрес.

Войти в панель
2

Настройте подпись и ответ

По желанию задайте секрет для подписи, переменную для ответа и путь к полю в JSON-ответе — например data.link. Пустой путь сохранит ответ целиком.

Попробовать бесплатно
3

Задайте ветки и проверьте

Выберите, куда перейти «при успехе» и «при ошибке». Пройдите сценарий сами — событие придёт на ваш адрес с вашими же данными.

Начать сейчас
Честно об ограничениях

Пределы и правила

Ожидание ответа до 10 секунд на попытку; успех — любой ответ 2xx
Повторы при сбое сети, таймауте, ответе 408, 429 и 5xx — ещё две попытки, через 10 и 60 секунд; другие коды 4xx не повторяются
Старые события событие, ждавшее отправки дольше суток (бот был остановлен или не оплачен), не отправляется — ветка «при ошибке»
Перенаправления бот по ним не ходит — укажите конечный адрес
Адрес http:// или https://, до 2000 символов, домены на кириллице (.рф) тоже; переменные — только в пути и параметрах; пустая переменная в пути — запрос не отправляется, ветка «при ошибке»
Закрытые адреса localhost, внутренние и частные сети, служебные порты (SSH, почта, базы данных) заблокированы
Ответ в переменную до 64 КБ, не длиннее лимита переменной; длиннее 64 КБ, не JSON при заданном пути или нет нужного поля — ветка «при ошибке»; путь — до 200 символов
Переменные в событии до 200 переменных, значение — до 4000 символов
Секрет до 128 символов; после сохранения не показывается — его можно только заменить или убрать
Кто настраивает сотрудники с доступом к разделу «Пользователи» или полным доступом; остальные видят только адрес сервера без пути
У нас есть ответы

Вопросы о «HTTP-запросе»

Чем «HTTP-запрос» отличается от API?

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

Что такое platformId и chatId?

platformId — id подписчика в самом мессенджере: в Telegram это chat id личной переписки, в MAX и ВКонтакте — id пользователя. chatId — id чата с ботом; у MAX это другое число, чем id пользователя, поэтому в событии всегда передаются оба. Поле user.id — внутренний id подписчика в BotBrother, его же даёт {{$SystemVar->userid}}.

Что будет, если мой сервер не ответил?

Бот ждёт ответа до 10 секунд. Если ответа нет или сервер вернул 408, 429 или 5xx, будут ещё две попытки — через 10 и 60 секунд. Не помогло — подписчик пойдёт по ветке «при ошибке» (а если она не выбрана — к следующему действию). На ответ 4xx и перенаправление повторов нет: такую ошибку повтор не исправит.

Как не обработать одно событие дважды?

Запоминайте deliveryId — он же приходит в заголовке X-Webhook-Delivery и одинаков во всех повторах одного события. Если такой id уже обработан, просто ответьте 200 и ничего не делайте.

Обязательно ли задавать секрет?

Нет, но мы советуем. Без секрета ваш адрес примет запрос от кого угодно, кто его узнал. С секретом каждый запрос подписан: сервер проверяет X-Webhook-Signature и время из X-Webhook-Timestamp и отклоняет чужое и устаревшее.

Можно ли отправить запрос на localhost или во внутреннюю сеть?

Нет. Запросы на локальные, внутренние и частные адреса заблокированы. Адрес должен быть доступен из интернета — например, ваш сервер, облачная функция или вебхук n8n и Make.

Работает ли это в MAX и ВКонтакте?

Да, действие одинаково работает в Telegram, MAX и ВКонтакте. Отличается только содержимое: platformId у каждой платформы свой, а chatId у MAX отличается от id пользователя.

Можно ли настроить действие через нейросеть?

Да, через MCP ассистент создаст и поправит «HTTP-запрос», как любое другое действие. Но только ключом с полным доступом: действие решает, куда уходят данные подписчиков, поэтому ключу с ограниченными правами оно недоступно. Сохранённый секрет ассистент не видит — только маску.

Зачислим 200 рублей для тестов при регистрации

Подключите бота к своей системе

Создайте бота, добавьте «HTTP-запрос» и посмотрите, как событие приходит на ваш адрес, — 200 ₽ на баланс для старта.

Смотрите также