Как создать микросервис на Python и подключить в сценарий

Микросервис на платформе — это Python-скрипт, который вы пишете прямо в интерфейсе, а выполняет его сама платформа в своей песочнице — в тот момент, когда до него доходит очередь в процедуре. Разворачивать ничего не нужно.

Находится это в разделе Лаборатория → Микросервисы.

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

В форме создания три обязательных блока:

  • Название — по нему микросервис будет вызываться из процедуры.
  • Требуемые переменные — имена переменных, которые код ожидает получить из контекста узла. Каждое такое имя становится в коде обычной Python-переменной — объявлять или импортировать её не нужно, платформа подставит значение сама. Единственное ограничение: нельзя называть переменную name или context — эти имена зарезервированы платформой.
  • Код — сам Python-код микросервиса.

Что доступно внутри кода

Кроме переменных из «Требуемых переменных», в коде доступны:

  • обычные библиотеки Python для работы с сетью и данными — например, requests, json, urllib.parse;
  • send_system_message("текст") — отправляет служебное сообщение, удобно для логирования на время отладки: видно, что реально произошло на каждом шаге;
  • push_node("Название узла", ключ=значение, ...) — передаёт управление обратно в сценарий, в указанный узел, и опционально передает туда данные, которые будут доступны через get_params

Тестирование прямо в редакторе

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

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

Вызывается микросервис тегом

{% microservice %}
— по названию, с именованными аргументами, которые совпадают с «Требуемыми переменными»:

{% microservice "Отправка лида во внешнюю CRM систему" phone_number=phone_number user_name=attributes.profile_full_name utm_source="Сайт" utm_campaign=utm_campaign %}

Значения аргументов — это обычные выражения DTL: переменные процедуры, атрибуты профиля (attributes.profile_...), строковые константы — всё то же самое, что и в любом другом теге.

Два практических паттерна

Обратиться во внешний сервис и залогировать результат. Микросервис собирает запрос из переданных переменных, отправляет его через requests, а результат — независимо от того, успешно или нет — пишет через send_system_message, чтобы было видно при отладке:

import requests
response = requests.post(
 "https://example.com/",
 params={
    "utm_source": utm_source,
    "utm_campaign": utm_campaign
},
 files={
    "name": (None,
    user_name),
    "phone": (None,
    phone_number),
},
)
if response.status_code == 200:
 send_system_message("Logger: Успешно отправлено!")
 send_system_message(f"Logger: Статус код: {response.status_code}")
 send_system_message(f"Logger: {response.text}")
else:
 send_system_message(f"Logger: Ошибка отправки: {response.status_code}")
 send_system_message(f"Logger: Текст ошибки: {response.text}")

Обработать данные и продолжить сценарий с результатом или без. Микросервис разбирает то, что ему передали, и в зависимости от результата вызывает push_node с разным набором аргументов — сценарий продолжается в любом случае, просто с разными данными на входе:

import json
from urllib.parse import unquote
decoded_string = unquote(encoded_url)
data = json.loads(decoded_string)
sub_url = data.get("currentPage")
if sub_url:
 clean_url = sub_url.split("?")[0]
 push_node("сохранить страницу подписки с виджета", sub_url=clean_url)
else:
 push_node("сохранить страницу подписки с виджета")

Важно: push_node — это функция, с помощью которой явно запускается определенный узел бота. Если его не вызвать (как в первом примере с логированием), логика после микросервиса всё равно продолжится — push_node нужен именно тогда, когда важно передать в следующий узел конкретные данные или направить сценарий по одной из веток в зависимости от результата.