8(499)-709-97-83
Работаем с 10:00 до 19:00

Организация конференций с помощью Telegram бота, Asterisk и Node JS

  • 17 августа 2017


Довольно часто компании, использующие различные IP АТС, сталкиваются с необходимостью соединения в конференцию различных сотрудников или внешних абонентов для обсуждения текущих дел и планерок. Если данный процесс не автоматизирован, то чаще всего сами абоненты звонят на номера и переводят в конференц комнаты. Конечно в некоторых софтфонах есть функционал сбора конференции, но они либо имеют ограничения, либо сложны в эксплуатации. В последнее время стал очень популярен мессенджер telegram, который помимо функции общения, имеет очень хорошее api. В сегодняшней статье мы расскажем, как с помощью telegram, asterisk и node js сделать простой сборщик обычных конференций и отложенных конференций.




Сперва нам нужно создать бота telegram, которому мы будем отправлять номера, для которых требуется создать конференцию.Для этого зайдем в telegram, в поиске найдём @botfather и дадим ему команду /newbot.


В ответ отец всех ботов предложит выбрать имя бота. После того, как имя бота задано, зададим username. В отличии от имени бота, username должен быть уникальным (служит для идентификации бота), и должен заканчиваться словом «бот», например, myasterbot_bot.


Как только уникальный username задан, отец сообщит токен, который будет использоваться для авторизации и работы с telegram.

Найдите бота по заданному username и пошлите ему команду /start.



Для того чтобы писать на языке JavaScript серверные приложения, необходимо установить Node JS. Инструкции по настройке вы можете найти на просторах интернета. После установки Node JS создайте каталог, где будет расположен ваш проект. Например:

mkdir myasterbot
cd myasterbot

Теперь нам нужно установить необходимые пакеты, в данном случае это будет node-telegram-bot-api (Модуль авторизация и работа с telegram), и nami (Модуль для работы с AMI. Данный модуль обладает довольно большим функционалом из коробки, и имеет готовые методы для работы с большей частью Events, Actions и Respons). Для установки пакета необходимо набрать в командной строке npm install . В этом случае пакет будет установлен в каталоге, из которого была вызвана команда install, в этом каталоге будет создан каталог с именем node_modules/. Устанавливаем нужные нам пакеты:

npm install node-telegram-bot-api
npm install nami

Подготовим Asterisk для взаимодействия с NodeJS. Настройки AMI находятся в файле /etc/asterisk/manager.conf, в нём же прописываются пользователи AMI, их пароли и права доступа. Создадим пользователя nami со сложным паролем и укажем минимальные права доступа. Важно также в секцию general добавить опции, указанные в примере.

nano /etc/asterisk/manager.conf
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
webenabled = yes
httptimeout = 60

[nami]
secret = iI863fo6rZYD26b
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.0
read = cdr,reporting,originate
write = reporting,originate

После создания пользователя заходим в консоль asterisk и делаем manager reload

asterisk -rv
asterisk>manager reload

Протестируем подключение к AMI, установив TCP-соединение на порт указанными нами в настройке выше способами (по умолчанию 5038), выполнив команду telnet 127.0.0.1 5038 на сервере. Прежде чем вы начнете получать Events, требуется авторизоваться, выполнив команду Action: Login, Username: <имя_пользователя>, Secret: <пароль>, в нашем примере это будет выглядеть следующим образом:

Action: Login
Username: nami
Secret: iI863fo6rZYD26b

Если авторизация прошла успешно, и в консоли стали появляться различные сообщения о событиях, то все работает как надо, и мы можем продолжить.

Теперь нам нужно в диалплане создать контекст и номер, который будет использовать наш бот для организации конференции. Переходим в /etc/asterisk/extensions.ael (нам привычней создавать диалпланы в ael, вы можете создать в стандартном файле конфигурации extensions.conf), и добавляем туда следующее:

context myasterbot {
9000=>{
Answer();
ConfBridge(1234);
}
}

После чего в консоли asterisk делаем ael reload

asterisk -rv
asterisk>ael reload

В нашем примере мы сделали контекст myasterbot с номером 9000, и конференц-комнату с номером 1234. Мы не меняли стандартные настройки конференц-комнат, и если вы хотите сделать свои, измените их в файле /etc/asterisk/confbridge.conf. С Asterisk мы закончили, и теперь вернемся к написанию нашей программы для организации конференции через telegram бот.

Переходим в нашу папку myasterbot и создаем там файл app.js со следующим содержимым:

console.log("My first telegram conf bot");

Чтобы запустить приложение, наберите в командной строке node app.js, и вы должны увидеть в консоли следующую строку My first telegram conf bot. Если все прошло гладко, то все пока работает как надо, и можно идти дальше, если нет, то советую еще раз проверить установку nodejs и корректность данных.

Написанное нами ранее в app.js console.log больше нам не нужно, нам нужно туда скопировать настройки nami. Можно сделать это руками, скопировав данные из файла myasterbot/node_modules/nami/src/index.js либо командой:

cp  myasterbot/node_modules/nami/src/index.js  myasterbot/app.js

Открываем наш файл app.js и меняем путь в следующей строчке:

var namiLib = require(__dirname + "/nami.js");

на

var namiLib = require("nami");

Теперь проверим корректность подключения nami к Asterisk, введя в консоли:

nodejs app.js localhost 5038 nami iI863fo6rZYD26b

