Интеграция с EnvyCRM
Описание: в этой статье будет рассмотрена интеграция программной АТС на базе asterisk с внешним сервисом EnvyCRM. Ожидаемые результаты: Аналитика – ведение учёта входящих вызовов, передача номера и времени звонящего Записи разговоров – возможность прослушать и скачать файл из CRM Click2call – вызов из карточки клиента по его номеру Аналитика. Для предоставления информации о входящих вызовах […]
Описание: в этой статье будет рассмотрена интеграция программной АТС на базе asterisk с внешним сервисом EnvyCRM. Ожидаемые результаты:
- Аналитика – ведение учёта входящих вызовов, передача номера и времени звонящего
- Записи разговоров – возможность прослушать и скачать файл из CRM
- Click2call – вызов из карточки клиента по его номеру
Аналитика.
Для предоставления информации о входящих вызовах нам потребуется получить такие данные как:
- Время и дата начала звонка
- Номер звонящего
- Номер ответившего (null – если разговор не состоялся)
- Продолжительность звонка
- Статус дозвона
- Ссылку на запись разговора
- Уникальный идентификатор
После чего сформировать массив данных и отправить их в CRM-систему.
Для решения этого вопроса есть два возможные варианта: написание собственного «демона», который будет подключаться к 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);
?>
Скрипт размещаем в директории /var/lib/asterisk/agi-bin/envycrmapi.php и даём права на исполнение:
# chmod a+x /var/lib/asterisk/agi-bin/envycrmapi.php
Далее нам необходимо настроить взаимодействие 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-системе при входящих вызовах будут появляться уведомления о входящих вызовах (всплывающая карточка) и так же запись разговора.
Однако попытка прослушивания\скачивание на текущем этапе будет приводить к ошибке. Её мы устраним в следующем пункте.
Записи разговоров.
Этот пункт выделен в отдельный, поскольку аналитика может действовать без него, а вот с ним нужны дополнительные настройки. А именно:
- Разрешение доступа на АТС со стороны EnvyCRM
- Размещение скрипта поиска и отдачи записей
На примере список 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. АТС отправляет информацию о поступлении вызова, после разговора – дополняет её всеми необходимыми данными, прикрепляет запись разговора. В дальнейшем вызов клиента будет составлять один клик по номеру в его карточке.
Остались вопросы?
Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.