Список обращений от входящего абонента
Введение Настройка сервисного кода AGI скрипт Доработка диалплана и отправка информации в письме Заключение Введение Многие сталкивались с такими ситуациями, когда повторно звонит клиент, и попадает на другого оператора. После разговора с клиентом и долгого поиска с кем говорил клиент. Для этого была придумана реализация оповещения разговаривающего оператора о последних обращениях клиента за последние несколько […]
- Введение
- Настройка сервисного кода
- AGI скрипт
- Доработка диалплана и отправка информации в письме
- Заключение
Введение
Многие сталкивались с такими ситуациями, когда повторно звонит клиент, и попадает на другого оператора. После разговора с клиентом и долгого поиска с кем говорил клиент. Для этого была придумана реализация оповещения разговаривающего оператора о последних обращениях клиента за последние несколько дней.
В этой статье будет рассказано, как реализовать кастомный сервисный код. Использование AGI скриптов в диалплане. А также отправка сообщения на почту.
Настройка сервисного кода
Некоторые из вас сталкивались с идеями о использовании кастомного решения задачи с помощью сервисного кода. Поэтому в данном разделе вы сможете найти информацию о конфигурировании не стандартного сервисного кода.
В Asterisk за использование сервисных кодов используется конфигурационный файл features.conf.
Для конфигурирования дополнительного сервисного кода нам необходим конекст applicationmap. В нём укажем следующую конструкцию
<Имя сервиса> => <DTMF>,<Кем активируется>,<Активируемое приложение диалплана>,<Аргументы передаваемые в указанное приложение>
Следуя шаблону заполним секцию applicationmap.
getlastcaller => *5,peer,Macro,get-caller-count
Данной строкой мы определили, что по нажатию *5 во время разговора выполнится макрос get-caller-count.
После внесения изменений закроем наш файл с сохранением и применим изменения в консоле астериск командой module reload features
Чтобы проверить внесенные изменения вводим команду features show. В выводе информации мы должны увидеть наш сервисный код, который назван getlastcaller.
AGI скрипт
В этом разделе будет описан функционал скрипта, который будет использовать метод AGI для взаимодействия с asterisk, а также использование БД.
Т.к. мы будем использовать AGI для взаимодействия с Asterisk, то скрипт будет написан на php. У Asterisk «из коробки» есть библиотека для работы с AGI.
Для начала перейдем в директорию agi скриптов командой cd.
# cd /var/lib/asterisk/agi-bin/
Начнем написание скрипта:
# vim getcdr.php
- Подключим библиотеку 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 [email protected] -t [email protected] -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 [email protected] -t [email protected] -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 для вывода всех переменных.
После того, как у нас перед глазами переменные, можно работать со всем диалпланом и написанием логики для входящих и исходящих вызовов.
Для разграничения по входящим/исходящим определим следующую логику — если длина звонящего номера меньше 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 с передачей в качестве аргумента номера звонящего.
Последней строкой указываем переход на метку send_mail_outbound. Для разделения отправки сообщений по входящим и исходящим вызовам.
Теперь осталось реализовать функцию отправки на почту. Для этого будет использоваться скрипт sendEmail.pl и команда диалплана System
same => n(send_mail_inbound),System(/usr/local/bin/sendEmail.pl -f [email protected] -t [email protected] -u "Список обращений от ${CALLERID(num)} за 4 дня" -m "${MSG_BODY}" -o message-charset=UTF-8 & disown -h)
same => n,MacroExit()
По параметрам sendEmail.pl:
- -f – почта от кого отправляется письмо
- -t – адрес получателя письма
- -u – тема письма
- -m – тело письма
- -o – кодировка
В параметр m указывается переменная MSG_BODY, которая была заполнена созданным скриптом и через AGI отправлена в Asterisk. Теперь можно проверять полученное письмо.
Заключение
Итак в данной статье, была рассмотрена последовательность добавления кастомного сервисного кода путем редактирования файла features.conf. Также в этом разделе было указано какие файлы редактировать, если у вас FreePBX. Было показано, как использовать AGI и php. Рассмотрели как изменить диалплан для отправки электронного письма. И в последнем разделе было указано какой утилитой отправлять сообщения на электронную почту.
Остались вопросы?
Я - Першин Артём, менеджер компании 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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.