Курсы по использованию Asterisk

IP-телефония — технология будущего. Обучитесь работе с IP-АТС Asterisk для того чтобы внедрить и профессионально использовать при решении коммуникационных задач.

Работайте с Asterisk профессионально!

Многоуровневая защита IP-АТС Asterisk

Телефонные станции очень часто становятся объектами хакерских атак. Узнайте, каким образом необходимо строить многоуровневую защиту для Вашей IP-АТС.

Не оставьте хакерам шансов. Защитите свой Asterisk от атак.

Используйте Веб-Интерфейс для удобства настройки

Панель управление FreePBX позволяет легко и удобно управлять всей системой. Научитесь эффективно использовать FreePBX для решения своих задач.

Управление станцией и статистика в окне браузера.

Научитесь работать с Asterisk из консоли

Для понимания работы с Asterisk необходимо уметь настраивать его вручную с конфигурационными файлами и командной строкой CLI Asterisk.

Научитесь «тонкой» настройке Asterisk

Цель курсов - максимум практики.

Обучение нацелено на практическую работу с IP-оборудованием: платы потоков E1, VoIP-телефонные аппараты, голосовые шлюзы FXS и прочее.

Обучение на реальном оборудовании — залог успеха.

Заказ обратного звонка при неответе в очереди

База знаний Настройка Asterisk

В этой статье будет описан сценарий, позволяющий звонящему заказать обратный звонок, если он не дождался ответа в очереди. Замысел таков - звонящий ожидает в очереди небольшое количество времени - например 20 секунд. Если за это время оператор не примет вызов, звонящему предлагается нажать 1, чтобы заказать обратный звонок. После того, как звонящий нажимает 1, вызов с ним завершается, а в очередь с пониженным приоритетом, но на длительное время (30+ минут), ставится канал Local, созданный AMI-командой Originate. Как только оператор примет такой вызов, будет вызван номер, с которого изначально звонил клиент.

Приведённые в статье инструкции рассчитаны на FreePBX 13 и любой совместимый с ним Asterisk.

Контексты для совершения обратного звонка


Для совершения обратного звонка понадобится два контекста - один для вызова в очередь и ещё один для вызова номера, с которого звонил клиент.
Ниже приведён контекст для вызова очереди:

[ext-callback-to-queue]
exten => _X.,1,Set(__NODEST=${EXTEN})
same  => n,Queue(${EXTEN},t,,,1800)
same  => n,Hangup

Установка переменной NODEST нужна из-за особенности вызова операторов очереди в FreePBX через контекст from-queue - если переменную NODEST не указать, выполнение диалплана уйдёт в бесконечный цикл при попытке вызова оператора очереди (особенно опасно при использовании в очереди стратегии ringall). Обратите внимание на то, что перед вызовом приложения Queue не вызывается Answer, это нужно для того, чтобы вызов на номер клиента пошёл только после того, как в очереди ответит оператор. Также, максимальное время пребывания заявки на обратный звонок в очереди определено в параметре приложения Queue - в данном случае 30 минут.

 

Далее контекст для вызова номера клиента:

[ext-callback-to-client]
exten => _8[3489]XXXXXXXXX,1,GotoIf(${REGEX("^[0-9]+$" ${IVR_EXT})}?dial_ivr_ext)
same  => n,Goto(outbound-allroutes,${EXTEN},1)
same  => n(dial_ivr_ext),Dial(Local/${EXTEN}@outbound-allroutes,60,TrD(wwwwwwww${IVR_EXT}))
same  => n,Hangup

Этот контекст нужен для того, чтобы ограничить диапазон номеров, на которые может быть совершён обратный звонок, и для возможности сделать донабор в голосовом меню (номер, который нужно донабрать, передаётся в переменной IVR_EXT, о нём речь пойдёт позже).

 

AGI-скрипт для совершения обратного звонка
Для совершения исходящих вызовов будет использоваться AGI-скрипт на perl, приведённый ниже:

#!/usr/bin/perl
 
use warnings;
use strict;
 
use Asterisk::AMI;
 
my ($queue,$callback_num,$timeout,$ivr_ext) = @ARGV;
 
unless(defined $queue and $queue ne '' and defined $callback_num and $callback_num ne '') {
        exit 1;
}
 
if(not defined $timeout or $timeout eq '') {
        $timeout = 60000;
} else {
        $timeout *= 1000;
}
if(not defined $ivr_ext) {
        $ivr_ext = '';
}
 
my %ami_opts = (
        PeerAddr => '127.0.0.1',
        PeerPort => 5038,
        Username => 'ami_user',
        Secret => 'ami_secret',
        Timeout => 3,
        Events => 'off',
);
my $ami = Asterisk::AMI->new(%ami_opts);
 
if($ami) {
        my $resp = $ami->action({
                Action => 'Originate',
                Channel => 'Local/'.$queue.'@ext-callback-to-queue/n',
                Context => 'ext-callback-to-client',
                Exten => $callback_num,
                Priority => '1',
                Timeout => $timeout,
                Callerid => '"Callback" <'.$callback_num.'>',
                Variable => 'IVR_EXT='.$ivr_ext,
        });
       
        $ami->disconnect;
}

Сохраните скрипт в файле /var/lib/asterisk/agi-bin/callback_originate.pl и сделайте файл исполнимым. Вместо ami_user и ami_secret в скрипте нужно указать логин и пароль пользователя AMI с write-привилегией originate (можете использовать пользователя admin, он описан в файле /etc/asterisk/manager.conf).

 

Для использования скрипта нужно установить из CPAN модуль perl Asterisk::AMI, установку проще всего выполнить с помощью cpanm. Если cpanm не установлен сперва установите из CPAN модуль App::cpanminus с помощью cpan (cpan должен быть доступен в репозитории вашего дистрибутива Linux).

cpan App::cpanminus

(при первом запуске cpan запросит ввод различных настроек, обычно достаточно нажать Enter в ответ на первый вопрос и все настройки будут установлены по умолчанию. Если потребуется вручную выбрать зеркало CPAN, можете указать первое попавшееся зеркало в своей стране).

Теперь устанавливаем Asterisk::AMI

cpanm Asterisk::AMI
 

С AGI-скриптом всё.

 

Контексты для заказа обратного звонка


Для того, чтобы в AGI-скрипт можно было передать номер очереди, нужно сохранить номер очереди в переменной перед входом в очередь. Для достижения этого лучше всего внести правки в код FreePBX (добавить присвоение переменной номера очереди перед входом в любую очередь), но в рамках статьи будет рассмотрен более простой способ с помощью модуля «Custom Destinations». Создайте контекст ext-queues-pre:

[ext-queues-pre]
exten => _X.,1,Set(CC_QUEUE=${EXTEN})
same  => n,Set(QUEUE_PRIO=5)
same  => n,Goto(ext-queues,${EXTEN},1)

В данном контексте также устанавливается переменная QUEUE_PRIO - это нужно для того, чтобы звонки в очередь из города имели больший приоритет, чем заказанные обратные звонки (если хотите, можете вместо этого повышать приоритет с помощью модуля FreePBX «Queue Priorities»). Учтите также, что в том случае, когда операторы заняты звонками из города 100% времени, обратные звонки с пониженным приоритетом до них никогда не дойдут, и весь этот сценарий в данном конкретном виде не имеет смысла, данный сценарий позволяет подобрать клиентов, не дождавшихся ответа в моменты пиковой нагрузки на колл-центр.

 

Теперь нужно создать custom destination для каждой очереди, в которой нужно использовать описываемый сценарий, и использовать полученные custom destination для направления вызовов в очереди. Пример для очереди 7001:

Custom destination

Ниже приведён код контекстов, реализующих описываемый сценарий:

[app-offer-callback]
exten => s,1,GotoIf($["${CC_QUEUE}" = ""]?error)
same  => n,GotoIf($[${REGEX("^\\+?(7|8)?[3489][0-9]{9}$" ${CALLERID(num)})} = 0]?failover)
same  => n,BackGround(custom/press_1_for_callback)
same  => n,WaitExten(4)
same  => n(failover),Set(VQ_POSITION=${QUEUEPOSITION})
same  => n,Set(VQ_MAXWAIT=40)
same  => n,Goto(ext-queues,${CC_QUEUE},1)
same  => n(error),Hangup
 
exten => 1,1,Goto(app-confirm-callback,s,1)
exten => i,1,Goto(s,failover)
 
[app-confirm-callback]
exten => s,1,Set(IVR_EXT=)
same  => n,GotoIf($["${CALLERID(num):-10:1}" = "9"]?accept)
same  => n,BackGround(custom/please_enter_ivr_ext)
same  => n,WaitExten(4)
same  => n,Goto(failover)
same  => n(accept),Set(CALLBACK_NUM=8${CALLERID(num):-10})
same  => n,Playback(custom/callback_accepted)
same  => n,Hangup
same  => n(failover),Goto(app-offer-callback,s,failover)
 
exten => 00,1,Goto(s,accept)
exten => _X.,1,Set(IVR_EXT=${EXTEN})
same  => n,Goto(s,accept)
 
exten => i,1,Goto(s,failover)
exten => h,1,ExecIf($["${CALLBACK_NUM}" != ""]?AGI(callback_originate.pl,${CC_QUEUE},${CALLBACK_NUM},1800,${IVR_EXT}))
same  => n,Hangup

Сценарий работает следующим образом - звонящему предлагается нажать 1, чтобы заказать обратный звонок. После того как звонящий нажмёт 1, звонящему дополнительно будет предложено ввести добавочный номер, если номер звонящего не является мобильным (если добавочный номер не требуется, звонящий должен ввести 00). Если звонящий ввёл добавочный или вызов пришёл с мобильного, звонящему проигрывается сообщение о том, что заявка на обратный звонок принята, после этого вызов завершается (обратный звонок поступает в очередь операторов сразу после завершения вызова).
Если номер звонящего не из России или звонящий не набирает 1 или не вводит добавочный номер, вызов возвращается обратно в очередь с сохранением позиции на 40 секунд (если за это время операторы не примут вызов, звонящему снова будет предложен заказ обратного звонка).
При вызове AGI-скрипта в контексте app-confirm-callback, одним из параметров является максимальное время ожидания ответа, это время должно быть не меньше, чем то, что указано в контексте ext-callback-to-queue (имеет смысл завести глобальную переменную для этого значения).

 

Сценарий рассчитан на наличие ряда файлов с голосовыми сообщениями:
custom/press_1_for_callback - предложение нажать 1, чтобы заказать обратный звонок
custom/please_enter_ivr_ext - предложение ввести добавочный номер. Также в сообщении должно быть сказано, что нужно набрать 00, если ввод добавочного номера не требуется
custom/callback_accepted - сообщение о том, что заявка на обратный звонок принята
Подразумевается, что файлы с записями находятся в директории /var/lib/asterisk/sounds/<код_языка>/custom, куда они попадают, если загружать их через FreePBX (код_языка - код языка голосовых сообщений выбранный в FreePBX, для русского языка — ru).

 

Входная точка сценария - app-offer-callback,s,1, нужно создать для неё custom destination:

Теперь нужно указать полученный custom destination для очереди в качестве Fail Over Destination:

Custom destinations

 

Максимальное время ожидания в настройках очереди должно равняться времени до первого предложения заказать обратный звонок - в нашем случае 20 секунд.


Настройка завершена.

 

asterisk, установка, настройка, FreePBX, Channel, for, outbound, callerid, IVR