Ангелина Стратичук
21.01.2026
398

Интеграция VoxDistro и системы аналитики IMOTIO

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

Интеграция актуальна для VoxDistro 16. Для других версий или других дистрибутивов могут потребоваться доработки.

Для интеграции необходимы:

  •   php версии 5.6 и выше;
  •   ведение на АТС записей разговоров в стерео-режиме.

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

В статье воспользуемся встроенным функционалом

Важно отключить удаление исходных стерео-файлов -in и -out, так как они будут переданы в imot.io. После передачи файлы можно удалить.
Рис.1 — Отключение удаления стерео-файлов

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

Рис. 2 — Display/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 вызова, имя файла записи разговора, время начала звонка, время ответа на звонок, время завершения звонка и тип вызова.

При необходимости можно передать самые важные параметры, остальное найти в asteriskcdrdb.
<?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-токены).

Рис. 3 — 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.

Не забываем во FreePBX в Adnced Settings указать скрипт в Post Call Recording Script, а также передаваемые переменные.

Дополнение

В сервис через несколько uniqueid можно передать перевод вызова. Однако, у нас одна общая запись разговора, и с отображением могут быть проблемы. Если нужно смотреть, на кого был перевод, можно сделать следующее:

  • В extensions_custom.conf в [from-transer-safe] для паттерна _. до Goto добавить наследуемую переменную ${TRANSFERNUM}=${EXTEN};
  • Передать TRANSFERNUM ещё одной переменной в скрипт;
  • Добавить в operator (для наглядности можно использовать конструкцию типа operator -> transfer. Далее по диалогу можно будет отличить, состоялся перевод или нет, как общались с клиентом.

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

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

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

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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.