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

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

Введение Настройка сервисного кода 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. Рассмотрели как изменить диалплан для отправки электронного письма. И в последнем разделе было указано какой утилитой отправлять сообщения на электронную почту.

 
avatar
  Подписаться  
Уведомление о

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

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

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

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

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

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices