Сергей Маликов
25.08.2019
601

Отправка сообщений о пропущенных вызовах в Telegram для Asterisk Vanilla и Freepbx.

Отправка сообщений в Telegram о пропущенных вызовах позволит не упустить ни одного важного звонка. В статье рассматривается создание простой системы уведомлений. Для этого необходимо: зарегистрировать в мессенджере telegram своего бота, написать agi скрипт, и внести изменения в диалплан. Регистрация собственного бота в Telegram. Вначале необходимо зарегистрировать своего бота. Для этого нужно зайти в Telegram и […]

Отправка сообщений в Telegram о пропущенных вызовах позволит не упустить ни одного важного звонка. В статье рассматривается создание простой системы уведомлений. Для этого необходимо: зарегистрировать в мессенджере telegram своего бота, написать agi скрипт, и внести изменения в диалплан.

Регистрация собственного бота в Telegram.

Вначале необходимо зарегистрировать своего бота. Для этого нужно зайти в Telegram и начать чат с @BotFather. Откроется список поддерживаемых команд, отправить команду /newbot.

Добавление нового бота – чат с @BotFather
Добавление нового бота – чат с @BotFather

Затем выбрать название бота(name) и его имя(username), по которому бот будет доступен для поиска. По названию нет особых требований, имя бота обязательно должно быть уникально и оканчиваться на “bot”. Боту можно добавить описание и аватар. По окончанию процесса создания бота,@BotFather отправит токен созданного бота. Так как токен предназначен для управления и работы с ботом через HTTP-запросы, @BotFather выводит предупреждение, что токен необходимо хранить в безопасности и не передавать.Также, скомпрометированный токен можно сгенерировать заново.

Добавление нового бота – полученный токен @TestGramBot

Добавление нового бота – полученный токен @TestGramBot

По умолчанию в настройках бота включен режим приватности – все сообщения, отправляемые определенному пользователю, не видны остальным участникам переписки.

Для того, чтобы @TestGramBot мог отправлять сообщения какому-либо оператору в чат, или в группу необходимо узнать chatid оператора или созданной группы. Оператору необходимо войти в свой аккаунт в телеграм, и начать диалог с @TestGramBot (нажать start или отправить /start, и, затем отправить сообщение, например Hello).

Инициирование диалога с @TestGramBot

Инициирование диалога с @TestGramBot

Если после этого необходимо открыть браузер и перейти по адресу https://api.telegram.org/bot[ТОКЕН_БОТА]/getUpdates. Например https://api.telegram.org/bot123411111:AAABBBbGQDz1111_AAAAbb00aaa1111111/getUpdates

В пришедшем ответе, найдите поле chat, а в нём –  id.  Если  type: private это внутренний chatid (id контакта в телеграме).

Определение chatid оператора или группы

Определение chatid оператора или группы

Создание agi скрипта на php.

Узнав chatid операторов, необходимо создать php скрипт в папке /var/lib/asterisk/agi-bin/ /var/lib/asterisk/agi-bin/telegram.php. По умолчанию файл создается от пользователя root c правами 644. Скрипт должен иметь права 664, владелец:asterisk, группа:asterisk. Также необходимо разрешить выполнение скрипта командой chmod +x /var/lib/asterisk/agi-bin/telegram.php.

В скрипт будут передаваться два параметра – номер звонившего и дата звонка. Данные для отправки занесем в переменную $text. Для отправки в телеграм также потребуется прокси. В переменной $token необходимо присвоить токен ранее созданного бота, $chatid – id оператора в телеграм, которому будут отправляться сообщения. Сообщение отправляется с помощью post запроса php функцией curl_exec().

#!/usr/bin/php -q
<?php
require('phpagi.php'); //подключаем библиотеку phpagi.php
$agi = new AGI(); 
$stdin = fopen('php://stdin', 'r');
$stdout = fopen('php://stdout', 'w');
/*
Вынесем отправку в телеграм в отдельную функцию send, последний параметр укажем как необязательный т.к. для тестовых сообщений используются бесплатные прокси – без пароля
*/
function send($token, $chatid, $text, $proxy, $auth=NULL){
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.telegram.org/bot'.$token.'/sendMessage');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'chat_id='.$chatid.'&text='.urlencode($text));
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
if($auth){
	curl_setopt($ch, CURLOPT_PROXYUSERPWD, $auth);
}
// Отправляем сообщение
$result=curl_exec($ch);
/*
Для отладки в скрипте можно добавить dump какой-либо переменной, например $result. Результат вывода var_dump($result) отобразится в консоли Астериска при включенном режиме отладки agi -  agi set debug on
*/
var_dump($result);
curl_close($ch);
return $result;
}
// Токен бота и идентификатор чата
$token='735067350:AAFPVUdGQDz7350_TchKxvAOhr38wU7350';
//id чата оператора в telegram
$chatid = 213213213;
/* Текст сообщения. Переданные в скрипт аргументы (номер звонящего и дата звонка) - $argv[1]  и $argv[2] */
$text='Звонил ' . $argv[1] . ' Дата ' .  $argv[2];
// Настройки прокси
$proxy='23.23.179.254:3128';
//$auth='login:password'; //пароль, если прокси – с паролем, в формате 'login:password'
// Отправка сообщения в личный Telergam чат
send($token, $chatid, $text, $proxy);
fclose ($stdin);
fclose ($stdout);
exit(0);
?>

Изменение диалплана.

Также необходимо добавить в диалплан вызов AGI скрипта /var/lib/asterisk/agi-bin/telegram.php. Предположим, что все вызовы поступают в голосовое меню. Если используется freepbx необходимо отредактировать файл /etc/asterisk/extensions_override_freepbx.conf и добавить контекст [ivr-1], где 1-номер ivr. Если используется Asterisk Vanilla – /etc/asterisk/extensions.conf.

Id голосового меню отображается при его редактировании в адресной строке
Id голосового меню отображается при его редактировании в адресной строке

В экстеншене h (hangup), который выполняется после завершения вызова, вызовем agi-скрипт, который отправит сообщение о пропущенном вызове в телеграм если на звонок не ответили (noanswer) или звонок был завершен с сообщением “занято”; в скрипт также передаются 2 параметра – номер звонившего и дата звонка.

[ivr-1] 
[ivr-1]
exten => h,1,ExecIf($["${DIALSTATUS}" = "NOANSWER"] | $["${DIALSTATUS}" = "BUSY"])?AGI(telegram.php, ${CALLERID(num)}, ${STRFTIME(${EPOCH},,%Y.%m.%d-%H:%M:%S)})
same  => n,Hangup()

После сохранения, для применения настроек необходимо в консоли Астериска сделать релоад модулей:

аsterisk –rvvvv    – для входа в консоль

 (в CLI) dialplan reload

Пример сообщения о пропущенном звонке, отправленного ботом в telegram
Пример сообщения о пропущенном звонке, отправленного ботом в telegram
 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices