Skype-бот с человеческим лицом (на Microsoft Bot Framework V3 и Slack API)

в 8:38, , рубрики: Microsoft Bot Framework, node.js, RabbitMQ, Slack API, Блог компании Skyeng, Бот для скайпа, клиентский сервис, Системы обмена сообщениями, метки:

Skype-бот с человеческим лицом (на Microsoft Bot Framework V3 и Slack API) - 1

Skype – отличный канал для оперативной коммуникации с клиентами. Он есть у всех и обеспечивает быстрое живое общение без лишних телодвижений и затрат (например, на телефонную связь). Однако, когда количество клиентов исчисляется тысячами, преимущества Skype начинают превращаться в недостатки. В этой статье мы расскажем о нашем Skype-боте, по сути, выполняющем роль телефонистки начала 20-го века: он соединяет клиента со свободным менеджером и поддерживает эту связь до решения вопроса.

Перед школой Skyeng всегда стояла задача создания удобного канала связи между мессенджарами и операторами службы поддержки пользователей. Мессенджер, который сейчас принимает у нас наибольшее число заявок, – Skype. Когда количество контактов в Skype исчисляется тысячами, общение напрямую через клиент Skype становится проблематичным. Во-первых, производительность этого клиента при такой работе падает почти до нуля, контакт-лист подгружается непозволительно долго. Во-вторых, часто нескольким операторам нужно вести параллельную связь с пользователями; использование одного Skype-аккаунта на нескольких устройствах возможно, но входящие сообщения из всех диалогов видны всем операторам, что мешает работе. Кроме того, все коммуникации в Skype остаются в самом Skype, для их извлечения во внутренние CRM или HelpDesk системы приходится заниматься копи-пейстом.

Эти трудности привели нас к решению создать чат-бот, который будет служить точкой входа для сообщений в службу поддержки. Тема чат-ботов в последнее время весьма популярна, и Microsoft предоставила доступ к Skype REST API, к которому прилагается SDK с примерами для C# и Node.js.

Для полноценной многоканальной связи недостаточно лишь приема сообщений, их надо еще доставить куда-то, где оператор сможет их прочитать. Поскольку наша школа активно использует Slack в своих внутренних коммуникациях, и этот мессенджер обладает хорошей поддержкой концепции каналов, было решено переправлять входящие сообщения туда.

В результате мы создали модель с точками входа и выхода, внутри которой мы имеем полный контроль над потоками данных.

Skype-бот с человеческим лицом (на Microsoft Bot Framework V3 и Slack API) - 2

Архитектура

Система не подразумевает каких-то сложных вычислений на сервере; основные ее задачи – прием, хранение и роутинг данных. Поэтому в качестве основной платформы был выбран Node.js, хорошо подходящий для подобных задач. Взяли последнюю доступную LTS версию, на момент старта проекта – 6.3.0. Согласно node.green шестерка покрывает 95% ES 2015, что весьма приятно, а nodesource-блог обещает ее функционирование вплоть до апреля 2018, после чего начнется фаза maintenance. Годится.

Skype-бот с человеческим лицом (на Microsoft Bot Framework V3 и Slack API) - 3

К базе данных каких-то особых требований нет, поэтому взяли классическую надежную реляционку в виде PostgreSQL.

Чтобы обеспечить достаточно высокую отказоустойчивость, возможность масштабирования и в то же время низкую связанность компонентов, было принято решение включить в архитектуру очереди сообщений в виде RabbitMQ для обмена данными между модулями системы.

В результате получилась следующая схема работы:

Skype-бот с человеческим лицом (на Microsoft Bot Framework V3 и Slack API) - 4

Система состоит из трех основных сервисов (Skype service, Logic service, Slack service) и дополнительного микро-сервиса Slack messaging micro-service. Основная задача Slack service – обеспечение работы endpoint-а для Skype-бота и отправка сообщений в Skype. Logic service отвечает за роутинг сообщений, хранение сообщений, обработку команд и предоставление API для интеграции с внутренними сервисами школы. Slack service имеет подписку к Slack RTM и отвечает за endpoint по приемке команд от операторов поддержки в Slack.

