有一个电话中心。有带配置队列的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
timedate=$(echo $MONIT_DESCRIPTION | cut -d\| -f1 | cut -d\: -f2 | gawk '{print strftime("%d.%m.%Y %H:%M:%S",$0);}')
call_id=$(echo $MONIT_DESCRIPTION | cut -d\| -f2)
qnum=$(echo $MONIT_DESCRIPTION | cut -d\| -f3)
case $qnum in
210)
qname=" 1"
;;
220)
qname=" 2"
;;
esac
str=$(grep "|$call_id|$qnum|.*|ENTERQUEUE" /var/log/asterisk/queue_log)
caller_id=$(echo $str | cut -d\| -f7)
time_enter=$(echo $str | cut -d\| -f1)
time_abandon=$(echo $MONIT_DESCRIPTION | cut -d\| -f1 | cut -d\: -f2)
data=" $caller_id $timedate $qname, $(($time_abandon-$time_enter)) ."
/usr/bin/curl -X POST -H 'Content-type: application/json' --data '{"text":"'"$data"'"}' "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
实际上,仅此而已!的确,有一个事件-MONIT,旨在监视所有事物;它本身需要监视,因为 定期下降。