В консоли вы должны увидеть различные сообщения Asterisk. Если сообщения есть, значит связка Asterisk NodeJS работает, и можно переходить к связке с NodeJS Telegram, если у вас появляются ошибки, то надо проверять корректность данных AMI пользователя.

Открываем наш app.js (если мешают комментарии, которые находятся в /*! .. */ их можно удалить), и после комментариев вставляем следующий код:

var TelegramBot = require('node-telegram-bot-api');
var token = "ВАШ TOKEN";
var bot = new TelegramBot(token, {polling: true});

bot.onText(/ping/, function (msg, match) {
bot.sendMessage(msg.chat.id, 'pong');
});

Не забудьте заполнить переменную var token = "ВАШ TOKEN" вашим токеном, полученным от бота BotFather. Теперь в консоли введем nodejs app.js localhost 5038 nami iI863fo6rZYD26b и отправим нашему боту сообщение /ping в ответ он должен нам ответить pong:


Все основные модули у нас работают, и теперь можно приступить к написанию основного кода. Боту мы будем отправлять несколько номеров для организации конференции, так что определим следующую переменную, в которую у нас будет помещаться массив номеров:

var confArrayNumber;

Теперь создадим функцию callConfNumber, в которую мы будем передавать наш массив номеров (confArrayNumber) и осуществлять инициации вызовов на эти номера с последующим перенаправлением в контекст myasterbot. Добавим следующий код:

function callConfNumber(confArrayNumber){
var action = new namiLib.Actions.Originate();
action.channel = "SIP/operator/"+confArrayNumber;
action.callerid = "3157776677";
action.priority = "1";
action.timeout = "50000";
action.context = "myasterbot";
action.exten = 9000;
action.ActionID = "1";
action.async = "yes";
nami.send(action);
}

В action.channel = "SIP/operator/"+confArrayNumber; вместо operator указываете название транка вашего оператора. Передавать telegram боту номера, с которыми нам нужно создать конференцию, будем следующим образом /conf номер1;номер2;номер3, например /conf 74997099783;74991234567;79101234567. Если у вас оператор принимает номера не в формате E.164, то вместо 7 ставим 8. Добавим следующий код в нашу программу:

bot.onText(/\/conf (.+)$/, function (msg, match) {
confArrayNumber = match[1].split(';');
for(var i = 0; i < confArrayNumber.length; i++ ) {
bot.sendMessage( msg.from.id ,'Вызываем и добавляем в конференцию номер '+confArrayNumber[i]);
callConfNumber(confArrayNumber[i]);
}
console.log(msg);

});

Теперь можно проверить работу нашей программы. В консоли вводим nodejs app.js localhost 5038 nami iI863fo6rZYD26b, и отправляем нашему боту команду, например, /conf 74997099783;74991234567;79101234567. Если все работает правильно, то в окне бота вы должны увидеть следующее и по указанным вами Asterisk сделает вызов и перенаправит в общую конференц-комнату:


Чтобы создать отложенную конференцию, добавим в нашу программу следующее:

bot.onText(/\/conftime (.+) number (.+)$/, function (msg, match) {
var chatId = msg.from.id;
var conftime = match[1];
var confnumber = match[2];

notes.push( { 'uid':chatId, 'time':conftime, 'number':confnumber } );
bot.sendMessage(chatId, 'Отлично! Я обязательно создам конференцию, если буду работать :)');
});

Telegram боту мы будем отправлять время, в которое надо создать конференцию, и номера, например /conftime 14:16 number 79101234567;74997099783. В ответ от бота мы должны будем получить информацию, что бот принял наш запрос. Нам так же нужно проверять соответствие времени запланированной конференции с текущим, чтобы инициировать запланированную конференцию. Делать это мы будем с помощью setInterval, который каждую секунду будет проверять соответствие notes[i]['time'] (время, указанное нами при планировании конференции) с текущим временем. Добавим к нашей программе следующее:

       setInterval(function(){
for (var i = 0; i < notes.length; i++){
var curDate = new Date().getHours() + ':' + new Date().getMinutes();
if ( notes[i]['time'] == curDate ) {
bot.sendMessage(notes[i]['uid'], 'Напоминаю, сейчас будет создана конференция с номерами: '+ notes[i]['number']);

confArrayNumber = notes[0]['number'].split(';');
for(var b = 0; b < confArrayNumber.length; b++ ) {
callConfNumber(confArrayNumber[b]);
bot.sendMessage( notes[i]['uid'],'Вызываем и добавляем в конференцию номер '+confArrayNumber[b]);
}
notes.splice(i,1);
}
}
},1000);

Перезапускаем нашу программу. Теперь если передать боту /conftime 14:16 number 79101234567;74997099783, бот должен ответить, что запрос принят, уведомить нас о начале сбора конференции и сообщить номера, на которые он делает вызовы:



В данной статье мы хотели показать пример создания конференций через связку Asterisk, Node JS и Telegram, на самом деле функционал использования намного шире и разнообразней, вы можете использовать другие языки, добавить кнопки, связать с вашей базой данных и так далее. Код, описанный в статье, доступен по следующей ссылке https://github.com/ProVitSer/telegram-conf-bot.git. У нас уже разработан специальный telegram бот, который имеет кнопки, имеет возможность вызывать абонентов из контактной книги и многое другое. По всем вопросам, связанным со статьей, проблемами реализации или помощи, вы можете обращаться в нашу техническую поддержку.

 
Powered by SEO CMS ver.: 23.1 TOP 2 (opencartadmin.com)