Микросервис на платформе — это 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нужен именно тогда, когда важно передать в следующий узел конкретные данные или направить сценарий по одной из веток в зависимости от результата.