Отправка оповещений о состоянии очереди звонков Switchvox

Администратор, 16.01.2013

Данный туториал продемонстрирует Вам, как создать PERL скрипт для отправки e-mail оповещений, когда количество звонков, находящихся в очереди, достигает определённого числа. 

Допустим, что общее число пропущенных вызовов в очереди стало очень велико. 

В таком случае, Вам будет отправленно соответствующее уведомление в виде e-mail или SMS, что позволит отслеживать работу сотрудников и оценивать ситуацию.

Для работы требуется:

  • Опыт работы c PERL установке задач в cron
  • Знание Extend API
  • Установленная PERL библиотека Switchvox::API

Также рекомендуем ознакомиться:

switchvox.callQueueReports.search

switchvox.callQueueLogs.search

Шаг 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 оповещения

Вот образец email оповещения, которое вы получите, если звонящий прерывает вызов:

Образец email оповещения

Вот образец полученного SMS оповещения, когда среднее время ожидания для очереди превышает 4 минуты.

sms_screenshot.png