Дмитрий Рашевский
25.08.2019
482

Список обращений от входящего абонента

Введение Настройка сервисного кода AGI скрипт Доработка диалплана и отправка информации в письме Заключение Введение Многие сталкивались с такими ситуациями, когда повторно звонит клиент, и попадает на другого оператора. После разговора с клиентом и долгого поиска с кем говорил клиент. Для этого была придумана реализация оповещения  разговаривающего оператора о последних обращениях клиента за последние несколько […]

  1. Введение
  2. Настройка сервисного кода
  3. AGI скрипт
  4. Доработка диалплана и отправка информации в письме
  5. Заключение

Введение

Многие сталкивались с такими ситуациями, когда повторно звонит клиент, и попадает на другого оператора. После разговора с клиентом и долгого поиска с кем говорил клиент. Для этого была придумана реализация оповещения  разговаривающего оператора о последних обращениях клиента за последние несколько дней.

В этой статье будет рассказано, как реализовать кастомный сервисный код. Использование AGI скриптов в диалплане. А также отправка сообщения на почту.

Настройка сервисного кода

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

В Asterisk за использование сервисных кодов используется конфигурационный файл features.conf.

В FreePBX так же используется этот файл, но для конфигурирования необходимо использовать файлы с именем custom. Соответственного по названиям каждого из контекстов features.conf: features_general_custom.conf; features_applicationmap_custom.conf; features_featuremap_custom.conf

Для конфигурирования дополнительного сервисного кода нам необходим конекст applicationmap. В нём укажем следующую конструкцию

<Имя сервиса> => <DTMF>,<Кем активируется>,<Активируемое приложение диалплана>,<Аргументы передаваемые в указанное приложение>

Следуя шаблону заполним секцию applicationmap.

getlastcaller => *5,peer,Macro,get-caller-count

Данной строкой мы определили, что по нажатию *5 во время разговора выполнится макрос get-caller-count.

features_applicationmap_custom.conf
features_applicationmap_custom.conf

После внесения изменений закроем наш файл с сохранением и применим изменения в консоле астериск командой module reload features

В asterisk версии 11 и ранее используется команда features reload

Чтобы проверить внесенные изменения вводим команду features show. В выводе информации мы должны увидеть наш сервисный код, который назван getlastcaller.

features show
features show

AGI скрипт

В этом разделе будет описан функционал скрипта, который будет использовать метод AGI для взаимодействия с asterisk, а также использование БД.

Т.к. мы будем использовать AGI для взаимодействия с Asterisk, то скрипт будет написан на php. У Asterisk «из коробки» есть библиотека для работы с AGI.

По умолчанию файлы библиотеки находятся в директории <em>var</em>lib/asterisk/agi-bin/

Для начала перейдем в директорию agi скриптов командой cd.

# cd /var/lib/asterisk/agi-bin/

Начнем написание скрипта:

# vim getcdr.php
  1. Подключим библиотеку phpagiи определим переменные

bd_user и bd_pass  — это константы включающие в себя логин и пароль для подключения к mysql

$client_num – содержит в себе значение первого переданного параметра

$sqlStr — строка запроса в БД

$message_body — оставим пока пустым значением. Далее нам она будет нужна.

$agi — это будет экземпляром класса AGI, который описан в файле phpagi.php

require_once('phpagi.php');
define('bd_user','freepbxuser');
define('bd_pass','testpassword');

$client_num= strval($argv[1]);
$sqlStr = 'select DATE_FORMAT(`calldate`,\'%H:%i %d-%m-%Y\') as caldate,src,dst,billsec  from cdr where (src = '.$client_num.' or dst = '.$client_num.') and (calldate BETWEEN CONCAT("",CURDATE() - INTERVAL 4 DAY," 00:00:00") AND CONCAT("",CURDATE()," 23:59:59")) order by calldate';
$message_body='';
$agi = new AGI();

2. Опишем функцию, назовем её MS_Select, она будет принимать один параметр — это строку SQL запроса и будет подключаться к mysql и при успешном запросе возвращать результат.

function MS_Select($q){
        $link = @mysqli_connect('localhost',bd_user,bd_pass,'asteriskcdrdb');// or die("Error: ".mysqli_connect_error($link));
        $rs = @mysqli_query($link, $q) or die("Error: ".mysqli_error($link));
        @mysqli_close($link);
        return $rs;
}

3. Теперь занесем в переменную результат выполнения нашей функции и будем анализировать результат выполнения функции

При анализе, сразу будем определять переменные:

$src – номер источника вызова

$dst – номер назначения вызова

$calldate — дата звонка

$billsec – время разговора

$message_body – переменная строкового типа. Значение этой переменной будут передаваться в значение переменной в диалплане.

$q = MS_Select($sqlStr);

while ($row = @mysqli_fetch_array($q)) {
        if ($row[0]!=''){
                $src=$row['src'];
                $dst=$row['dst'];
                $calldate = $row['caldate'];
                $billsec = $row['billsec'];
                $message_body.="$src ---> $dst - $calldate ($billsec сек.)\\\\n";
        }
}

После окончательно заполнения переменной $message_body поместим ее значение в переменную диалплана asterisk MSG_BODY следующей командой

$agi->set_variable("MSG_BODY", $message_body);

