Найти в Дзене
Merion Academy

Интеграция Asterisk и мессенджера Slack

Оглавление

Slack - крутой корпоративный мессенджер, который расширит инструментарий совместной работы на вашем предприятии. Создавая команды, каналы или обмениваясь личными сообщениями, пользователи взаимодействуют в едином информационном пространстве компании.

Мессенджер имеет отличный и очень понятный API. В статье расскажем о легком способе интеграции IP – АТС Asterisk и мессенджера Slack, покажем как отправлять уведомления о входящих вызовах и отправлять ежедневную статистику по звонкам.

SLACK API

Для настройки интеграции, нам понадобится так называемый Webhook URL. Получить его достаточно легко: в главном интерфейсе мессенджера, нажмите на Apps, как показано ниже:

В открывшемся окне, в строке поиска вводим webhook. Поиск подскажет совпадения – первое приложение, под именем Incoming WebHooks нам и нужно – нажимаем Install:

-2

В информации о приложении нажимаем Add Configuration:

-3

На этапе внедрения в конфигурацию вашего корпоративного мессенджера, приложение спросит, куда бы вы хотели постить сообщения, приходящие через Webhook (в нашем случае от Asterisk). Мы выбрали канал #general:

-4

После сделанного выбора, приложение сгенерирует для вас Webhook URL:

-5

Скопируйте этот URL. Переходим к настройке уведомлений.

УВЕДОМЛЕНИЯ О ВХОДЯЩЕМ ЗВОНКЕ В SLACK

Предположим, телефонная маршрутизация на нашем предприятии такова: перед тем, как звонящий будет соединен с менеджером, он слушает Announcement (голосовое сообщение), продолжительностью 15 секунд. Поэтому, в момент, как звонок только прилетел от провайдера на наш Asterisk мы будем отправлять уведомления. Ниже приведено код PHP – скрипта (комментарии по коду):

