¬аш вопрос св€зан с хэштэгами #“елефони€, #FreePBX и Asterisk, #ѕолезные советы? —просите в Telegram!

ћерион Ќетворкс

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

ћессенджер имеет отличный и очень пон€тный API. ¬ статье расскажем о легком способе интеграции IP Ц ј“— Asterisk и мессенджера Slack, покажем как отправл€ть уведомлени€ о вход€щих вызовах и отправл€ть ежедневную статистику по звонкам.


Slack API

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

Apps в мессенджере Slack

¬ открывшемс€ окне, в строке поиска вводим webhook. ѕоиск подскажет совпадени€ Ц первое приложение, под именем Incoming WebHooks нам и нужно Ц нажимаем Install:

Slack Incoming Webhook установка

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

Slack Incoming Webhook Add Configuration

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

Slack Incoming Webhook Post to Channel

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

Slack Webhook URL

—копируйте этот 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 = "http://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!
—качать скрипт

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

  1. —охран€ем скрипт в отдельный файл под названием slack.php;
  2. ¬ скрипте следующие переменные согласно своим данным;
    • $webhook_url - укажите Webhook URL адрес, который получили ранее;
    • $channel - канал, через который необходимо отправить сообщение;
    • $username - им€, которые все увид€т в чате как отправител€;
    • $icon_url - укажите URL адрес картинки, котора€ будет выступать в качестве иконки отправител€;
  3. —охраните файл с изменени€ми;
  4. «агрузите это PHP скрипт в директорию /var/lib/asterisk/agi-bin с именем slack.php;
  5. ¬ консоли сервера (через SSH доступ) дайте следующие команды:
  6. 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
    
  7. “еперь скорректируем диалплан Asterisk:
  8. exten => _.,n,AGI(slack.php)

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

»нтеграци€ Asterisk и мессенджера Slack

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


ќтчет по звонкам в 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 = "http://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 и другие параметры, которые мы описывали ранее. ѕосле этого:

  1. «агружаем скрипт в директорию /home/admin/slack_calls.php
  2. ƒаем команду:
  3. chmod 755 /home/slack_calls.php
    dos2unix /home/slack_calls.php
  4. ƒаем команду дл€ cron (запланируем скрипт на выполнение каждый будний день в 19:00):
  5. crontab Цe
    
    00 19 * * 1-5 /usr/bin/php /home/slack_calls.php
≈жедневный отчет по звонкам Asterisk в Slack

ѕри€тной работы :)


ѕолезна ли ¬ам эта стать€?

–аз в неделю мы отправл€ем дайджест с самыми интересными стать€ми.

P.S. ≈сли укажите свою дату рождени€, то мы об€зательно ¬ас поздравим и подарим небольшой подарок :)

Ќажима€ на кнопку "ѕодписатьс€", вы даете согласие на обработку своих персональных данных