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

Предпосылки и подготовка

  1. У вас должна быть учетная запись песочницы RingCentral или производственная учетная запись RingCentral, чтобы попробовать демо-приложение.
  2. Вы знаете, как настроить свою учетную запись песочницы для исходящих и входящих вызовов.
  3. У вас есть приложение с потоком паролей или вы знаете, как создать новое приложение, чтобы получить идентификатор клиента приложения и секрет клиента, необходимые для демонстрации.

Я буду использовать Node JS, инфраструктуру веб-приложений Express и RingCentral Node JS SDK для создания приложения.

Примечание. Приведенные в этой статье фрагменты кода короче и предназначены только для иллюстрации. Они могут не работать напрямую с копированием / вставкой. Рекомендую скачать весь проект отсюда.

Чтение расширений аккаунта

Первый шаг - прочитать все расширения под учетной записью и создать список расширений, в котором мы будем хранить идентификатор и имя расширения. В следующем фрагменте кода показано, как прочитать всю информацию о расширениях из учетной записи, проанализировать идентификатор и имя каждого расширения и сохранить их в массиве «extensionList». Код также показывает вам, как читать все расширения большой компании, у которой есть тысячи расширений. Поскольку каждый вызов API будет возвращать не более 1000 расширений (записей), поэтому мы будем проверять свойство «nextPage» и рекурсивно вызывать функцию «readAccountExtensions (uri)» с «uri» следующей страницы до тех пор, пока не закончится следующая страница для звонка.

Подписка на уведомления о событиях сеанса телефонной связи

Следующим шагом является подписка на уведомления о событиях сеанса телефонной связи. Как я уже говорил в своем первом блоге, вам решать, как указать фильтры подписки. Если вы хотите подписаться на несколько расширений, но не на все расширения в своей учетной записи, вы можете использовать список расширений для создания массива фильтров событий только с расширениями, которые вы хотите отслеживать. В этой демонстрации мы используем уровень учетной записи для подписки на все расширения. Мы также указываем для параметра expiresIn максимальное значение (20 лет), поэтому наше уведомление будет работать непрерывно без необходимости его продлевать.

Примечание при запуске демонстрации с туннелем ngrok:

  1. Чтобы запустить демонстрационное приложение на вашем локальном компьютере, туннельный сеанс будет отключен через несколько часов (зависит от тарифного плана), что сделает адрес веб-перехватчика недоступным. В этом случае вам нужно будет удалить старую подписку и создать новую.
  2. В зависимости от тарифного плана ngrok ограничение на количество подключений может составлять от 40 до 120 подключений в минуту. Если вы запустите демонстрацию на загруженной учетной записи, вы легко достигнете лимита, и подписка будет заблокирована. В этом случае уменьшите количество уведомлений, не используя подписку на уровне учетной записи.

Реализуйте класс обработчика событий

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

После получения списка всех расширений мы создаем объект «eventHandler» и внутри конструктора evenHandler мы создаем новый список расширений с именем «monitoredExtensionList», который содержит список объектов расширений. Каждый объект расширения содержит идентификатор расширения, имя расширения и массив «activeCalls». Причина, по которой мы определяем «activeCalls» как массив, заключается в том, что у внутреннего абонента может быть несколько активных вызовов одновременно. Если вы не хотите обрабатывать события вызова некоторых расширений, вы можете исключить их при создании «monitoredExtensionList».

Теперь давайте определим элементы данных активного объекта вызова:

Активный объект вызова выше должен содержать достаточно информации для нашего демонстрационного приложения. Вы всегда можете изменить его в соответствии с требованиями вашего реального приложения.

Получение и анализ событий сеанса телефонной связи

Каждый раз, когда мы получаем событие уведомления, мы вызываем функцию processNotification (), в которой мы анализируем полезную нагрузку события, чтобы определить, является ли это событие нового вызова или событие изменения стадии вызова существующего вызова, затем мы извлекаем данные вызова. и соответственно создать или обновить данные активного вызова.

Для каждого события мы анализируем полезную нагрузку события, считываем идентификатор расширения из объекта «members». Если идентификатор расширения существует, мы будем использовать идентификатор расширения, чтобы найти объект расширения из списка отслеживаемых расширений. Затем мы используем идентификатор стороны для поиска активного объекта вызова в массиве «activeCalls» этого объекта расширения. Если активный объект вызова найден, мы проанализируем информацию о вызове и обновим этот активный объект вызова. В противном случае мы создаем новый активный объект вызова и добавляем его в массив «activeCalls» этого объекта расширения.

Создайте активный объект вызова

