Блокировка исходящих звонков на определенные номера или номера из заданного списка в FreePBX 14
От коллеги по цеху поступила просьба помочь с реализацией интересной задачи, которая заключается во исполнении №152-ФЗ (Федеральный закон «О персональных данных») по которому необходимо блокировать исходящие звонки на номера клиентов, который дали отказ на них.
Но нужно не просто блокировать исходящий звонок на определенный номер, но перед этим необходимо оператору проиграть сообщение и если после или в процессе сообщения нажать кнопку 1, то все же совершить звонок клиенту.
Я увидел решение задачи несколькими способами, рассмотрим этим варианты реализации.
Исходные данные:
- Debian 9 Strech
- Asterisk 16 + FreePBX 14
- Номерная маска операторов — _146XX
Вариант #1
В файл конфигурации /etc/asterisk/extensions_custom.conf добавляем следующую обработку:
[from-internal-custom] exten => _89858887766/_146XX,1,GoSub(sub-marketing-block,s,1) exten => _89855554433/_146XX,1,GoSub(sub-marketing-block,s,1) exten => _89852221100/_146XX,1,GoSub(sub-marketing-block,s,1) ; -- УКАЗЫВАЕМ ОСТАЛЬНЫЕ НОМЕРА КОТОРЫЕ ПОД ЗАПРЕТОМ -- [sub-marketing-block] exten => s,1,Background(custom/message) exten => s,2,WaitExten(3) exten => 1,1,Goto(s,5) exten => i,1,Goto(s,6) exten => t,1,Goto(s,6) exten => s,5,Return() exten => s,6,Hangup()
После добавления обработки, необходимо перечитать dialplan, выполним команду:
asterisk -rx 'dialplan reload'
Теперь при звонке с маской номера 146XX на номер клиента 89858887766, будет проигрываться сообщение оператору и в случае если оператор нажмет 1, то звонок к клиенту будет совершен, иначе вызов завершится.
В этом способе я вижу минус который кроется в универсальности, так чтобы внести новый номер в обработку необходимо каждый раз править файл /etc/asterisk/extensions_custom.conf и перечитывать dialplan.
Вариант #2
Второй вариант более гибкий в плане обработки запрещенных номеров. К примеру можно разместить в расшаренной папке текстовый файл с номерами и предоставить доступ к нему из системы с FreePBX, далее при совершении вызова с номерной маски прим. _146XXX проверять исходящий номер на наличие его в списке блокировки. При необходимости можно в просто добавить новый номер в текстовый файл и он сразу же включится в обработку, без необходимости перечитывать dialplan.
Реализовать данный механизм можно легко при помощи модуля phpagi подключаемого к AGI интерфейсу. Как настроить подключение phpagi к AGI интерфейсу смотрим в этой статье.
В файле конфигурации /etc/asterisk/extensions_custom.conf добавляем следующую обработку:
[from-internal-custom] ;----- Pre-Dial Processing ----- exten => _XXXXXXXXXXX/_146XX,1,NoOp(Custom Pre-Dial Processing) exten => _XXXXXXXXXXX/_146XX,n,Answer() exten => _XXXXXXXXXXX/_146XX,n,AGI(pre_dial_processing_numbers.php)
Создаем PHP скрипт и назначаем на него права доступа:
touch /var/lib/asterisk/agi-bin/pre_dial_processing_numbers.php chown asterisk:asterisk /var/lib/asterisk/agi-bin/pre_dial_processing_numbers.php chmod 755 /var/lib/asterisk/agi-bin/pre_dial_processing_numbers.php
В созданный PHP скрипт вставляем следующий код:
#!/usr/bin/php -q <?php require('phpagi.php'); // Подключение phpAGI $agi = new AGI(); debug(".::: Starting scrypt (/var/lib/asterisk/agi-bin/pre_dial_processing_numbers.php) :::."); debug(".::: Collecting data :::."); $sound = "/var/lib/asterisk/sounds/ru/custom/message"; // Путь к звуковому файлу $list_numbers = "/tmp/blocked_numbers.txt"; // Путь к списку номеров телефонов // Проверяем существование файла списка блокировки, если файл не существует, то выполнить звонок // в обычном режиме if (!file_exists($filename)) { debug(".::: File with blocked numbers does not exist :::."); debug(".::: Continue normal call behavior :::."); break; } // Получаем значение вызываемого номера $argCalled = $agi->get_variable('EXTEN'); $argCalled = $argCalled['data']; debug(".::: Dialing number - $argCalled :::."); debug(".::: Reading list blocked numbers ($list_numbers) :::."); // Проверяем набранный номер на наличие его в списке запрещенных, если номер присутствует в списке, то // запускаем обработку вызова на него if (mb_strpos(file_get_contents($list_numbers), $argCalled) !== false) { debug(".::: Dialing number $argCalled is in list. Continuing advanced call processing :::."); // Проигрываем оператору звуковой файл и ждем от него ввода DTMF сигнала (5 секунд) $result = $agi->get_data($sound, 5000, 1); $digit = $result['result']; // Если оператор ввел 1, то выполнить звонок несмотря на запрет, иначе завершить звонок if ($digit == "1") { debug(".::: Operator input DTMF - #$digit :::."); debug(".::: Initiate call to $argCalled :::."); $agi->exec_goto("outbound-allroutes",$argCalled,1); break; } else { debug(".::: Operator input wrong DTMF :::."); debug(".::: Terminate call :::."); $agi->hangup(); break; } // Если оператор ничего не вводил, то по завершении проигрывания сообщения завершить звонок debug(".::: Operator do not input any DTMF :::."); debug(".::: Terminate call :::."); $agi->hangup(); } // Функция вывода DEBUG информации в консоль function debug($string) { global $agi; $agi->verbose("$string"); } ?>
[stextbox id=’info’]ПРИМЕЧАНИЕ. В приведенном выше коде указал подробные комментарии, при помощи который будет легко понять что и как я описал и по возможности можно легко модифицировать его под свои нужды. [/stextbox]
Для применения изменений, необходимо перечитать dialplan, выполним команду:
asterisk -rx 'dialplan reload'
Теперь создаем текстовый файл с необходимыми номерами (номера указываем по одному на строку) и проверяем работу.
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОБЛАГОДАРИ АВТОРА
Обсуждение
Нет комментариев.