Дмитрий Кайдаш
30.03.2021
654

Интеграция с EnvyCRM

Описание: в этой статье будет рассмотрена интеграция программной АТС на базе asterisk с внешним сервисом EnvyCRM. Ожидаемые результаты: Аналитика – ведение учёта входящих вызовов, передача номера и времени звонящего Записи разговоров – возможность прослушать и скачать файл из CRM Click2call – вызов из карточки клиента по его номеру Аналитика. Для предоставления информации о входящих вызовах […]

Описание: в этой статье будет рассмотрена интеграция программной АТС на базе asterisk с внешним сервисом EnvyCRM. Ожидаемые результаты:

  1. Аналитика – ведение учёта входящих вызовов, передача номера и времени звонящего
  2. Записи разговоров – возможность прослушать и скачать файл из CRM
  3. Click2call – вызов из карточки клиента по его номеру
Внимание! Все действия проводились на следующем оборудовании: 1. CentOS Linux release 7.5.1804; 2. FreePBX 13; 3. Asterisk 13.22.0; 4. PHP 5.6. На других работа не гарантируется или потребуются корректировки.

Аналитика.

Для предоставления информации о входящих вызовах нам потребуется получить такие данные как:

  • Время и дата начала звонка
  • Номер звонящего
  • Номер ответившего (null – если разговор не состоялся)
  • Продолжительность звонка
  • Статус дозвона
  • Ссылку на запись разговора
  • Уникальный идентификатор

После чего сформировать массив данных и отправить их в CRM-систему.

Внимание! EnvyCRM работает только с POST-запросами. Внимание! EnvyCRM необходимо получать два набора данных о каждом входящем вызове: при его начале, и по окончании. Данные которые невозможно окончательно определить при начале вызова заглушаются значением null.

Для решения этого вопроса есть два возможные варианта: написание собственного «демона», который будет подключаться к AMI, получать, анализировать и информировать CRM-систему о состоянии звонка или скрипт вызываемый из диалплана. Первый вариант сложнее и требует от интегратора значительных временных затрат и опыта в программировании. Второй доступен более широкому кругу пользователей программных АТС. На нем и остановимся, поскольку документация CRM-системы так же рекомендует придерживаться этого способа.

Скрипт получится следующим:

#!/usr/bin/php -q
<?php

define('CRM_HOST', 'https://bp911.envycrm.com/hook/callapi/');
define('ATS_HOST', 'http://192.168.0.15/envycrm/getfile.php?recordfile=');