Уведомление о сеансе вызова начинается с события «Установка» и заканчивается событием «Отключено». По сути, мы можем создать новый активный объект вызова всякий раз, когда мы получаем событие «Setup». Однако, как я объяснил в своем первом блоге, события уведомлений могут не поступать в том же порядке, в котором они были созданы, из-за некоторой сетевой ситуации. Проблема с выходом из строя возникает не очень часто, но мы все равно должны заниматься этим, когда это происходит. Есть 2 способа решить проблему. Первый способ - поместить все события из одного сеанса вызова в массив, а затем отсортировать массив по порядковым номерам или по метке времени события. Второй способ - проверить массив «activeCalls», чтобы узнать, существует ли активный вызов. Если нет активного вызова с тем же идентификатором вызывающей стороны, мы создаем новый объект активного вызова и добавляем его в массив «activeCalls». Поскольку мы готовимся к аварийной ситуации событий, мы будем проверять статус события в обоих случаях. См. Иллюстрированный код ниже:

Запись отметки времени этапа вызова

Мы уже определили поля данных отметки времени в активном объекте вызова, теперь мы можем фиксировать «eventTime» каждого события и преобразовывать строку времени в отметку времени этапа вызова следующим образом:

Как видите, я также записал временные метки местного времени, когда звонок начинает звонить, соединяться и удерживаться. Эти дополнительные временные метки будут использоваться для расчета и отображения продолжительности в реальном времени, что я объясню в следующем разделе.

Рассчитайте продолжительность звонков

Мы определили поля данных продолжительности звонка в активном объекте звонка, теперь мы вычисляем длительность звонка с использованием временных меток этапа следующим образом:

Продолжительность звонка - это разница во времени между call.ringTimestamp и call.connectTimestamp. Мы можем рассматривать продолжительность звонка как время ответа агента на входящий звонок.

Когда вызов переводится агентом в режим ожидания, мы получаем событие с кодом состояния «Удержание». И когда агент отменит удержание вызова, мы получим событие с кодом статуса «Отвечено». Таким образом, продолжительность удержания вызова - это разница во времени между «call.holdTimestamp» и отметкой времени, когда этап вызова изменяется с «Удержание» на «Отвечено», как показано в приведенном выше коде.

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

Функция pollActiveCalls () вызывается каждый раз (каждую секунду в этой демонстрации), когда клиентская сторона отправляет запрос информации об активных вызовах.

Обнаружение завершения вызова

Когда вызов завершается, мы получим два события уведомления, одно для агента и одно для клиента. Было бы интересно узнать, какая из сторон вешает трубку, и особенно, если вызов был прерван во время удержания. Мы можем полагаться на порядок последовательностей событий «Отключено», чтобы определить, кто положит трубку. Мы также используем call.status, чтобы определить, завершен ли вызов во время удержания.

Определение и обнаружение вызовов и результатов вызова

Мы определяем набор действий при вызове, чтобы классифицировать окончательный статус вызова как «Подключен», «Отменен», «Пропущенный вызов», «Голосовая почта» или «Припаркован». Когда вызов завершается, мы используем последовательности изменения статуса вызова, чтобы указать окончательный статус вызова и вызвать окончательный результат, как показано ниже:

Сохранение данных о звонках в базе данных

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

Отображение информации о звонках

В нашем демонстрационном приложении мы реализуем 3 панели мониторинга (в реальном времени, статистика звонков и отчеты), чтобы мы могли по-разному представлять информацию о звонках. чтобы отображать информацию о звонках в реальном времени, мы каждую секунду опрашиваем информацию об активных звонках и отображаем их на панели управления, как показано на скриншоте ниже.

Также мы можем отображать статистику звонков в таблице:

Или используя графику:

Ознакомьтесь с реализацией клиентской части из файлов JavaScript main.js, calllogs.js и report.js.

Установите и запустите демонстрационное приложение на локальном компьютере

Следуйте инструкциям из файла README, чтобы клонировать, настроить проект и запустить демонстрацию. Если вы не хотите создавать свой собственный проект и по-прежнему хотите запускать живую демонстрацию в своей песочнице или производственной учетной записи, откройте эту ссылку и войдите в свою учетную запись RingCentral с учетными данными администратора, чтобы настроить список отслеживаемых расширений (только пользователь admin может запускать настройки для добавления расширений в список отслеживаемых расширений), после настройки любые другие пользователи в вашей учетной записи могут войти в систему, чтобы увидеть живую демонстрацию.

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

Хотите быть в курсе и узнавать о новых API и функциях? Присоединяйтесь к нашей программе Game Changer и получайте отличные награды за развитие своих навыков и изучение RingCentral больше!