ИНТЕГРАЦИЯ ASTERISK И TELEGRAM

Все больше и больше бизнес переходит в IM (Instant messaging, мгновенные сообщения), который позволяет оперативно обрабатывать заявки, обращения клиентов и оповещать своих сотрудников о различных событиях через привычные для них средства – мессенджеры. Сегодня мы покажем простой способ интеграции IP – АТС Asterisk и мессенджера Telegram с отправкой

сообщений в групповой чат.


ПОШАГОВОЕ ВИДЕО


СОЗДАНИЕ БОТА В TELEGRAM

Итак, переходим к созданию бота. Находим через поиск бота, который называется @BotFather. Выполняем:

  • /newbot — пишем команду на создание нового бота;
  • Merion Knowledge Base — пишем имя для бота;
  • merionkbbot — пишем username для нашего бота;
  • /setuserpic — опционально – присвойте картинку боту;
Создание бота в Telegram для Asterisk

На картинке выше выделен API токен (331754110:AAHkMNalOz5I_Schh2kvj7ONhRcE8HuKV-c), который нам пригодится на следующем этапе. Запоминаем его.

Открываем диалог с нашим ботом и даем в чат команду /start — это нужно для активации бота:

Активация бота в Telegram для Asterisk

Теперь, добавьте вашего бота в групповой чат. Это делается по аналогии, с приглашением других участников. Просто укажите username бота в поиске и добавьте в группу. Теперь в групповой чат пишем следующую команду:

/join @merionkbbot

В вашем случае, это будет username вашего бота после символа @. Теперь открываем следующий URL в web — броузере:

https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXXXX/getUpdates

Где XXXXXXXXXXXXXXXXXXXXXX — ваш токен. У нас получилось вот так:

Получить chat_id для бота в Telegram

Получаем id нашего группового чата – в нашем случае это -4455667. Приступаем к настройке скрипта на Asterisk.


НАСТРОЙКА СКРИПТА НА ASTERISK

Скрипт написан на языке PHP и будет вызываться из диалплана Asterisk с помощью AGI. Скрипт следующего содержания:

#!/usr/bin/php -q
<?php
require('phpagi.php'); 
$agi = new AGI(); 
$cid = $agi->request['agi_callerid'];
$phoneFieldset = "Входящий звонок с номера: ";
$token = "331754110:AAHkMNalOz5I_Schh2kvj7ONhRcE8HuKV-c";
$chat_id = "-4455667";
$arr = array(
$phoneFieldset => $cid,
);
foreach($arr as $key => $value) {
$txt .= "".$key." ".$value."%0A";
};
fopen("https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}&parse_mode=html&text={$txt}","r");
?>

В переменные $token и $chat_id соответственно нужно добавить ваши данные. Сохраняем скрипт с название telegram.php и закидываем в директорию /var/lib/asterisk/agi-bin/. Далее даем права на исполнение и преобразуем в unix формат:

chmod 755 /var/lib/asterisk/agi-bin/telegram.php
chown asterisk:asterisk /var/lib/asterisk/agi-bin/telegram.php
dos2unix /var/lib/asterisk/agi-bin/telegram.php

Сам PHP файл предварительно сохраните в кодировке UTF – 8 (без BOM).

Адаптируем скрипт в диалплан. Мы будем отправлять уведомления по факту звонка на точке входа – то есть на SIP – транке. Поэтому, на входящем транке, в его контекст обработки добавляем следующую строчку:

exten => _.,n,AGI(telegram.php)

Сохраняем, перезагружаем диалплан, звоним и проверяем:

 Интеграция Asterisk и Telegram работает

Что еще можно сделать:

Все супер! Спасибо. но вот сегодня днем лежал Телеграм у многих и у меня в регионе в том числе. Всплыла одна маленькая неприятность — пока не отправит сообщение не проходит входящий звонок. проблему решил так: вместо открытия ссылки fopen сделал это с помощью curl и указал тайтаут запроса.
В скрипте выше вместо строчки

fopen(«https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}&parse_mode=html&text={$txt}»,»r»);

пишем:
$website=»https://api.telegram.org/bot«.$token;
$params=[
‘chat_id’=>$chat_id,
‘text’=>$txt,
];
$ch = curl_init($website . ‘/sendMessage’);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, ($params));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close($ch);

И к Вам обязательно придет входящий вызов, даже если телеграм недоступен 😉

PS строку $txt .= «».$key.» «.$value.»%0A»; немного пришлось исправить на $txt .= «».$key.» «.$value;

После нескольких дней проб и ошибок мне удалось настроить отправку с прокси. (актуально для РФ)
Работает в связке: Ubuntu18.04.1, PHP 7.2.24, FreePBX 15.06.16, Asterisk 16.2.0
#!/usr/bin/php -q
request['agi_callerid'];
$phoneFieldset = "Входящий звонок с номера: ";
$token = "000000000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
$chat_id = "000000000";
$arr = array(
$phoneFieldset => $cid,
);
foreach($arr as $key => $value) {
$txt .= "".$key." ".$value;
};

$website="https://api.telegram.org/bot".$token;
$params=[
'chat_id'=>$chat_id,
'text'=>$txt,
];

$prxy = 'http://IP_ADRESS:PORT'; // адрес:порт прокси
$ch = curl_init($website . '/sendMessage');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($ch, CURLOPT_PROXY, $prxy);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_POSTFIELDS, ($params));
$result = curl_exec($ch);
curl_close($ch);
?>

IP адрес и номер порта брал от суда: https://hidemy.name/ru/proxy-list/?country=NL&type=h#list

Добавить комментарий