Javascript code prettifier

суббота, 5 марта 2016 г.

Оповещения о пропущенных звонках из asterisk в slack


     Пропущенные звонки для компании - это всегда плохо, однако полностью избавиться от этого явления практически не возможно. Чтобы повысить уровень обслуживания клиентов правильным решением будет научиться правильно распознавать и реагировать на пропущенные звонки. В компании, где я работаю, для телефонной связи используется ip-АТС Asterisk, а в качестве корпоративного мессенджера - сервис Slack.

     Итак, у нас простая задача: отделить звонки, которые мы будем считать пропущенными и отправить о них уведомления в slack в определенный канал.
Пропущенным звонок будем считать, если:
1. клиент позвонил, некоторое время слушал музыку, устал ждать и повесил трубку
2. клиент позвонил, очень долго ждал, после чего звонок завершился по тайм-ауту  

     Статус звонка будем отслеживать по переменной ${DIALSTATUS}, в которую записывается результат выполнения последней команды Dial, в первом случае ее значение устанавливается в "CANCEL", во втором - "NOANSWER". Время ожидания клиента можно взять из переменной ${CDR(duration)}, которая должна быть в канале при включенной CDR-статистике.
Добавляем обработку екстеншена h в контекст отдела продаж в нашем диалплане:

exten => h,1,NoOp(IVR Sales Hangup)
exten => h,n,ExecIf($[$[$["${DIALSTATUS}" = "CANCEL"] & $["${CDR(duration)}" > "25"]] | $["${DIALSTATUS}" = "NOANSWER"]]?AGI(slack_sales_notifications.agi))
     Теперь если звонку присвоен статус - "отменен" и время ожидания более 25 секунд, либо установлен статус - "не отвечен" => будет выполняться AGI-скрипт для отправки уведомлений.

     Далее нам нужно создать в slack интеграцию, мы будем использовать отправку через webhook.

     Берем отсюда url и пишем скрипт - для этого можно использовать различные языки программирования, я сделал на python. Чтобы все работало нам потребуется установить библиотеки pyagi и slackweb.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pyagi.pyagi import AGI
import slackweb
import logging

slack = slackweb.Slack(url="https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX")
log_file = '/var/log/asterisk/slack_sales_notifications.log'

def main():
 log = logging.getLogger()                                               
 log.setLevel(logging.INFO)
 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
 fh = logging.FileHandler(log_file) 
 fh.setLevel(logging.DEBUG)                                              
 fh.setFormatter(formatter)                                                      
 log.addHandler(fh)                                                    

 try:
  agi = AGI()
  number = agi.env["agi_callerid"]
  name = agi.env["agi_calleridname"]
  time = agi.get_variable("CDR(duration)")
  message = "Пропущенный звонок:\n" + number + " - " + name
 except:
  log.error('Error set variables')
  exit(1)
 
 try:
  slack.notify(text=message, channel="#sales", username="Mr. Slack", icon_emoji=":phone-notifications:")
  log.info('Send message: ' + number + ' - ' + name + "    Duration:" + time)
 except:
  log.error('Error send message')
  exit(1)

if __name__ == '__main__':
 main()
     Скрипт берет установленные в канале переменные Caller ID, формирует сообщение и отправляет его в slack, информация о работе пишется в заданный лог-файл.

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

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