Botbrother

HTTP-запрос: как отправить данные подписчика в CRM, n8n или на свой сервер

HTTP-запрос: как отправить данные подписчика в CRM, n8n или на свой сервер

В конструкторе появилось действие «HTTP-запрос». Шаг сценария отправляет событие на ваш адрес — свой сервер, n8n, Make, Zapier или CRM. В событии — id подписчика в мессенджере, имя, username, телефон, email и все его заполненные переменные. Ответ сервера бот может сохранить в переменную, а дальше поведёт подписчика по ветке «при успехе» или «при ошибке». Работает в Telegram, MAX и ВКонтакте.

Зачем это нужно

  • лид в CRM сразу после анкеты — с телефоном, ответами и id в мессенджере, без выгрузок;
  • сценарий в n8n или Make — событие расходится дальше: в таблицу, чат команды, сервис рассылок;
  • персональная ссылка от сервера — на оплату, личный кабинет или промокод: сервер возвращает её в ответе, бот показывает подписчику;
  • проверка по вашей базе — есть ли такой клиент и какой у него статус, а дальше — условие;
  • лид из MAX — с id пользователя и id чата с ботом, чтобы ваша система знала, кому в MAX принадлежит заявка.

Как настроить

  1. Откройте рубрику и добавьте действие «HTTP-запрос» — оно среди интеграций, рядом с Google Таблицами.
  2. Вставьте адрес (URL). Для n8n и Make это адрес вебхука из их сценария.
  3. Выберите метод: POST отправит JSON со всеми данными подписчика, GET — только адрес, без тела.
  4. По желанию задайте секрет для подписи — как её проверить, ниже.
  5. Если сервер что-то возвращает, выберите переменную для ответа и, если нужно, поле в JSON-ответе: data.link или items[0].url. Пустое поле — ответ сохранится целиком.
  6. Укажите переходы «При успехе» и «При ошибке» и пройдите сценарий сами: событие придёт на ваш адрес с вашими данными.

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

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 в мессенджере: chat id в Telegram, id пользователя в MAX и ВКонтакте. chatId — id чата с ботом; у MAX это другое число, поэтому всегда приходят оба. В variables — заполненные переменные по их ключам. Если подписчик не делился телефоном или почтой, поля придут пустыми.

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

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

Каждый запрос несёт X-Webhook-Timestamp — время отправки этой попытки в секундах Unix (у каждого повтора своё). Если задан секрет, добавляется X-Webhook-Signature — sha256= и HMAC-SHA256 от строки «время + точка + данные», где данные — сырое тело для 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, а не обычным равенством, и отклоняйте слишком старые запросы: так перехваченное событие не получится прислать ещё раз.

Повторы и дубли

Бот ждёт ответа до 10 секунд. Нет ответа (сбой сети, таймаут) или ответ 408, 429, 5xx — будут ещё две попытки, через 10 и 60 секунд, с тем же телом. Заголовок X-Webhook-Delivery и поле deliveryId во всех попытках одинаковые: сохраняйте их и не обрабатывайте одно событие дважды — на повтор просто ответьте 200. На ответ 4xx и перенаправление повторов нет: подписчик сразу пойдёт по ветке «при ошибке» (а если она не выбрана — к следующему действию). Событие, которое ждало отправки дольше суток — например, бот был остановлен, — не отправляется вовсе.

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

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

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

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

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

В переменную сохраняется ответ до 64 КБ. Если ответ длиннее, не JSON при заданном пути или нужного поля в нём нет — сценарий пойдёт по ветке «при ошибке».

Ограничения

  • адрес — http:// или https://, до 2000 символов, домены на кириллице (.рф) тоже; переменные — только в пути и параметрах;
  • если переменная в пути адреса пуста, запрос не отправляется — сценарий идёт по ветке «при ошибке»;
  • запросы на локальные, внутренние и частные адреса и служебные порты (SSH, почта, базы данных) заблокированы — адрес должен быть доступен из интернета;
  • по перенаправлениям бот не ходит — указывайте конечный адрес;
  • в событии — до 200 переменных, значение каждой — до 4000 символов;
  • секрет после сохранения не показывается: его можно только заменить или убрать;
  • настраивать действие могут сотрудники с доступом к разделу «Пользователи» или полным доступом — остальные видят только адрес сервера без пути.

Через нейросеть и MCP

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

Формат события, подпись и пределы собраны на странице «HTTP-запрос из бота». Остальные интеграции — на странице функций конструктора, а оповещения команды о заявках — в профилях оповещений. Для ботов MAX — подробнее на странице конструктора ботов MAX.

Создайте своего бота в Telegram, MAX или ВКонтакте

Без кода — или словами через нейросеть по MCP: рассылки, приём оплат, брони, управление каналами. 200 ₽ на баланс для старта.

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

Ещё по теме