Получаем в Telegram уведомления о пропущенных звонках в очереди.

Не так давно столкнулся с проблемой того, что мне нужно моментально получать уведомления о пропущенных звонках в 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 версии?

    • azaz:

      На 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
      После отправка уведомления.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *