artem
11.12.2017
10834

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

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

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

Приведённые в статье инструкции рассчитаны на 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 секунд.

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

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

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

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

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