function postSslQuery($url='', $data='') {
	$link = curl_init($url) or die("Can't connect to cURL");
	curl_setopt($link, CURLOPT_POST, true);
	curl_setopt($link, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($link, CURLOPT_POSTFIELDS, http_build_query($data));
	curl_setopt($link, CURLOPT_RETURNTRANSFER, true);
	$data = curl_exec($link);
	curl_close($link);
	//return $data;
}

switch ($argv['1']) {
		case 'start':
				$data = array(
						'calldate' => $argv['2'],
						'direction' => 'incoming',
						'source' => $argv['3'],
						'destination' => 'null',
						'duration' => 'null',
						'status' => 'null',
						'record_url' => 'null',
						'event' => 'START',
						'uid' => $argv['4']
				);
				break;
		case 'end':
				$data = array(
						'calldate' => $argv['2'],
						'direction' => 'incoming',
						'source' => $argv['3'],
						'destination' => $argv['4'],
						'duration' => $argv['5'],
						'status' => $argv['6'],
						'record_url' => ATS_HOST.$argv['7'],
						'event' => 'END',
						'uid' => $argv['7']
				);
				break;
		default:
				$data = $array();
				break;
}
	
if(!empty($data)) postSslQuery(CRM_HOST, $data);

?>
Внимание! Поскольку выполнять скрипт будет не web-браузер, а чистый php обязательно добавить в самое начало дополнительный заголовок интерпретатора: #!/usr/bin/php –q

Скрипт размещаем в директории /var/lib/asterisk/agi-bin/envycrmapi.php и даём права на исполнение:


# chmod a+x /var/lib/asterisk/agi-bin/envycrmapi.php
Скрипт оповещения CRM-системы
Скрипт оповещения CRM-системы

Далее нам необходимо настроить взаимодействие asterisk с этим скриптом. Для этого правим файл:

# nano /etc/asterisk/extensions_custom.conf

Дописываем в него дополнительные контексты:

[from-trunk-pre]
exten =>  _X.,1,NoOp(----==== Sub-from-trunk  ====----)
same => n,Gosub(from-envy-crm,begin,1)
same => n,Goto(from-trunk,${EXTEN},1)

[from-envy-crm]
exten => begin,1,NoOp(----==== envyCRM begin event ====----)
same => n,System(/usr/bin/php /var/lib/asterisk/agi-bin/envycrmapi.php start "${STRFTIME(${EPOCH},,%Y-%d-%m %H:%M:%S)}" ${CALLERID(num)} ${CDR(uniqueid)})
same => n,Return()

exten => end,1,NoOp(----==== envyCRM end event ====----)
same => n,ExecIf($["${DIALSTATUS}"="ANSWER"]?Set(disposition=ANSWER):Set(disposition=NO ANSWER))
same => n,Set(dst=${CUT(DIALEDPEERNUMBER,\/,1)})
same => n,Set(dst=${CUT(dst,\@,1)})
same => n,ExecIf($["${dst}"=""]?Set(dst=none))
same => n,ExecIf($["${ANSWEREDTIME}"!=""]?Set(time=${ANSWEREDTIME}):Set(time=0))
same => n,System(/usr/bin/php /var/lib/asterisk/agi-bin/envycrmapi.php end "${STRFTIME(${EPOCH},,%Y-%d-%m %H:%M:%S)}" ${CALLERID(num)} ${dst} ${time} "${disposition}" ${CDR(uniqueid)})
same => n,DumpChan()
same => n,Return()

from-trunk-pre – отвечает за предварительную обработку всех звонков. Вызывает дополнительный контекст from-envy-crm

from-envy-crm – оповещает CRM-систему о начале и завершении вызова через запрос к скрипту

Поскольку этот диалплан является кастомным – прямых обращений к нему не будет. Нужно связать с активными звонками. Для этого в транках меняем контексты на from-trunk-pre. Таким образом мы завернём все звонки в наш контекст, а после него уже на обычный inbound routes.

Что касается завершения вызова нам нужно внести правки в файл:

# nano /etc/asterisk/extensions_override_freepbx.conf

Допишем в конец файла:

[ext-group]
exten => h,1,NoOp(----==== post rgroup calls ====----)
same => n,GoSub(from-envy-crm,end,1)
same => n,Macro(hangupcall,)

[ext-local]
exten => h,1,NoOp(----==== post directdial calls ====----)
same => n,GoSub(from-envy-crm,end,1)
same => n,Macro(hangupcall,)

[from-internal]
exten => h,1,NoOp(----==== post clic-to-call calls ====----)
same => n,GoSub(from-envy-crm,end,1)
same => n,Macro(hangupcall)

Эти файлы перепишут существующие контексты в /etc/asterisk/extensions_additional.conf и помогут обработать завершение вызова в «группе обзвона», после донабора «добавочного», и после «вызова из карточки».

Если всё настроено верно, то в CRM-системе при входящих вызовах будут появляться уведомления о входящих вызовах (всплывающая карточка) и так же запись разговора.

Поступление звонка

Однако попытка прослушивания\скачивание на текущем этапе будет приводить к ошибке. Её мы устраним в следующем пункте.

Прослушивание\скачивание записи разговора
Прослушивание\скачивание записи разговора

Записи разговоров.

Этот пункт выделен в отдельный, поскольку аналитика может действовать без него, а вот с ним нужны дополнительные настройки. А именно:

  1. Разрешение доступа на АТС со стороны EnvyCRM
  2. Размещение скрипта поиска и отдачи записей

На примере список ip сервиса соответствовал следующему: 82.202.217.213, 82.202.217.214, 109.234.156.246. Но лучше уточнять у специалистов технической поддержки.

Скрипт поиска и отдачи имеет следующий код:

<?php
function file_force_download($file, $mime) {
        if (file_exists($file)) {
                if (ob_get_level()) {
                        ob_end_clean();
                }
                header ("HTTP/1.1 200 OK");
                header('Expires: 0');
                header('Cache-Control: None');
                header('Pragma: no-cache');
                header ("Accept-Ranges: bytes");
                header('Content-Description: File Transfer');
                header('Content-Type: '.$mime);
                header('X-Pad: avoid browser bug');
                header('Content-Disposition: attachment; filename=' . basename($file));
                header('Content-Transfer-Encoding: binary');
                header('Content-Length: ' . filesize($file));
                if ($fd = fopen($file, 'rb')) {
                        while (!feof($fd)) {
                                print fread($fd, 1024);
                        }
                        fclose($fd);
                }
                exit;
        }
}

if(!empty($_GET['recordfile'])){
	        $str     = $_GET['recordfile'];
                exec("find /var/spool/asterisk/monitor/ -name \"*\"".$str."\"*\"", $exec_out);
                if(empty($exec_out[0])){
                        header('Content-Type: text/html; charset=utf-8');
                        header("HTTP/1.0 404 Not Found");
                        exit();
                }
                $filename = $exec_out[0];
                if (stristr($filename, "wav")) {
                        file_force_download($filename, "audio/wav");
                }elseif(stristr($filename, "mp3")){
                        $mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3";
                        file_force_download($filename, "{$mime_type}");
                }else{
                        header('Content-Type: text/html; charset=utf-8');
                        echo "Файл недопустимого типа ";
                        exit();
                }
} else {
	echo 'Wellcome to getFile';

Скрипт размещается в директории /var/www/html/envycrm/getfile.php. После этого нам нужно подкорректировать разрешения для apache2 на эту директорию. Редактируем файл:

nano /etc/httpd/conf.d/freepbx.conf
Разрешение на веб-директорию
Разрешение на веб-директорию

После чего обязательно выполняем перечитывание настроек:

# service httpd reload

Если доступ настроен корректно, то в браузере в режиме разработчика у вас корректно обработается запрос:

Запрос записи разговора
Запрос записи разговора

Click2call.

Поскольку доступы мы разрешили на предыдущем этапе нам остаётся разместить скрипт который пример параметры и инициирует вызов оператору и клиенту. Их можно распаковать из архива прикреплённого к статье в ту же директорию.

Размещение скриптов
Размещение скриптов

В файл settings нужно внести данные от AMI пользователя с разрешениями: call, originate. Как создать пользователя вы можете ознакомиться в статье: https://voxlink.ru/kb/asterisk-configuration/chtenie-i-analiz-dannyh-ami-interfejsa/

Теперь при клике на иконку трубки рядом с номером клиента внутри его карточки – будет инициирован вызов оператору, а после его ответа – клиенту с последующим соединением.

На этом мы закончили интеграцию asterisk с envyCRM. АТС отправляет информацию о поступлении вызова, после разговора – дополняет её всеми необходимыми данными, прикрепляет запись разговора. В дальнейшем вызов клиента будет составлять один клик по номеру в его карточке.

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

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

Надежен в эксплуатации.

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

Гибкий в настройке.

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

Имеет огромный функционал.

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

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.