Структура контекста + JSON Path
JSON Path
Если в значении переменной находится JSON-массив или JSON-объект, то можно получить конкретное свойство этого объекта, просто дописав его путь к переменной через точку.
Например для такого объекта object
со значением
Значение идентификатора первого пользователя можно получить так:
{var:object.users[0].id}
Для поиска значений используется библиотека JMESPath: примеры и документация.
В названиях переменных и полей нельзя использовать точки именно по этой причине. Точка - это погружение внутрь объекта переменной.
Все JSON объекты, которые приведены ниже (и спрятаны под спойлерами), разобраны на примере события Входящее сообщение и запроса из Телеграм.
Объект события
Самые важные данные события, для использования в схеме
Часто используемые переменные:
{var:object.id}
- ID объекта (сообщения, комментария и т. п.){var:object.text}
- текст события (например, текст сообщения){var:object.type}
- тип объекта. Например, есть такие типы:message
- сообщениеcomment
- комментарийpost
- постnotice
- уведомление (в чате)admin
- объект администратора чата (с правами)invite_link
- пригласительная ссылка
{var:object.post.id}
- ID поста где произошло событие (например, пост комментария)
Данные платформы
Обработанные данные входящих запросов
Часто используемые переменные :
{var:platform.short_name}
- мессенджер в котором произошло событие{var:platform.contact.type}
- тип контакта, по которому событие ищет пользователя{var:platform.integration.id}
- внешний ID бота (или аккаунта), с которым произошло событие{var:platform.chat.id}
- текущий чат - в котором произошло событие{var:platform.author.id}
- автор отвеченного сообщения - ID пользователя (на внешней платформе), который написал сообщение, на которое ответили.
Объект блок-схемы
Внутренние идентификаторы для локальных проверок
ID пользователя здесь - это ID пользователя в проектеЧасто используемые переменные :
{var:graph.item.id}
- ID текущей блок-схемы{var:graph.integration.id}
- ID интеграции, которая запустила события{var:platform.short_name}
- тип платформы интеграции (находится в объекте платформы){var:graph.project.id}
- ID проекта в котором была запущена схема{var:graph.event.localId}
- Системный номер блока (#) события, которое запустило схему{var:graph.restore.localId}
- Системный номер блока (#), который восстановил* схему{var:graph.path}
- Путь пользователя по схеме в рамках ветки, в виде массиваlocalId
. Учитываются все типы объектов схемы: порты, блоки, стрелки, контейнеры.{var:graph.template.id}
- ID текущего шаблона{var:template}
- все переменные текущего шаблона
* - Работа схемы останавливается например, когда пользователь попадает на входящий порт события. Этот момент можно назвать “началом ожидания события“. Когда событие наконец происходит, схема восстанавливается со всеми данными начиная с номера блока этого (промежуточного) события.
Объект пользователей сервиса
Пользователи сервиса, с которыми произошло событие (в рамках проекта).
ID пользователя здесь - это ID пользователя в проекте
Часто используемые переменные :
{var:users.user.id}
- ID пользователя в проекте{var:users.user.first_name}
- Имя пользователя в проекте{case:{var:users.user.appeal}|обращение на Вы|женщинам|мужчинам}
- разный текст в зависимости от пола пользователя (для многих мессенджеров, чтобы это заработало пол надо спросить у пользователя и сохранить в профиль){var:users.user.contact.tg_id[0]}
- первый контакт указанного типа Типы контактов:tg_id
- ID в Telegramvk_id
- ID в VKphone
- номер телефонаemail
- электронный адрес
Внимание: Данные пользователя можно перезаписывать функциями бота. Но будьте внимательны, назад надо возвращать вручную, предварительно сохранив исходное значение.
В пути к переменным контактов как правило добавляется [0] потому что мы достаем первый из контактов определенного типа. Например у пользователя может быть несколько номеров телефона или несколько аккаунтов в телеграм. Для настроек, где важно получать определенный контакт, лучше доставать ID-шку из данных платформы
Входящий запрос
Необработанные данные входящего запроса (события).
{var:request}
— оригинальный входящий запрос полностью.
Например, вам нужно достать имя отправителя.
Получится переменная:{var:request.message.from.first_name}
Или проверить купил ли он Телеграм премиум:{var:request.message.from.is_premium}
Результат действия
Каждое действие (в том числе сообщение и таймер) перезаписывает в контексте три переменных:
1) Успешно ли выполнилось действие:
{var:ok}
где:
ok = true
- нет ошибок, всё хорошо, можно работать дальшеok = false
- есть ошибки, смотрите детали в{var:error.message}
В условиях рекомендуется проверять через «Числовую переменную» где true
это 1
а false
это 0
2) Полезная нагрузка действия:
{var:result}
Каждое действие выполняет какую-то операцию. И возвращает какие-то полезные данные. Возможно вы захотите использовать их, проверять в следующем блоке или сохранить их часть в собственные переменные для использования по всей схеме.
3) Важные данные из результата работы конкретного типа действия:
{var:effect}
Например, исходящее сообщение записывает сюда внешний идентификатор отправленного сообщения (в рамках платформы) для более удобного редактирования этого сообщения позже:
{var:effect.message.id}
4) Детали ошибки. Если ошибки не было, то {var:error}
будет равно None
{var:error}
При этом {var:error}
содержит различную системную информацию, из которой самое важное это сообщение с описанием проблемы.
{var:error.message}
Пример использования
Можно визуально выделить успешный результат выполнения действия при помощи этой комбинации литералов:
Пример готового текста сообщения для полного результата действия:
Второй пример результата, где ошибка показывается только если действие выполнено не успешно. Когда всё ОК, показывается только результат
Результат условия
Условия тоже имеют результат выполнения, но для удобства записывают его в отдельную переменную: {var:condition}
1) Условие отработало без ошибок:
2) Результат проверки условия. Возможные значения: true
, false
, null
, которые, собственно, и влияют на то, по какому выходу пойдет пользователь:
3) Детали ошибки, если ошибки есть. Если нет вернет undefined
Всё работает аналогично как и в действиях, только немного другой путь к переменным
Last updated