Asterisk: отправить сообщение при ожидании клиента в очереди более 3 минут

Потребовалось реализовать следующее: если клиент ожидает в очереди ответа более 3 минут - необходимо отправить сообщение в Telegram с именем (CallerID) и номером телефона клиента. Здесь мы рассмотрим как реализовать это самым простым способом, напрямую из диалплана.

Итак, клиент заходит в очередь, ему проигрывается сообщение автоинформатора и начинает играть фоновая музыка пока оператор не ответит на его звонок. Если клиенту не отвечают в течение 21 минуты, мы выходим из очереди и выполняем с ним дальнейшие действия (например, кладем трубку).
При этом, если ему не отвечают в течение 3 минут, нужно отправить сообщение в телеграм (или выполнить любые другие действия). Для этого мы создадим цикл: запустим клиента на 3 минуты в очередь, если он выйдет из очереди - астериск отправит сообщение и вернёт клиента обратно. Цикл будет повторяться каждые 3 минуты в течение 21 минуты. Для клиента все остается по старому, для этого после первого выхода из очереди нужно сменить ему Musicclass (убираем автоинформатора и оставляем только фоновую музыку).

Приступим к реализации. Опишем диалплан, в части где клиент попадает в очередь:
;вводим 2 новые переменные: время ожидания и счетчик цикла
same => n,Set(wait-time=3)
same => n,Set(i=1)
;начало цикла, прогоняем его 7 раз (21 минуту)
same => n,While($[${i} < 8])
;отправляем в очередь my-queue на 3 минуты
same => n,Queue(my-queue,TtxX,,,180)
;если клиенту через 3 минуты не ответили, он выходит из очереди, мы отправляем сообщение в Telegram
;символ & мы используем, чтобы не ждать выполнения скрипта, а сразу идти дальше
same => n,System(/etc/asterisk/scripts/queue-wait-time-send.sh '${CALLERID(name}, ${CALLERID(num)} ожидает ответа более ${wait-time} минут.' &)
;увеличиваем счетчик цикла на 1
same => n,Set(i=$[${i} + 1])
;увеличиваем время ожидания на 3 минуты
same => n,Set(wait-time=$[${wait-time} + 3])
;меняем класс музыки для очереди, чтобы был только с фоновой музыкой
same => n,Set(CHANNEL(musicclass)=background)
;конец цикла
same => n,EndWhile
Если команды While или System не работают, проверьте подключены ли соответствующие модули в /etc/asterisk/modules.conf
load => app_while.so
load => app_system.so
Далее нам нужно создать класс для музыки в файле /etc/asterisk/musiconhold.conf:
[background]
mode=files
directory=/usr/share/asterisk/sounds/ru/background
sort=alpha ; проигрываем файлы из папки в алфавитном порядке
В папку /usr/share/asterisk/sounds/ru/background кладем файлы с фоновой музыкой.

Теперь создадим скрипт для отправки данных в telegram (или куда вам нужно):
touch /etc/asterisk/scripts/queue-wait-time-send.sh
chmod +x /etc/asterisk/scripts/queue-wait-time-send.sh
nano /etc/asterisk/scripts/queue-wait-time-send.sh
С кодом:
#!/bin/bash
curl -s -X POST https://api.telegram.org/botXXX/sendMessage -d chat_id=-XXX -d text="$1"
Вам нужно создать бота и чат с ним, и далее вписать в скрипт. $1 - это данные которые передаются в скрипт ключом (в кавычках т.к. это строка). Или использовать свой способ отправки сообщений.

Комментариев нет:

Отправить комментарий