Не так давно столкнулся с проблемой того, что мне нужно моментально получать уведомления о пропущенных звонках в telegram чат
Готовых ,а главное рабочих решений в интернете мне найти так и не удалось, по этому изобретал свой велосипед.
С чем имеем дело? ОС Ubuntu 14.04, Asterisk 11.25 и FreePBX 12, звонки у нас поступают в очередь откуда их разгребают операторы.
Внимание, если у вас настроен Failover destination ,то данный метод вам не подходит, по скольку каждый переход звонка из очереди будет расцениваться как пропущенный
По скольку на борту имеем FreePBX 12 , то редактировать /etc/asterisk/extensions.conf смысла не имеет, так как после каждой перезагрузки сервера или после внесения изменений в настройки FreePBX содержимой этого конфига будет переписано. Значит надо искать другой вариант. Можно сделать в /etc/asterisk/extensions_override_freepbx.conf или в /etc/asterisk/extensions_custom.conf , я выбрал первый вариант.
Пишем в консоли nano /etc/asterisk/extensions_override_freepbx.conf и вставляем в конфиг следующий текст:
[ext-queues] include => ext-queues-custom exten => h,1,ExecIf($[(«${CDR(disposition)}» != «ANSWERED») ]?System(/etc/asterisk/scripts/propusk.sh ${NODEST} +${CALLERID(num)} ${CDR(duration)}) exten => h,2,NoOp(Status звонка = ${CDR(disposition)}) exten => h,3,Macro(hangupcall,)
После нажимаем ctrl + x, на вопрос «Save modified buffer (ANSWERING «No» WILL DESTROY CHANGES) ?» жмём «Y‘ и нажимаем ентер.
Что делает данный скрипт ? По сути он смотрит, если звонок завершен и не имеет статус отвечен , то запускает bash скрипт и передаёт в него имя очереди в которой был пропущенный звонок, номер телефона с которого звонили и время которое звонящий пробыл на линии.
Дальше собственно сам скрипт отправки уведомлений.
Что делает данный скрипт:
- Сперва приводит в один формат номер телефона, так как не все операторы и оборудование отдаём CallerID в одном формате.
- Формирует список занятых звонками операторов.
- В зависимости от номера очереди определяет куда был звонок. К примеру если у вас отдел продаж имеет очереди 500 и 501, а сервисный центр имеет номер очереди 502 , то вы получите сообщения о пропущенных звонках в отделах с их названиями, а не номера очередей
- Записывает в журнал дату и время звонка, направление (номер очереди, отдела) где пропустили звонок, время которое звонящий пробыл на линии до того, как положить трубку, номер телефона звонившего и список операторов которые были заняты звонками на момент пропуска
- Отправляет уведомление в нужный вам чат или группу в телеграмме со всеми вышеперечисленными данными
- Если нужно , то запускает следующий скрипт . У меня это было определение того, перезванивал ли кто то по пропущенному в течении 5 минут
Пишем в консоли nano /etc/asterisk/scripts/propusk.sh и вставляем в конфиг следующий текст, не забываем подправить под свои нужды:
#!/bin/sh # $1 Имя очереди , где был пропуск # $2 Номер телефона , с которого был пропуск # $3 Время, которое звонящий пробыл на линии DATE=$(date +"%Y-%m-%d") DATE2=$(date +"%H:%M %d-%m-%Y") num=$(echo $2|grep -o '[0-9]*') #нормализатор номеров nomer=$(echo -n "$num" | wc -c) if [ $nomer = 9 ];then #63XXXXXXX nomer=380$num elif [ $nomer = 10 ];then #063XXXXXXX nomer=38$num elif [ $nomer = 11 ];then #8063XXXXXXX nomer=3$num elif [ $nomer = 12 ];then #38063XXXXXXX nomer=$num fi # Получаем список операторов который на данный момент заняты звонками operator=$(asterisk -rx 'core show channels'|grep 'Up'|grep -o '/12[0-9][0-9]'|grep -o '12[0-9][0-9]'|sort -u) operator=$(echo -n $operator) # Выводим занятых операторов в одну строку # В зависимости от очереди определяем куда звонили и пишем в журнал case $1 in 500|501) # Если несколько очередей имеет одну конечную точку, перечисляем их через | На пример, когда в одном отделе есть несколько телефонов и на каждый из них заведена своя очередь dest="Направление звонка" # К примеру отдел продаж echo В $DATE2 $dest $3 $nomer $operator >> /var/log/asterisk/propuski/$DATE.txt ;; 502) dest="Направление звонка2" # К примеру сервисный центр echo В $DATE2 $dest $3 $nomer $operator>> /var/log/asterisk/propuski/$DATE.txt ;; esac message="$dest ,пропуcтил звонок. Клиент ждал $3 сек,срочно перезвоните по номеру: $nomer" subj=$nomer chat=-000000000 # Вписать свой id группы, канала или личный token='Токен телеграм бота' # Вписать свой /usr/bin/curl -s --header 'Content-Type: application/json' --request 'POST' --data "{\"chat_id\":\"${chat}\",\"text\":\"${subj}\n${message}\"}" "https://api.telegram.org/bot${token}/sendMessage" # На случай если дальше нужно запустить какой то скрипт , то подставляем свои пути # bash /etc/asterisk/scripts/telegramm/neperezvon.sh "$nomer" "$DATE2" "$dest" "$3" "$operator"
После нажимаем ctrl + x, на вопрос «Save modified buffer (ANSWERING «No» WILL DESTROY CHANGES) ?» жмём «Y‘ и нажимаем ентер.
Надеюсь было полезно)
3 комментария
Неработает
Подскажите как реализовать на 14 версии?
На 14 астериске не работает переменная ${CDR(disposition)}). Там можно после каждого hangup парсить очередь и смотреть с каким статусом закончился звонок.
Что то типа такого
/etc/asterisk/extensions_override_freepbx.conf
[ext-queues]
include => ext-queues-custom
exten => h,1,System(bash /etc/asterisk/scripts/propusk.sh ${NODEST} ${CALLERID(num)} ${CDR(duration)} ${CDR(billsec)} )
exten => h,2,NoOp(Status звонка =============================== ОПРЕДЕЛЯЕМ ПРОПУСК =============================== )
exten => h,3,Macro(hangupcall,)
/etc/asterisk/scripts/propusk.sh
#!/bin/sh
queue=$1 # Номер очереди от астера
number=$2 # Номер телефона
duration=$3 # Общее время на линии
billsec=$4 # Время разговора с оператором, если
log=/var/log/asterisk/queue_log # Путь к логу очередей
id=$(grep «$number» $log|tail -1|awk -F «|» ‘{print $2}’) # Получаем ID звонка
status=$(grep «$id» $log|awk -F «|» ‘{print $5}’|tail -1) # Получаем статус звонка
if [[ $status != ABANDON ]];then
exit # Если статус равен ABANDON то прекращаем выполнение скрипта, если другой , то продолжаем выполнение и отправляем уведомление
fi
После отправка уведомления.