#!/usr/bin/php -q
<?php
# парсим номер звонящего
error_reporting(0);
require('phpagi.php');
$agi = new AGI();
$cid = $agi->request['agi_callerid'];
#заполняем нужные переменные (подробно описаны далее)
$webhook_url = '
https://hooks.slack.com/services/ваш_webhook_url';
$channel = "#general";
$username = "Merion Networks";
$icon_url = "//
merionet.ru/logo.png";
#формируем массив и преобразуем его в JSON
$fields = "payload=" . json_encode(array(
"channel" => $channel,
"text" => "Коллеги, входящий звонок! \nЗвонящий - $cid",
"username" => $username,
"icon_url" => $icon_url
));
# делаем CURL запрос в сторону API Slack
$ch = curl_init($webhook_url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
?>
Не забудьте поменять расширение файла с .txt на .php!

СКАЧАТЬ СКРИПТ

А теперь пошагово опишем то, что вам необходимо сделать, чтобы заставить этот скрипт работать:

  • Сохраняем скрипт в отдельный файл под названием slack.php;
  • В скрипте следующие переменные согласно своим данным;
  • $webhook_url - укажите Webhook URL адрес, который получили ранее;
  • $channel - канал, через который необходимо отправить сообщение;
  • $username - имя, которые все увидят в чате как отправителя;
  • $icon_url - укажите URL адрес картинки, которая будет выступать в качестве иконки отправителя;
  • Сохраните файл с изменениями;
  • Загрузите это PHP скрипт в директорию /var/lib/asterisk/agi-bin с именем slack.php;
  • В консоли сервера (через SSH доступ) дайте следующие команды:
chmod 755 /var/lib/asterisk/agi-bin/slack.php
chown asterisk:asterisk /var/lib/asterisk/agi-bin/slack.php
dos2unix /var/lib/asterisk/agi-bin/slack.php
  • Теперь скорректируем диалплан Asterisk:
exten => _.,n,AGI(slack.php)

Проверяем, что у нас получилось:

-6

Работает! Переходим к статистике по звонкам.

ОТЧЕТ ПО ЗВОНКАМ В SLACK

Давайте теперь научим Asterisk отправлять ежедневные отчеты по звонкам в Slack. Для этого формируем скрипт:

<?php
#выводим дату в адекватном формате;
function rus_date() {
$translate = array(
"am" => "дп",
"pm" => "пп",
"AM" => "ДП",
"PM" => "ПП",
"Monday" => "Понедельник",
"Mon" => "Пн",
"Tuesday" => "Вторник",
"Tue" => "Вт",
"Wednesday" => "Среда",
"Wed" => "Ср",
"Thursday" => "Четверг",
"Thu" => "Чт",
"Friday" => "Пятница",
"Fri" => "Пт",
"Saturday" => "Суббота",
"Sat" => "Сб",
"Sunday" => "Воскресенье",
"Sun" => "Вс",
"January" => "января",
"Jan" => "Янв",
"February" => "февраля",
"Feb" => "Фев",
"March" => "марта",
"Mar" => "Мар",
"April" => "апреля",
"Apr" => "Апр",
"May" => "мая",
"May" => "Мая",
"June" => "июня",
"Jun" => "Июн",
"July" => "июля",
"Jul" => "Июл",
"August" => "августа",
"Aug" => "Авг",
"September" => "сентября",
"Sep" => "Сен",
"October" => "октября",
"Oct" => "Окт",
"November" => "ноября",
"Nov" => "Ноя",
"December" => "декабря",
"Dec" => "Дек",
"st" => "ое",
"nd" => "ое",
"rd" => "е",
"th" => "ое"
);

if (func_num_args() > 1) {
$timestamp = func_get_arg(1);
return strtr(date(func_get_arg(0), $timestamp), $translate);
} else {
return strtr(date(func_get_arg(0)), $translate);
}
}
#формируем переменные:
$hostname = "localhost"; #на каком хосте располагается Asterisk;
$username = "логин"; #имя пользоватя SQL;
$password = "пароль"; #пароль, указанного пользователя;
$dbName = "asteriskcdrdb"; #оставляем без изменений;
$today = date('y-m-d'); #формируем дату для SQL - запроса;
$did = "74996491913"; #укажите здесь номер (DID), на который вам звонят клиенты;
$date_rus = rus_date("j F"); #применяем функцию для даты;
#парсим данные через SQL по звонкам
mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение ");
mysql_select_db($dbName) or die(mysql_error());
$query = "SELECT DISTINCT `clid` ,`dst` ,`duration` , `dstchannel` , `calldate` , `disposition` FROM `cdr` WHERE `calldate` >='$today 00:00:00' AND `calldate` <='$today 23:59:59' AND `did` = '$did' GROUP BY `clid`;" ;
$res=mysql_query($query) or die(mysql_error());
$number = mysql_num_rows($res);
while ($row=mysql_fetch_array($res)) {
if ($row['disposition'] == 'NO ANSWER') $noanswer = $noanswer + 1;} # считаем количество неотвеченных звонков;
if ($noanswer != 0) {$percentage = round(100 * ($noanswer / $number));} else {$percentage = 0;}; #подсчитываем процентное соотношение;
#Оправляем в Slack
$webhook_url = '
https://hooks.slack.com/services/ваш_webhook_url';
$channel = "#general";
$username = "Merion Networks";
$icon_url = "//
merionet.ru/logo.png";
$fields = "payload=" . json_encode(array(
"channel" => $channel,
"text" => "Коллеги! За сегодня, $date_rus, было уникальных звонков - $number\nИз них пропущено - $noanswer\nПроцент пропущенных от общего числа - $percentage%",
"username" => $username,
"icon_url" => $icon_url
));
$ch = curl_init($webhook_url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
?>
Не забудьте поменять расширение файла с .txt на .php!

СКАЧАТЬ СКРИПТ

Все комментарии по коду. Вам нужно указать только SQL – пользователя и опять же, webhook URL и другие параметры, которые мы описывали ранее. После этого:

  • Загружаем скрипт в директорию /home/admin/slack_calls.php
  • Даем команду:
chmod 755 /home/slack_calls.php
dos2unix /home/slack_calls.php
  • Даем команду для cron (запланируем скрипт на выполнение каждый будний день в 19:00):
crontab –e
00 19 * * 1-5 /usr/bin/php /home/slack_calls.php
-7

Приятной работы :)