- PVSM.RU - https://www.pvsm.ru -

Уведомления о пропущенных звонках с Asterisk на Битрикс24

Случается, что звонок с офисной АТС приходит на мобильный. И пропускается и на нём тоже.
Причины для этого у каждого свои, но последствия одни и те же — ты смотришь на городской номер офиса и думаешь, а кто же это звонил?

Уведомления о пропущенных звонках с Asterisk на Битрикс24 - 1

На Хабре уже не раз обсуждалась эта тема. Уведомления отправляли и на почту, и с помощью СМС, в последнее время модно делать это телеграм-ботами, однако я буду использовать Битрикс24.

Почему именно его? Добро пожаловать под кат!

Собственно, всё довольно просто — push-уведомления на телефонах подкупающе удобны и хочется использовать что-то, что доставит минимум хлопот при постоянном использовании.

Почему не Телеграм? Просто в нём реализуется только общий чат, а хотелось бы некоторой приятной приватности.

Почему не СМС? Оставив за скобками вопрос небесплатности, скажу о том, что не хочется плодить точки обслуживания при приёме или увольнении сотрудника. Хочется, чтобы отключил его в AD и всё, нет у него больше корпоративных сервисов.

Почему не почта (уж она-то по предыдущему пункту вполне годится)? Потому что сотрудники внезапно не используют её на телефонах (ну, у нас и массово во всяком случае).

В общем, по итогу сомнений и тягостных раздумий, решили остановиться на корпоративном портале на базе Битрикса. Про него можно сказать многое (и не всегда хорошее), но он у нас есть и сотрудники им пользуются.
К тому же, интегрирован с AD и в него прописаны данные всех сотрудников (включая внутренние телефоны, это важно).

В общем, к делу!
Предупреждение: код ниже может нанести вам моральные травмы. Сразу соглашаюсь с тем, что он ужасен, всё-таки я не кодер.

Для начала соорудим приёмник со стороны портала, на который будут приходить уведомления и который будет слать их в IM:

send_from_pbx.php

<?
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
if(!CModule::IncludeModule('iblock')) die('error');
if(!CModule::IncludeModule('im')) die('error');

$output = shell_exec("mysql bitrix -BN -ubitrix_user -pbitrix_pass -e "SELECT VALUE_ID FROM b_uts_user WHERE UF_PHONE_INNER = $_POST[number]"");
echo "<pre>$output</pre>";

$arFields = array(

"MESSAGE_TYPE" => "P", # P - private chat, G - group chat, S - notification
"TO_USER_ID" => $output,
"FROM_USER_ID" => 111,
"MESSAGE" => "$_POST[message]",
"AUTHOR_ID" => 111,
"EMAIL_TEMPLATE" => "some",

"NOTIFY_TYPE" => 2,
"NOTIFY_MODULE" => "main",
"NOTIFY_EVENT" => "IM_GROUP_INVITE",
"NOTIFY_TITLE" => "Пропущенный звонок",
);
CModule::IncludeModule('im');
if(CIMMessenger::Add($arFields))
    echo "success";
else
    echo "error";
?>

примечание: здесь всё довольно просто. Сначала дёргаем БД, получая соответствие «внутренний номер — ID пользователя в битриксе», затем отправляем сообщение от учётной записи, специально заведённой для Астериска. В принципе, можно отправлять и от имени системы, дело вкуса.

Теперь, на сервере Астериска выложим небольшой скрипт:

send.sh

#! /bin/bash

date=`date +%H:%M`

curl --cookie-jar cookies.txt 'https://portal.domain.ru/?login=yes' -H 'Host: portal.domain.ru' 
        --data 'AUTH_FORM=Y&TYPE=AUTH&backurl=%2F&USER_LOGIN=asterisk&USER_PASSWORD=perasperaadastra&USER_REMEMBER=Y' > /dev/null 2>&1

curl --cookie cookies.txt --data "message=Вам не смогли дозвониться. Абонент $1 звонил вам в $date&number=$2" 
        https://portal.domain.ru/send_from_pbx.php > /dev/null 2>&1

Здесь всё ещё проще. Авторизуемся с помощью curl, а затем им же шлём POST-ом сообщение и номер телефона.

Ну и наконец правим extensions.conf в Астериске. В макрос, который переводит звонки на мобильный в случае недоступности основного телефона дописываем ровно одну строку, вызывающую скрипт, который мы только что написали (на всякий случай приведу здесь весь макрос):

[macro-mobile]
exten => s,1,Set(CDR(userfield)=LOCAL)
exten => s,n,ExecIf($[${LEN(${CALLERID(num)})}=3]?Set(name=${SHELL( mysql asterisk -uasterisk -pperasperaadastra -sse 'SELECT callerid FROM peers WHERE defaultuser=${CALLERID(num)}' )$
exten => s,n,Macro(record,local)
exten => s,n,Dial(SIP/${MACRO_EXTEN},20)
exten => s,n,Dial(SIP/tel_out/${ARG1})
exten => s,n,System(/srv/asterisk/send2bitrix/send.sh "${name} (номер ${CALLERID(num)})" ${EXTEN})

в плане набора этот макрос используется следующим образом:

exten => 100,1,Macro(mobile,79251122333)

Здесь всё так же довольно очевидно. Макрос принудительно выставляет CallerID из БД, включает запись разговоров, пытается дозвониться на основной телефон, затем на мобильный и, потерпев фиаско, вызывает наш скрипт, уведомляющий пользователя о том, кто и во сколько ему звонил.

Вот и всё. Спасибо за внимание!
Если у вы хотите что-то уточнить, высказаться, и уж тем более дать добрый совет — пишите.

Автор: StraNNicK

Источник [1]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/php-2/260288

Ссылки в тексте:

[1] Источник: https://habrahabr.ru/post/332954/