Отправка оповещений о состоянии очереди звонков Switchvox
Администратор, 16.01.2013Данный туториал продемонстрирует Вам, как создать PERL скрипт для отправки e-mail оповещений, когда количество звонков, находящихся в очереди, достигает определённого числа.
Допустим, что общее число пропущенных вызовов в очереди стало очень велико.
В таком случае, Вам будет отправленно соответствующее уведомление в виде e-mail или SMS, что позволит отслеживать работу сотрудников и оценивать ситуацию.
Для работы требуется:
- Опыт работы c PERL установке задач в cron
- Знание Extend API
- Установленная PERL библиотека
Switchvox::API
Также рекомендуем ознакомиться:
Шаг 1: Библиотека Switchvox::API
Итак, допустим, что библиотека Switchvox::API у Вас уже установленна. Теперь давайте включим её в наш скрипт.
1
|
use Switchvox::API; |
После подключения библиотеки мы можем создать новый объект Switchvox:API, передавая в него имя хоста и авторизацию администратора
1
2
3
4
5
|
my $api = new Switchvox::API( hostname => 'pbx.hostname.com' , username => 'admin' , password => 'admin_password' ); |
Шаг 2: Отчёты об очереди звонков
Теперь отправим запрос на АТС для получения отчёта о сегодняшней очереди звонков для аккаунта ID 1101. Заметьте, что после того как достигнут лимит, вы будете получать оповещения с каждым запуском скрипта до тех пор, пока количество звонков не опустится ниже лимита.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
my ( $sec , $min , $hour , $mday , $mon , $year , $wday , $yday , $isdst ) = localtime(time); my $today = sprintf( "%4d-%02d-%02d" , $year + 1900, $mon + 1, $mday ); ( $sec , $min , $hour , $mday , $mon , $year , $wday , $yday , $isdst ) = localtime(time + 86400); my $tomorrow = sprintf( "%4d-%02d-%02d" , $year + 1900, $mon + 1, $mday ); my $response = $api ->api_request( method => 'switchvox.callQueueReports.search' , parameters => { start_date => "$today 00:00:00" , end_date => "$tomorrow 00:00:00" , ignore_weekends => 0, queue_account_ids => [ { queue_account_id => [ 1101 ] } ], breakdown => 'by_queue' , report_fields => [ { report_field => [ 'avg_wait_time_all_calls' , 'abandoned_calls' , 'avg_talk_time' ] } ], format => 'xml' , } ); |
Теперь можно просмотреть отчёт и решить необходима ли отправка оповещений. Нижеприведённый код будет отправлять оповещения в случае, если:
- - среднее время ожидания для очереди превышает 4 минуты
- - число пропущенных вызовов больше 5
- - среднее время разговора превышает 10 минут
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
if ( $response ->{api_status} eq 'success' ) { # get the values my $values = $response ->{api_result}{response}[0]{result}[0]{queues}[0]{queue}[0]; # Alert 1: avg_wait_time > 4 min if ( $values ->{avg_wait_time_all_calls} > 4) { $subject = "Subject: Queue Alert Avg Wait Time\n" ; $content = "Warning: The call queue ($values->{display_name}) has an average wait time greater than 4 minutes." ; send_email(subject => $subject , content => $content ); } # Alert 2: abandoned_calls > 5 if ( $values ->{abandoned_calls} > 5) { $subject = "Subject: Queue Alert Abandoned Calls\n" ; $content = "Warning: The call queue ($values->{display_name}) has more than 5 abandoned calls." ; send_email(subject => $subject , content => $content ); } # Alert 3: avg_talk_time > 10 min if ( $values ->{avg_talk_time} > 10) { $subject = "Subject: Queue Alert Avg Talk Time\n" ; $content = "Warning: The call queue ($values->{display_name}) has an average talk time greater than 10 minutes." ; send_email(subject => $subject , content => $content ); } } else { print "Encountered Errors:\n" ; foreach my $error ( @{ $response ->{api_errors}} ) { print "-Code:$error->{code},Message:$error->{message}\n" ; } } |
Шаг 3: Журнал очереди звонков
Также можно запросить журнал очереди звонков, чтобы сгенерировать дополнительные оповещения. Для этого нам понадобятся только звонки за прошедший час (при условии, что скрипт будет запускаться каждый час через cron). Вот как будет выглядеть запрос:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
my ( $sec , $min , $hour , $mday , $mon , $year , $wday , $yday , $isdst ) = localtime(time); my $now = sprintf( "%4d-%02d-%02d %2d:%2d:%sd" , $year + 1900, $mon + 1, $mday , $hour , $min , $sec ); ( $sec , $min , $hour , $mday , $mon , $year , $wday , $yday , $isdst ) = localtime(time - 3600); my $hour_ago = sprintf( "%4d-%02d-%02d %2d:%2d:%2d" , $year + 1900, $mon + 1, $mday , $hour , $min , $sec ); $response = $api ->api_request( method => 'switchvox.callQueueLogs.search' , parameters => { start_date => $hour_ago , end_date => $now , ignore_weekends => 0, queue_account_ids => [ { queue_account_id => [ 1101 ] } ], call_types => [ { call_type => [ 'completed_calls' , 'abandoned_calls' , 'redirected_calls' ] } ], format => 'xml' , } ); |
Теперь можно просмотреть отчёт и решить необходима ли отправка оповещений. Нижеприведённый код будет отправлять оповещения в случае, если:
- - есть пропущенный вызов
- - время разговора превысило 30 минут
- - агент пропустил звонок
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
if ( $response ->{api_status} eq 'success' ) { # get the values my $calls = $response ->{api_result}{response}[0]{result}[0]{calls}[0]{call}; # process each call foreach my $call (@ $calls ) { # Alert 1: send an alert for each abandoned call if ( $call ->{type} eq 'abandoned' ) { $subject = "Subject: Queue Alert Abandoned Call\n" ; $content = "Warning: The call queue ($call->{queue_name}) had an abandoned call.\n\n" ; $content .= "Caller Info: $call->{caller_id_name} <$call->{caller_id_number}>\n" ; $content .= "Call Time: $call->{start_time}\n" ; send_email(subject => $subject , content => $content ); } # Alert 2: talk time > 30 min if ( $call ->{type} eq 'completed' && $call ->{talk_time} > 30) { $subject = "Subject: Queue Alert Talk Time\n" ; $content = "Warning: The call queue ($call->{queue_name}) had a call longer than 30 minutes.\n\n" ; $content .= "Caller Info: $call->{caller_id_name} <$call->{caller_id_number}>\n" ; $content .= "Agent Info: $call->{member_name} <$call->{member_extension}>\n" ; $content .= "Call Time: $call->{start_time}\n" ; send_email(subject => $subject , content => $content ); } # Alert 3: send an alert if someone missed a call if ( $call ->{member_misses} > 0) { $subject = "Subject: Queue Alert Missed Call\n" ; $content = "Warning: The call queue ($call->{queue_name}) has a missed call." ; $content .= "Caller Info: $call->{caller_id_name} <$call->{caller_id_number}>\n" ; $content .= "Call Time: $call->{start_time}\n" ; send_email(subject => $subject , content => $content ); } } } else { print "Encountered Errors:\n" ; foreach my $error ( @{ $response ->{api_errors}} ) { print "-Code:$error->{code},Message:$error->{message}\n" ; } } |
Шаг 4: подпрограмма send_email
И наконец, вот подпрограмма send_email, которая будет рассылать email:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
sub send_email { my %in = @_; my $subject = $in {subject}; my $content = $in {content}; my $sendmail = "/usr/sbin/sendmail -t" ; my $reply_to = "Reply-to: postmaster\@yourcompany.com\n" ; my $send_to = "To: manager\@yourcompany.com\n" open(SENDMAIL, "|$sendmail" ) or die "Cannot open $sendmail: $!" ; print SENDMAIL $reply_to ; print SENDMAIL $subject ; print SENDMAIL $send_to ; print SENDMAIL "Content-type: text/plain\n\n" ; print SENDMAIL $content ; close(SENDMAIL); } |
Шаг 5: SMS и CRON
Если вы хотите получать оповещения по SMS а не email, просто замените $send_to на смс адрес своего мобильного телефона. Для AT&T; wireless он будет выглядеть так: 1112223333@txt.att.net. Для дополнительной информации проконсультируйтесь с компанией поставщиком.
Если вы хотите получать отчет каждый час, вы можете добавить запись в ваш кронтаб.
1
|
0 * * * * root /path/to/your/script.pl &>/dev/null |
Скриншоты
Вот образец email оповещения, которое вы получите, если было пропущено слишком много звонков :
Вот образец email оповещения, которое вы получите, если звонящий прерывает вызов:
Вот образец полученного SMS оповещения, когда среднее время ожидания для очереди превышает 4 минуты.