Опыт интеграции IP-телефонии с системой helpdesk через гаджет для Windows 7

в 6:03, , рубрики: CRM, freeswitch, helpdesk, ip-телефония, метки: , ,

Задача

Итак, нам захотелось странного: вот сидит на поддержке сотрудник, если ему поступил звонок, то надо автоматически открыть окно с существующей системой helpdesk, в которое бы передался номер телефона с которого звонят. Для удобства — пришёл звонок, спец сразу видит, что за компьютер, какое его сетевое имя, имя пользователя, что за железо/софт/услуги… База данных сотрудников и всего прочего с их телефонами уже есть, теперь как это связать на автомате?

Предлагаемое решение

Сразу скажу, что IP-телефония у нас выполнена на FreeSWITCH и решение будет заточено под него.
Для связи с helpdesk'ом нам достаточно вызвать окно браузера с определённой строкой адреса в которую должен быть добавлен номер телефона звонящего. Что-то типа, например: myserver.org/helpdesk/requests.php?command=new&phonenum=1072
Во FreeSWITCH'е есть замечательный модуль mod_event_socket, который позволяет общаться с FreeSWITCH'ом через сокеты. Я написал скрипт на PHP, который сидит на веб-сервере (не обязательно он должен быть на той же машине, что и FreeSWITCH), подключается к FreeSWITCH'у и производит подписку на получение событий о звонке.
Далее у нас есть клиентский HTML+Javascript+jQuery файл, который запускается у клиента на машине и обращается к этому скрипту (AJAX). После получения события о звонке запускается другое окно браузера с определенным адресом в который также передаётся номер звонящего.
И ещё небольшой момент: каждый раз запускать этот файл что-то не хочется, надо чтобы он сидел где-нибудь не очень заметно. Надо — сделаем, а сделано это созданием гаджета для Windows 7/Vista. Ну вот так сложилось — нет у нас рабочих станций с линуксом. В принципе, можно было бы, конечно, написать специальную программу, которая бы сидела в трее и делала всё, но, но, не могу дать логического объяснения почему я этого не сделал.
Получилось всё достаточно небольшим, назвал я этого зверя FreeSWITCH call popup (fscp).

Серверная часть

Серверная часть выполнена одним простеньким PHP'шным скриптом: fscp.php
Он может размещаться на любом веб сервере, имеющим доступ к FreeSWITCH'у.
Доступ осуществляется посредством mod_event_socket.
В самом начале файла определяются переменные, значения которых надо заполнить из файла autoload_configs/event_socket.conf.xml:

$FreeSWITCHserver = '127.0.0.1';	// параметр listen-ip
$FreeSWITCHport = 8021;			// параметр listen-port
$FreeSWITCHpassword = 'ClueCon';	// параметр password

Конечно не забываем включить mod_event_socket в autoload_configs/modules.conf.xml

<load module="mod_event_socket" />

Для подключения к FreeSWITCH используем inbound socket.
Подключаемся и подписываемся на приём событий:
event plain ALL
Ставим два фильтра:
filter Event-Name HEARTBEAT
filter Caller-Destination-Number account
Событие heartbeat во FreeSWITCH генерируется каждые 20 секунд. Мы его используем для того, чтобы в цикле ожидания события от FreeSWITCH не превысить максимальное время выполнения PHP скрипта (max_execution_time) и корректно выйти из цикла.
Далее в цикле ожидаем прихода события от FreeSWITCH. Если нам приходит событие CHANNEL_CREATE, то оборачиваем его в JSON ответ и оправляем клиенту.
Всё, скрипт достаточно простой.

Клиентская часть

Поскольку мы обращаемся за данными на другой сайт, то клиентская часть получает данные от сервера через JSONP. Клиент выполняет запрос AJAX, ожидает, пока не поступит нужное событие, если поступает событие heartbeat, оно просто игнорируется и запрос выполняется заново. Если поступает нужное событие, то дальнейшие действия выполняются в зависимости от настроек, но в любом случае звонок записывается на экран гаджета.
Выполняются следующие настройки:
Server address — URL на котором установлен наш скрипт fscp.php (строку указывать полностью, включая http:// и имя скрипта). Например: myserver.com/special/fscp.php
Account — номер телефона (аккаунта) во FreeSWITCH, события от которого мы отслеживаем.
Action — действие при звонке на этот номер:
no action — ничего не делать, звонок просто отобразится в окне гаджета
show alert window — показать окно оповещения о звонке
call address — вызвать браузер с указанным адресом
show prompt then call address — показать окно оповещения о звонке и только из него, при нажатии кнопки пользователем вызвать браузер с указанным адресом. Это делается потому, что звонков может поступать много, но не на каждый надо делать действие, например, делать запись в helpdesk'е.
Два последние варианта предусматривают вызов какого-то сайта. При этом надо указать строку вызова полностью, включая http://
В качестве параметра система может передавать номер телефона с которого пришел звонок. Этот параметр: %CALLERID% (case sensitive). Например:
myserver.com/helpdesk/add_call.php?number=%CALLERID%

Заключение

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

  1. Нет никакой авторизации, т.е. я могу в принципе указать любой номер телефона в настройках и смотреть, кто звонит на него. Плохо ли это — не могу сказать однозначно. Мне, например, всё равно кто и когда звонит генеральному директору :-).
  2. Вызываемое окно не открывается поверх других окон, его надо «поднимать» самому. Если кто-то предложит решение этой проблемы — буду премного благодарен!

Файлы можно скачать отсюда.

Автор: Freeswitched

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


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