Интеграция VoxDistro и системы аналитики IMOTIO
В статье подробно рассматривается процесс интеграции VoxDistro 16 с системой речевой аналитики IMOTIO. Вы узнаете, какие требования необходимо выполнить для корректной передачи записей разговоров и какие настройки АТС нужно изменить. Пошагово разобрана подготовка диалплана, настройка записи в стерео-режиме и создание PHP-скрипта для отправки данных в IMOTIO. Также объясняется логика передачи параметров вызова и работы с базой данных Asterisk. Материал будет полезен администраторам и инженерам, настраивающим аналитику телефонных разговоров.
Интеграция актуальна для VoxDistro 16. Для других версий или других дистрибутивов могут потребоваться доработки.
Для интеграции необходимы:
- php версии 5.6 и выше;
- ведение на АТС записей разговоров в стерео-режиме.
Начиная с VoxDistro 16, в дистрибутиве у нас уже встроен перевод в стерео-режим при записи телефонных разговоров. Однако, если делается не на нашем дистрибутиве или же на VoxDistro моложе 16-ой версии, то перевод в стерео-режим можно сделать по данной статье.
В статье воспользуемся встроенным функционалом

Далее, пока находимся в Advanced Settings, выставим в Yes параметры Display Readonly Settings и Override Readonly Settings, чтобы была возможность установить скрипт для постобработки вызова.

Подготовка диалплана
В контексте, который указан в транках, прописываем переменную ${CALLTYPE}=INBOUND.
Переменная должна быть наследуемой.
А в extensions_override.conf в [sub-record-check] пропишем следующее:
exten => recordcheck,1,Noop(Starting recording check against ${ARG1})
; Custom variables ${CALLTYPE}
exten => recordcheck,n,ExecIf($[“${CALLTYPE}” != “INBOUND”]?Set(__CALLTYPE = “OUTBOUND”))
; Override end
exten => recordcheck,n,Goto(${ARG1})
Так, все входящие вызовы, попавшие в транк, будут считаться входящими, а все остальные вызовы на АТС – исходящими. Перейдём к написанию скрипта.
Написание скрипта
Он будет лежать в директории /var/www/html/imotio/. Назовём его functions.php.
Сразу определимся, что нам надо будет передавать в скрипт: номер звонящего, linkedid вызова, имя файла записи разговора, время начала звонка, время ответа на звонок, время завершения звонка и тип вызова.
<?php
define('IMOTIO_TOKEN', 'b964c516-a4be-45c0-8e96-24f2d94d1a70');
define('IMOTIO_URL', 'https://test.imot.io/api/');
define('MYSQL_USER', 'freepbxuser');
define('MYSQL_PASS', 'cb4a08d3705e5eb896eea6af10512305');
$dsn = 'mysql:host=localhost; dbname=asteriskcdrdb';
try {
$dbh = new PDO($dsn, MYSQL_USER, MYSQL_PASS);
} catch (PDOException $e) {
die ('При подключении к базе данных возникла ошибка.' . $e->getMessage());
}
$callerid_num = $argv[1];
$linkedid = $argv[2];
$callfile_in = $argv[3] . '-in.wav';
$callfile_out = $argv[3] . '-out.wav';
$call_start = strtotime($argv[4]);
$answer_start = strtotime($argv[5]);
$call_end = strtotime($argv[6]);
$filedir = $argv[7];
$call_type = $argv[8];
$ph_array = array(
'lid' => $linkedid,
);
$dst_query = $dbh->prepare("SELECT `dst` FROM `cdr` WHERE `linkedid` =:lid LIMIT 1");
$dst_query->execute($ph_array);
while ($dst_result = $dst_query->fetch(PDO::FETCH_ASSOC)) {
$dst = $dst_result["dst"];
}
$data = create_array_of_parameters($call_type, $callerid_num, $dst);
$params = array(
"direction" => $data['type'],
"operator_phone" => $data['operator'],
"client_phone" => $data['client'],
"unique_id" => $linkedid,
"call_time" => $call_start,
"answer_time" => $answer_start,
"end_time" => $call_end,
"operator_audio" => new cURLFile($filedir . $callfile_out, 'audio/ogg', $callfile_out),
"client_audio" => new cURLFile($filedir . $callfile_in, 'audio/ogg', $callfile_in),
);
request_imotio($params);
function create_array_of_parameters($call_type, $callerid_num, $dst) {
if ($call_type == 'INBOUND') {
$type = 'inbound';
$client = $callerid_num;
$operator = $dst;
} else {
$type = 'outbound';
$client = $dst;
$operator = $callerid_num;
}
return array('type' => $type, 'client' => $client, 'operator' => $operator);
}
function request_imotio ($params) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Auth-Token: ' . IMOTIO_TOKEN));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_URL, IMOTIO_URL . 'process_call');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$out = curl_exec($ch);
curl_close($ch);
$open = fopen('/tmp/result.txt', 'w') or die("не удалось открыть файл");
fwrite($open, $out);
fclose($open);
}
?>
Рассмотрим, что написали:
Объявили наш IMOTIO_TOKEN, его можно взять в личном кабинете (Профиль -> Настройка профиля -> API-токены).

Также поддерживается авторизация по логину и паролю.
Далее, в IMOTIO_URL указываем статичную часть необходимого нам URL. Также константами объявляем логин и пароль для подключения к БД.
Подключаемся к базе asteriskcdrdb, присваиваем нужные значения переменным, в базе по linkedid находим dst-номер. Далее формируем массив данных, которые будут отправляться в IMOTIO. Переходим к функциям.
Функций 2:
- функция создания массива динамических параметров на основе типа звонка (create_array_of_parameters);
- функция передачи данных в IMOTIO (request_imotio).
Подробно рассмотрим каждую функцию.
Функция create_array_of_parameters
При вызове данной функции передаём в неё такие параметры:
- call_type – тип вызова (входящий или исходящий);
- callerid_num;
- dst.
Здесь делаем проверку на тип вызова. Если call_type = INBOUND, то в type прописываем inbound, в client присваиваем номер клиента, содержащийся в переменной callerid_num, а в operator — номер сотрудника (dst). Иначе прописываем в type outbound, в client – dst, а в operator – callerid_num соответственно.
После через return возвращаем необходимые параметры.
Функция request_imotio
При вызове данной функции передаём в неё уже готовый массив данных params. В нём содержатся все данные для отправки в IMOTIO.
В функции инициируем передачу данных методом POST через CURL. В качестве логирования в конце функции ведём запись в файл. Передача считается удачной, если приходит в ответ task_id – ID задачи на распознавание, call_id – ID звонка в базе IMOTIO.
Дополнение
В сервис через несколько uniqueid можно передать перевод вызова. Однако, у нас одна общая запись разговора, и с отображением могут быть проблемы. Если нужно смотреть, на кого был перевод, можно сделать следующее:
- В extensions_custom.conf в [from-transer-safe] для паттерна _. до Goto добавить наследуемую переменную ${TRANSFERNUM}=${EXTEN};
- Передать TRANSFERNUM ещё одной переменной в скрипт;
- Добавить в operator (для наглядности можно использовать конструкцию типа operator -> transfer. Далее по диалогу можно будет отличить, состоялся перевод или нет, как общались с клиентом.
Остались вопросы?
Я - Игорь Кондрашин, менеджер компании 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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.
База знаний
IP-АТС
Оборудование
О нас