Дополнительный Slack messaging micro-service понадобился для того, чтобы уверенно отправлять сообщения в Slack, не боясь превысить лимиты Slack API, поэтому сообщения отправляются путем long-polling считывания их по таймеру из RabbitMQ и передачи в Slack.

Можно ли доверять Preview? Миграция на Microsoft Bot Framework

Использование preview-версий инструментов всегда несет в себе определенный риск, поскольку к моменту релиза в них могут произойти серьезные изменения или, что еще хуже, этот релиз вообще не состоится. Именно такая участь постигла SDK для разработки Skype-ботов: он появился в виде preview и в этом же виде состарился (получил статус deprecated). После этого создание новых ботов исключительно для Skype стало невозможным, а затем и вовсе появились редирект на Microsoft Bot Framework и предупреждение о необходимости мигрировать в ближайшее время.

Skype-бот с человеческим лицом (на Microsoft Bot Framework V3 и Slack API) - 5
Skype-бот с человеческим лицом (на Microsoft Bot Framework V3 и Slack API) - 6

Microsoft Bot Framework – это попытка Microsoft охватить множество каналов связи в одном инструменте. На данный момент поддерживаются: Facebook Messenger, Kik, Slack, Telegram, Skype и даже такие каналы, как Email, Twilio (SMS) и Direct Line. Все это интересно, но на данном этапе нас интересовал только Skype (хотя задел, конечно, хороший, можно впоследствии добавить поддержку других мессенджеров с меньшими трудозатратами).

Skype-бот с человеческим лицом (на Microsoft Bot Framework V3 и Slack API) - 7

Мы не стали ждать и мигрировали сразу. Регистрация нового бота в Microsoft Bot Framework проста, достаточно иметь аккаунт Microsoft.

Алгоритм следующий:

  • пройти по ссылке;
  • заполнить все поля со звездочкой;
  • нажать Create Microsoft App ID and Password;
  • откроется новая страница, на которой нужно ввести название приложения например TestBotApp;
  • далее кнопка Generate a password to continue;
  • сгенерированный пароль нужно где-то себе сохранить, поскольку посмотреть повторно его уже нельзя, а он понадобится для работы с Framework и App ID;
  • далее кнопка Finish and go back to Bot Framework;
  • на странице регистрации нужно принять соглашение и нажать Register, после чего у нас есть готовый зарегистрированный бот для Microsoft Bot Framework

На странице регистрации есть поле Messaging endpoint, оно не обязательно для регистрации, но это точка входа для бота, без которой он не будет функционировать. Основное требование к endpoint'у – это должна быть рабочая HTTPS-ссылка.

В плане миграции кода больших изменений делать не пришлось, поскольку все, что должен уметь наш бот – это принимать и отправлять сообщения. Тем не менее, код для того же функционала стал побольше:

bot.send(
   '8:skype.username',
   'message from bot to user',
   true, // escape
   (error) => console.log(error)
);

превратилось в

bot.send(
   new builder.Message()
   .address({
       channelId: "skype",
       user: {
           id: "29:some-long-hash-here",
           name: "User Display Name"
       },
       bot: {
           id: "28:bot-uuid",
           name: "Bot Name"
       },
       serviceUrl: "https://skype.botframework.com",
       useAuth: true
   })
   .text('Message from bot to user'),
   (err) => console.log(err)
);

И небольшие изменения приема сообщений:

bot.on('personalMessage', (bot, data) => {
 console.log('Got message from user');
});

Поскольку в Bot Framework есть такое понятие, как диалоги, но нам нужно было просто получать сообщения, то мы сделали подписку на самый общий диалог, который представлен слэшем; он будет принимать все входящие сообщения:

bot.dialog("/", [
   (session) => {
       console.log("Got message from bot", session.message);
   }
]);

В приведенных фрагментах кода bot в случае Skype Bot SDK – экземпляр класса BotService, а на Bot Framework это уже UniversalBot.

Также стоит отметить, что если в Skype Bot SDK мы надеялись иметь возможность по id пользователя примерно понимать, с кем имеем дело, то в Microsoft Bot Framework все пользователи представлены в виде длинных хэшей, что делает собеседников анонимным. Задачу определения личности можно решить только в живом диалоге с пользователем.

