Приложение 2. Паттерны разработки
Общие рекомендации
Нумерация темсценариев
В заголовке сценария рекомендуется указывать порядковый номер По темам рекомендуемая нумерация и наименование – в наименование порядковый номер. Приоритет = номер * 1000. Например, 1 => 1000, 1.2 => 1200, т.д.для удобства коммуникаций в ходе настройки.
Нумерация команд
По командам – приоритеты с шагом в 100.
Структура меню
- Каждая тема должна включать кнопку В начало, которая ведет к главному меню.
- Рекомендуется уровень вложенности не более трех (главное меню, меню для областираздела, и конкретная операции).
- В случае, если тема, вложенная более, чем на уровень 2, то должна быть кнопка, возвращающая к предыдущему действию
Первичная инициализация бота
В разных каналах инициализация бота идет по-разному. Например, в Telegram приходит текст /start. И пользователь бота ожидает, что отправка /start в любой момент приведет к перезапуску бота. Поэтому надо обеспечить, чтобы инициализация выполнялась и по первой фразе и по тексту /start.
Сложность в том, что при первом вызове тема может быть вызвана дважды: через инициализацию и по тексте. Решается это следующим образом:
- В начале стартовый темы устанавливается признак IsHelloShown = 1
- После установки признака запускается таймер на минуту для вызова темы [Очистка признака Hello] (код ResetHello)
- В теме [Очистка признака Hello] устанавливать IsHelloShown = 0
Формы сбора данных
Частой бизнес задачей является получение данных от клиента. Для решения задачи предназначена команда Получение данных.
В зависимости от формата запрашиваемых данных могут применяться следующий варианты:
- Получение произвольного текста
В случае запроса произвольного текста используется команда получения данных с пустым значением регулярного выражения.
- Получение текста по шаблону
Применяется если шаблон может быть проверен через регулярные выражения. Такое регулярное выражение указывается для команды получения данных.
- Получение текста со сложной проверкой
В таком сценарии командой Получения данных запрашивается строка без проверки формата. А затем в отдельном сценарии проводиться проверка полученного значения требуемыми алгоритмами.
Взаимодействие с внешними API
Для этого используется следующий паттерн:
- Задаются две темы.
- Тема А, указывающая что клиент должен ввести.
Например, «укажите Ваше ФИО»
- Тема Б, получающая данные
- Обработка текста клиента осуществляется следующим образом
- В теме А отражается запрос информации
- Для темы Б указывается логическое условие, что она выполняется после темы A (Последняя тема = “Тема А”)
- В события добавляется событие на произвольное сообщение клиента (маска *) для темы Б
- В самой теме Б выполняется необходимая обработка полученной информации.
- При последовательном сборе данных в каждую тему включается условие ее выполнения после предыдущей.
Обработка вопроса (текста) по умолчанию
В каждом боте необходимо реализовать ветку обработки текста, который не ожидается ботом. Для этого надо сделать событие на произвольный текст (шаблон *) и установить его последним по приоритету.
Такая тема должна:
- Переходить к основному поиску, если основной функцией бота является поиска (пример, поиск лекарств для Marko бота, поиск услуг для оплаты для Фрисби бота)
- Отражать текст о том, что бот не понял вопрос, и кнопку для перехода к основным функциям для бота.
- Отражать текст о том, что бот не понял вопрос, и переводить на оператора, если есть чат-центр
Как избавиться от текста «Выберите»
Выберите отражается по умолчанию, если при отправке кнопок не было ни одного текста. Вы можете до отправки кнопок отправить текстовое сообщение. Кнопки будут автоматически к нему присоединены. И текста "Выберите" не будет
Оправка изображений, стикеров и видео в боте
Для отправки изображений, стикеров и видео Sherlock Platform поддерживает дополнительные смарт теги:
- Для отправки изображения (или другого вложения) в тексте сообщения бота или шаблона можно использовать тег:
{"“tag_type"”:"image", "“title"”:"Пример фото", "“image_link"”:"” url_изображения "”}, где
tag_type – всегда image,
title – произвольное название изображения для пользователя,
image_link – ссылка на изображение
Имя файла в боте при этом может вычисляться через переменные. Например: {"“tag_type"”:"image", "“title"”:" #photo_name# ", "“image_link"”:"” #photo_url# "”}
Основное отличие применения данной функции от просто отправки ссылки в том, что файл обрабатывается и направляется в мессенджер как вложение. В зависимости от мессенджера просто ссылка и отправленный файл обрабатываются и отражаются мессенджером по различной логике.
- Специальная отправка видео сейчас поддерживается для ВКонтакте. Необходимость такой поддержки связана с тем, что при отправке видео как вложения или ссылки ВКонтакте не отражает плеер для видео.
Для отправки видео в родном формате ВКонтакте необходимо использовать смарт тег следующего формата:
{"“tag_type"”:"video", "“title"”:"Пример видео", "“video_vk_code"”:"53921536_456239079", "“video_link"”:"”url_видео", "video_vk_hash":"hash_видео_ВК"” }, где
tag_type – всегда video,
title – произвольное название видео для пользователя,
video_link – ссылка на видео для каналов, кроме ВКонтакте,
video_vk_code – идентификатор видео, загруженного ВКонтакте. Для получения данного идентификатора необходимо загрузить требуемое видео в группу и взять идентификатор из ссылки https://vk.com/video-134183993_456239025
video_vk_hash – необходимо для встраивания видео внутрь Sherlock
- Для отправки стикеров в Телеграм реализован смарт тег следующего формата
{"“tag_type"”:"sticker", "“title"”:"Пример стикера", "“sticker_tg_code"”: "CAADAgADCQMAAkb7rASr28NYSp2EigI", "“image_link"”:"” url_изображения "”}, где
tag_type – всегда sticker,
title – произвольное название стикера для пользователя,
sticker_tg_code – стикер для отправки. Строка с file_id файла, ранее загруженного на сервера Телеграмм (рекомендуется), или URL изображения.webp файла в Интернет, или непосредственно файл в формате multipart/form-data,
image_link – ссылка на избражение для каналов, кроме Telegram.
Для получения file_id стикера есть простой бот https://telegram.me/GetStickerIdBot
Поиск по XML с учетом Namespace
/*[local-name()='My_RootNode']/*[local-name()='id']
Смотри https://stackoverflow.com/questions/1089196/selectsinglenode-returning-null-for-known-good-xml-node-path-using-xpath