星号和发送丢失的电报/松弛/电子邮件

有一个电话中心。有带配置队列的Asterisk / FreePBX。有些代理商应该为电话服务。但是潜在的客户太多了,代理商太少,以至于第一个代理商无法以任何方式到达第二个代理商-他们排队等待一分钟,然后关闭。

但是由于某种原因,他们打电话给了!也许他们想为公司带来钱?让我们尝试使用FreePBX示例返回客户和他们的钱。

在队列设置中,您可以指定“故障转移目标”-当队列已满,超时时间已过时将呼叫发送到哪里。但是通常会发生这样的情况,即呼叫者在将其重定向到“故障转移目标”之前会断开连接-您永远不会知道连接已断开。对于这种情况,没有现成的解决方案。因此,我们会尽力而为,编写您自己的-将警报发送到Telegram / Slack / E-mail /其他地方。

我们需要了解的第一件事是FreePBX如何写入队列日志。在最简单的情况下,这是文本文件/ var / log /星号/ queue_log。

因此,来自订户8964467XXXXX的常规呼叫被写入到日志中,订户呼叫302221XXXX,在第603行到第一个位置,特工女孩在8秒后应答。他们聊了133秒,而订户是第一个挂断电话的人-每个人都会有如此有礼貌的经理!

1584318765|1584318747.89449|603|NONE|DID|302221
1584318765|1584318747.89449|603|NONE|ENTERQUEUE||8964467|1
1584318774|1584318747.89449|603|Agent Girl|CONNECT|9|1584318765.89450|8
1584318907|1584318747.89449|603|Agent Girl|COMPLETECALLER|9|133|1

而订户8996453XXXXX打电话给302257XXXXX,在第210号线路的第10个位置挂了10秒钟并断开了连接,情况就有些不同了。我什至没有听语音菜单!

1581728710|1581728690.59367|210|NONE|DID|302257
1581728710|1581728690.59367|210|NONE|ENTERQUEUE||8996453|1
1581728720|1581728690.59367|210|NONE|ABANDON|1|1|10

关于他,我们将在信使中写道。

为此,我们需要在日志文件中捕获ABANDON事件的发生。我很困惑如何解决这个问题,但是很偶然的时候,我偶然遇到了一个很棒的工具MONIT在我们的例子中,它将监视队列日志,并且一旦其中出现“ ABANDON”行,它将调用脚本来处理此事件。

为此,请在安装软件包后:

yum install monit

进行设置-创建文件/etc/monit.d/queue_log并在其中实际写入三行:

check file queue_log with path /var/log/asterisk/queue_log
    if content = "ABANDON" then
        exec "/var/lib/asterisk/agi-bin/qlogevent.sh $EVENT"

因此,当“ ABANDON”一词出现在队列日志中,告诉我们过早断开订户的连接时,将调用带有$ EVENT参数的/var/lib/asterisk/agi-bin/qlogevent.sh脚本,这完全是完全可以的。这个词出现的行。
这很简单。

现在不是国际象棋开始了,您需要考虑一下。

传递给脚本的行不包含有关调用方号码的信息:

1581728720|1581728690.59367|210|NONE|ABANDON|1|1|10

它只有时间戳(1581728720),唯一呼叫ID(1581728690.59367),队列号(210),事件本身以及其他一些非必要参数。那些。我们将不得不自己搜索订户号。又以什么方式?这非常简单,因为我们有通话的UID!

让我们再次转到此呼叫的日志,特别是订户进入队列的那一行:

1581728710|1581728690.59367|210|NONE|ENTERQUEUE||8996453|1

当“ ENTERQUEUE”事件发生时,参数之一就是我们需要的订户号。我们只能在queue_log文件中找到此行。这正是bash脚本正在做的事情,MONIT仔细地呼吁我们:

#!/bin/bash
#MONIT_DESCRITION - ,      .
# timestamp    - ( №1).
timedate=$(echo $MONIT_DESCRIPTION | cut -d\| -f1 | cut -d\: -f2 | gawk '{print strftime("%d.%m.%Y %H:%M:%S",$0);}')
# UID ( №2)
call_id=$(echo $MONIT_DESCRIPTION | cut -d\| -f2)
#   ( №3)
qnum=$(echo $MONIT_DESCRIPTION | cut -d\| -f3)

#      
case $qnum in
    210)
        qname=" 1"
        ;;
    220)
        qname=" 2"
        ;;
esac

#      UID,     ENTERQUEUE
str=$(grep "|$call_id|$qnum|.*|ENTERQUEUE" /var/log/asterisk/queue_log)
#      ( №7)
caller_id=$(echo $str | cut -d\| -f7)
#     ( №1)
time_enter=$(echo $str | cut -d\| -f1)
#     ( №1   ABANDON)
time_abandon=$(echo $MONIT_DESCRIPTION | cut -d\| -f1 | cut -d\: -f2)
# 
data=" $caller_id $timedate   $qname,       $(($time_abandon-$time_enter)) ."
#    /.     Slack.
/usr/bin/curl -X POST -H 'Content-type: application/json' --data '{"text":"'"$data"'"}' "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

实际上,仅此而已!

的确,有一个事件-MONIT,旨在监视所有事物;它本身需要监视,因为 定期下降。

All Articles