Еще один любопытный момент – редактирование отправленных ботом сообщений. В Skype Bot SDK, как говорят некоторые пользователи github, такая возможность была, а вот в Microsoft Bot Framework именно для Skype ее нет (хотя для других платформ, в частности Telegram и Slack, это возможно).

Тем не менее, Microsoft Bot Framework – хороший шаг к унификации платформы разработки ботов для различных каналов коммуникаций. Остается надеяться, что Microsoft продолжит развитие этого продукта и добавит недостающие сейчас функции для Skype-ботов.

Встречаем сообщения в Slack

Для организации многоканальной приемки сообщений мы воспользовались таким инструментом Slack, как приватные каналы; в терминологии Slack API это groups.

Первоначально мы рассчитывали, что нам будет достаточно создания одного Custom Bot'а, который покроет весь функционал отправки сообщений в Slack: создаст там приватный канал, добавит туда оператора и дальше будет обеспечивать proxy-коммуникацию. Выяснилось, однако, что боты в Slack не имеют права создавать приватные каналы.

Поэтому кроме подключенного к Slack RTM Api Custom Bot’а мы создали еще и Slack-приложение, которое от лица обычного пользователя Slack создает приватные каналы и приглашает в них операторов.

Slack API достаточно стабилен, хорошо документирован и содержит даже онлайн-тестер, позволяющий проверить вызов методов, поэтому других сюрпризов, к счастью, не было. Для работы с ним мы взяли вот этот весьма простой npm пакет: он удобен, поскольку его методы в большинстве своем повторяют одноименные методы Slack API.

Не все так просто!

Для того, чтобы ваш бот заработал, он должен получить одобрение со стороны Microsoft. Казалось бы, простая формальность, но у нас на нее ушло немало времени и сил. Мы расскажем про грабли, на которые наступили сами, но это не значит, что вы не наступите на какие-нибудь еще; будьте к этому готовы.

Итак, через две недели после первого сабмита мы получили это:

Skype-бот с человеческим лицом (на Microsoft Bot Framework V3 и Slack API) - 8

с пояснением: Bot content is in Russian language. At this time, Skype Bots only support English Users. Please provide a translation or alternative option for users to read and use the bot in English («ваш бот на русском, а надо, чтобы он умел общаться с пользователями по-английски»). Как выяснилось, для решения этой проблемы достаточно иметь Terms of Service и Privacy Policy на английском; окей, написали, вывесили, отправили новую заявку.

На сей раз отлуп пришел быстрее:

Skype-бот с человеческим лицом (на Microsoft Bot Framework V3 и Slack API) - 9

Наш бот призван только связывать клиента с оператором. По мнению Microsoft, этого мало. Пришлось прикрутить минимальный функционал – пару команд, на которые бот сможет реагировать самостоятельно (help и lessons-count).

Пока мы выполняли эти требования, появилось новое: бот должен уметь по команде выдавать Terms of Service и Privacy Policy (просто наличия их на сайте недостаточно). Окей, сделали и это. Оказалось, что этого мало, условия должны присутствовать в каждом сообщении. Хорошо. Тем временем, в лондонском офисе Microsoft начались массовые перестановки, из-за чего одобрение опять раз за разом откладывалось…

Но в конце концов мы получили долгожданный апрув:

Skype-бот с человеческим лицом (на Microsoft Bot Framework V3 и Slack API) - 10

Все эти махинации отняли у нас огромное количество времени, будьте готовы к непредвиденным и иногда малообъяснимым задержкам.

Заключение

В результате мы получили Skype-бота, обеспечивающего быструю качественную реакцию на входящие сообщения и разговаривающего с клиентом «как живой» (что неудивительно, учитывая, что управляет им оператор). Ушли в прошлое ответы не в тот канал и пропущенные входящие контакты; «ваш вопрос очень важен для нас» – не пустые слова, сейчас ни одно сообщение не потеряется, а беседа не затухнет по нашей вине. При этом были решены проблемы обычного Skype, а коммуникации приобрели структурированную форму, которую мы интегрировали в наши внутренние сервисы поддержки пользователей. А вся «магия» – в незамысловатой архитектуре роутинга сообщений между разными платформами.

PS Напоминаем, что наши двери открыты для разных талантливых специалистов!

Автор: Ontaelio

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js