На этом скрипт закончен. Для того, чтобы его можно было использовать в диалплане, ему необходимо задать права на исполнение и назначить права пользователя asterisk

# chmod +x ./getcdr.php
# chown asterisk. getcdr.php

Доработка диалплана и вывод информации в письме

В этом разделе рассмотрим, как обращаться из диалплана к написанному нами AGI скрипту и как используя новые переменные использовать их для отправки email.

В начале этой статьи был настроен кастомный сервисный код *5, где название используемого макроса get-caller-count. Поэтому в файле диалплана asterisk создадим контекст [macro-get-caller-count]. И поместим туда следующие данные:

exten => s,1,NoOp(>>>>>>>>>> context for take counts calls for ${CALLERID(num)} <<<<<<<<<<<<<<<)
        same => n,DumpChan()
        same => n,ExecIf($[${LEN(${FROMEXTEN})}<5]?Goto(outbound):Goto(inbound))
        same => n(inbound),NoOp(>>>>>>>>>>>>>>>>>>>>> OUTBOUND to ${CALLERID(num)} <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<)
        same => n,AGI(getcdr.php,${FROMEXTEN})
        same => n,Goto(send_mail_inbound)
        same => n(outbound),NoOp(>>>>>>>>>>>>>>>>>>>>> OUTBOUND to ${CALLERID(num)} <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<)
        same => n,AGI(getcdr.php,${CALLERID(num)})
        same => n,Goto(send_mail_outbound)
        same => n(send_mail_inbound),System(/usr/local/bin/sendEmail.pl -f test@voxlink.ru -t $my_mail@voxlink.ru -u "Список обращений от ${CALLERID(num)} за 4 дня" -m "${MSG_BODY}" -o message-charset=UTF-8  & disown -h)
        same => n,MacroExit()
        same => n(send_mail_outbound),System(/usr/local/bin/sendEmail.pl -f test@voxlink.ru -t $my_mail@voxlink.ru -u "Список обращений от ${CALLERID(num)} за 4 дня" -m "${MSG_BODY}" -o message-charset=UTF-8 & disown -h)
        same => n,MacroExit()

Теперь подробнее о добавляемом контексте.

Сперва, чтоб заработал созданный feature code необходимо добавить в глобальную переменную DYNAMIC_FEATURENAME имя нашего кода — getlastcaller.

Перед тем, как указывать переменные, как в примере выше FROMEXTEN и DEXTEN, необходимо воспользоваться приложением asterisk – DumpChan для вывода всех переменных.

DumpChan
DumpChan

После того, как у нас перед глазами переменные, можно работать со всем диалпланом и написанием логики для входящих и исходящих вызовов.

Для разграничения по входящим/исходящим определим следующую логику — если длина звонящего номера меньше 5 цифр, то это внутренний номер. Исходя из этого будем переходить по меткам (inbound или outbound) внутри контекста. Строка сравнения будет выглядеть следующим образом:

same => n,ExecIf($[${LEN(${FROMEXTEN})}<5]?Goto(outbound):Goto(inbound))

После определения назначения звонка составим строки для получения данных из mysql. Для этого нужно будет обратиться к написанному php скрипту командой диалплана AGI. Это будет выглядеть следующим образом:

same => n(outbound),NoOp(>>>>>>>>>>>>>>>>>>>>> OUTBOUND to ${CALLERID(num)} <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<)
        same => n,AGI(getcdr.php,${CALLERID(num)})
        same => n,Goto(send_mail_outbound)

В примере выше указано обращение к скрипту getcdr.php командой AGI с передачей в качестве аргумента номера звонящего.

В примере выше указана метка outbound. Также делается и для inbound, только будьте внимательнее, чтобы цепочка для исходящих не пересекалась с входящими.

Последней строкой указываем переход на метку send_mail_outbound. Для разделения отправки сообщений по входящим и исходящим вызовам.

Теперь осталось реализовать функцию отправки на почту. Для этого будет использоваться скрипт sendEmail.pl и команда диалплана System

same => n(send_mail_inbound),System(/usr/local/bin/sendEmail.pl -f test@voxlink.ru -t $my_mail@voxlink.ru -u "Список обращений от ${CALLERID(num)} за 4 дня" -m "${MSG_BODY}" -o message-charset=UTF-8  & disown -h)

same => n,MacroExit()

По параметрам sendEmail.pl:

  • -f – почта от кого отправляется письмо
  • -t – адрес получателя письма
  • -u – тема письма
  • -m – тело письма
  • -o – кодировка
Параметры u,f и t указывайте ваши. Выше указан пример.

В параметр m указывается переменная MSG_BODY, которая была заполнена созданным скриптом и через AGI отправлена в Asterisk. Теперь можно проверять полученное письмо.

Письмо
Письмо

Заключение

Итак в данной статье, была рассмотрена последовательность добавления кастомного сервисного кода путем редактирования файла features.conf. Также в этом разделе было указано какие файлы редактировать, если у вас FreePBX. Было показано, как использовать AGI и php. Рассмотрели как изменить диалплан для отправки электронного письма. И в последнем разделе было указано какой утилитой отправлять сообщения на электронную почту.

0 0 vote
Article Rating
Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments

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

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