- PVSM.RU - https://www.pvsm.ru -
Skype – отличный канал для оперативной коммуникации с клиентами. Он есть у всех и обеспечивает быстрое живое общение без лишних телодвижений и затрат (например, на телефонную связь). Однако, когда количество клиентов исчисляется тысячами, преимущества Skype начинают превращаться в недостатки. В этой статье мы расскажем о нашем Skype-боте, по сути, выполняющем роль телефонистки начала 20-го века: он соединяет клиента со свободным менеджером и поддерживает эту связь до решения вопроса.
Перед школой Skyeng всегда стояла задача создания удобного канала связи между мессенджарами и операторами службы поддержки пользователей. Мессенджер, который сейчас принимает у нас наибольшее число заявок, – Skype. Когда количество контактов в Skype исчисляется тысячами, общение напрямую через клиент Skype становится проблематичным. Во-первых, производительность этого клиента при такой работе падает почти до нуля, контакт-лист подгружается непозволительно долго. Во-вторых, часто нескольким операторам нужно вести параллельную связь с пользователями; использование одного Skype-аккаунта на нескольких устройствах возможно, но входящие сообщения из всех диалогов видны всем операторам, что мешает работе. Кроме того, все коммуникации в Skype остаются в самом Skype, для их извлечения во внутренние CRM или HelpDesk системы приходится заниматься копи-пейстом.
Эти трудности привели нас к решению создать чат-бот, который будет служить точкой входа для сообщений в службу поддержки. Тема чат-ботов в последнее время весьма популярна, и Microsoft предоставила доступ к Skype REST API, к которому прилагается SDK [1] с примерами для C# и Node.js.
Для полноценной многоканальной связи недостаточно лишь приема сообщений, их надо еще доставить куда-то, где оператор сможет их прочитать. Поскольку наша школа активно использует Slack в своих внутренних коммуникациях, и этот мессенджер обладает хорошей поддержкой концепции каналов, было решено переправлять входящие сообщения туда.
В результате мы создали модель с точками входа и выхода, внутри которой мы имеем полный контроль над потоками данных.
Система не подразумевает каких-то сложных вычислений на сервере; основные ее задачи – прием, хранение и роутинг данных. Поэтому в качестве основной платформы был выбран Node.js [2], хорошо подходящий для подобных задач. Взяли последнюю доступную LTS версию, на момент старта проекта – 6.3.0. Согласно node.green [3] шестерка покрывает 95% ES 2015, что весьма приятно, а nodesource-блог [4] обещает ее функционирование вплоть до апреля 2018, после чего начнется фаза maintenance. Годится.
К базе данных каких-то особых требований нет, поэтому взяли классическую надежную реляционку в виде PostgreSQL [5].
Чтобы обеспечить достаточно высокую отказоустойчивость, возможность масштабирования и в то же время низкую связанность компонентов, было принято решение включить в архитектуру очереди сообщений в виде RabbitMQ [6] для обмена данными между модулями системы.
В результате получилась следующая схема работы:
Система состоит из трех основных сервисов (Skype service, Logic service, Slack service) и дополнительного микро-сервиса Slack messaging micro-service. Основная задача Slack service – обеспечение работы endpoint-а для Skype-бота и отправка сообщений в Skype. Logic service отвечает за роутинг сообщений, хранение сообщений, обработку команд и предоставление API для интеграции с внутренними сервисами школы. Slack service имеет подписку к Slack RTM [7] и отвечает за endpoint по приемке команд от операторов поддержки в Slack.
Дополнительный Slack messaging micro-service понадобился для того, чтобы уверенно отправлять сообщения в Slack, не боясь превысить лимиты Slack API [8], поэтому сообщения отправляются путем long-polling считывания их по таймеру из RabbitMQ и передачи в Slack.
Использование preview-версий инструментов всегда несет в себе определенный риск, поскольку к моменту релиза в них могут произойти серьезные изменения или, что еще хуже, этот релиз вообще не состоится. Именно такая участь постигла SDK для разработки Skype-ботов: он появился в виде preview и в этом же виде состарился (получил статус deprecated). После этого создание новых ботов исключительно для Skype стало невозможным, а затем и вовсе появились редирект на Microsoft Bot Framework и предупреждение о необходимости мигрировать в ближайшее время.
Microsoft Bot Framework – это попытка Microsoft охватить множество каналов связи в одном инструменте. На данный момент поддерживаются: Facebook Messenger, Kik, Slack, Telegram, Skype и даже такие каналы, как Email, Twilio (SMS) и Direct Line. Все это интересно, но на данном этапе нас интересовал только Skype (хотя задел, конечно, хороший, можно впоследствии добавить поддержку других мессенджеров с меньшими трудозатратами).
Мы не стали ждать и мигрировали сразу. Регистрация нового бота в Microsoft Bot Framework проста, достаточно иметь аккаунт Microsoft.
Алгоритм следующий:
На странице регистрации есть поле 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 [10].
Также стоит отметить, что если в Skype Bot SDK мы надеялись иметь возможность по id пользователя примерно понимать, с кем имеем дело, то в Microsoft Bot Framework все пользователи представлены в виде длинных хэшей, что делает собеседников анонимным. Задачу определения личности можно решить только в живом диалоге с пользователем.
Еще один любопытный момент – редактирование отправленных ботом сообщений. В Skype Bot SDK, как говорят некоторые пользователи github [11], такая возможность была, а вот в Microsoft Bot Framework именно для Skype ее нет (хотя для других платформ, в частности Telegram и Slack, это возможно).
Тем не менее, Microsoft Bot Framework – хороший шаг к унификации платформы разработки ботов для различных каналов коммуникаций. Остается надеяться, что Microsoft продолжит развитие этого продукта и добавит недостающие сейчас функции для Skype-ботов.
Для организации многоканальной приемки сообщений мы воспользовались таким инструментом Slack, как приватные каналы; в терминологии Slack API это groups [12].
Первоначально мы рассчитывали, что нам будет достаточно создания одного Custom Bot [13]'а, который покроет весь функционал отправки сообщений в Slack: создаст там приватный канал, добавит туда оператора и дальше будет обеспечивать proxy-коммуникацию. Выяснилось, однако, что боты в Slack не имеют права создавать приватные каналы.
Поэтому кроме подключенного к Slack RTM Api [7] Custom Bot’а мы создали еще и Slack-приложение, которое от лица обычного пользователя Slack создает приватные каналы и приглашает в них операторов.
Slack API достаточно стабилен, хорошо документирован и содержит даже онлайн-тестер, позволяющий проверить вызов методов, поэтому других сюрпризов, к счастью, не было. Для работы с ним мы взяли вот этот весьма простой npm пакет [14]: он удобен, поскольку его методы в большинстве своем повторяют одноименные методы Slack API.
Для того, чтобы ваш бот заработал, он должен получить одобрение со стороны Microsoft. Казалось бы, простая формальность, но у нас на нее ушло немало времени и сил. Мы расскажем про грабли, на которые наступили сами, но это не значит, что вы не наступите на какие-нибудь еще; будьте к этому готовы.
Итак, через две недели после первого сабмита мы получили это:
с пояснением: 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 на английском; окей, написали, вывесили [15], отправили новую заявку.
На сей раз отлуп пришел быстрее:
Наш бот призван только связывать клиента с оператором. По мнению Microsoft, этого мало. Пришлось прикрутить минимальный функционал – пару команд, на которые бот сможет реагировать самостоятельно (help и lessons-count).
Пока мы выполняли эти требования, появилось новое: бот должен уметь по команде выдавать Terms of Service и Privacy Policy (просто наличия их на сайте недостаточно). Окей, сделали и это. Оказалось, что этого мало, условия должны присутствовать в каждом сообщении. Хорошо. Тем временем, в лондонском офисе Microsoft начались массовые перестановки, из-за чего одобрение опять раз за разом откладывалось…
Но в конце концов мы получили долгожданный апрув:
Все эти махинации отняли у нас огромное количество времени, будьте готовы к непредвиденным и иногда малообъяснимым задержкам.
В результате мы получили Skype-бота, обеспечивающего быструю качественную реакцию на входящие сообщения и разговаривающего с клиентом «как живой» (что неудивительно, учитывая, что управляет им оператор). Ушли в прошлое ответы не в тот канал и пропущенные входящие контакты; «ваш вопрос очень важен для нас» – не пустые слова, сейчас ни одно сообщение не потеряется, а беседа не затухнет по нашей вине. При этом были решены проблемы обычного Skype, а коммуникации приобрели структурированную форму, которую мы интегрировали в наши внутренние сервисы поддержки пользователей. А вся «магия» – в незамысловатой архитектуре роутинга сообщений между разными платформами.
PS Напоминаем, что наши двери открыты для разных талантливых специалистов [16]!
Автор: Ontaelio
Источник [17]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/node-js/261187
Ссылки в тексте:
[1] SDK: https://developer.microsoft.com/en-us/skype/bots/downloads
[2] Node.js: https://nodejs.org/
[3] node.green: http://node.green/
[4] nodesource-блог: https://nodesource.com/blog/essential-steps-long-term-support-for-nodejs/
[5] PostgreSQL: https://www.postgresql.org/
[6] RabbitMQ: https://www.rabbitmq.com/
[7] Slack RTM: https://api.slack.com/rtm
[8] лимиты Slack API: https://api.slack.com/docs/rate-limits
[9] ссылке: https://dev.botframework.com/bots/new
[10] UniversalBot: https://github.com/Microsoft/BotBuilder/blob/master/Node/core/src/bots/UniversalBot.ts
[11] некоторые пользователи github: https://github.com/Microsoft/BotBuilder/issues/1050#issuecomment-242457477
[12] groups: https://api.slack.com/methods
[13] Custom Bot: https://api.slack.com/bot-users
[14] npm пакет: https://www.npmjs.com/package/slack
[15] вывесили: http://skyeng.ru/policy
[16] разных талантливых специалистов: https://moikrug.ru/companies/skyeng/vacancies
[17] Источник: https://habrahabr.ru/post/309602/
Нажмите здесь для печати.