diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c449984 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.os text eol=lf +*.md text eol=lf +*.config text eol=lf diff --git a/packagedef b/packagedef index 67bec69..7405ed9 100644 --- a/packagedef +++ b/packagedef @@ -1,9 +1,9 @@ - -Описание.Имя("messenger") - .Версия("1.2.0") - .ЗависитОт("json") - .ВключитьФайл("readme.md") - .ВключитьФайл("src") - .ВключитьФайл("lib.config") - .ИсполняемыйФайл("src/Мессенджер.os"); + +Описание.Имя("messenger") + .Версия("1.3.0") + .ЗависитОт("json") + .ВключитьФайл("readme.md") + .ВключитьФайл("src") + .ВключитьФайл("lib.config") + .ИсполняемыйФайл("src/Мессенджер.os"); \ No newline at end of file diff --git a/readme.md b/readme.md index 0e717aa..5b8ffcf 100644 --- a/readme.md +++ b/readme.md @@ -1,57 +1,78 @@ -# Отправка сообщений используя разные транспорты - -[![GitHub release](https://img.shields.io/github/release/oscript-library/messenger.svg)](https://github.com/oscript-library/messenger) - -## Введение - -## Установка - -Для использования необходимо выполнить инициализацию параметров транспорта, используя соответствующий метод класса и параметры авторизации (см. ниже). - -## Использование - -### Для Slack - -Необходимо зарегистрировать бота, получить его токен авторизации и дать доступ в необходимые каналы. -Описание API `https://api.slack.com/bot-users`. -Перед отправкой сообщений необходимо у созданного объекта вызвать метод 'ИнициализацияSLACK' куда передать данные авторизации. - -### Для RocketChat - -Необходимо создать пользователя-бота, получить его параметры авторизации. -Описание API `https://rocket.chat/docs/developer-guides/rest-api`. -Перед отправкой сообщений необходимо у созданного объекта вызвать метод 'ИнициализацияRocketChat' куда передать данные авторизации и сдрес сервера. - -#### Пример RocketChat - - Мессенджер = Новый Мессенджер(); - МессенджерИнициализацияRocketChat("https://rocketchat.mycompany.ru", "user-bot", "pass-bot"); - ОтправитьСообщениеВКаналRocketChat("chanel", "Всем привет", "Внимание"); - ОтправитьСообщениеВКаналRocketChat("@user", "@User, привет!", ":pensive:"); - -### Для SMS - -На данный момент поддерживается отправка сообщений через операторов SMS-Bliss, Infobip и sms4b. -Для использования необходимо заключить договор с соответствующим оператором. - -- SMS-Bliss: `https://smsbliss.ru/` -- Infobip: `http://www.infobip.com.ru/` -- sms4b: `https://www.sms4b.ru/` - -Перед отправкой сообщений необходимо у созданного объекта вызвать метод 'ИнициализацияSMS' куда передать код оператора "SMSBliss" ,"infobip" или "sms4b" и данные авторизации. - -### Для Gitter - -Необходимо получить токен авторизации `https://developer.gitter.im/apps`. -Имя комнаты указывается полностью ИмяОрганизации/ИмяРепозитория. - -Например для `https://gitter.im/asosnoviy/Lobby` имя комнаты `asosnoviy/Lobby`. - -Перед отправкой сообщений необходимо у созданного объекта вызвать метод 'ИнициализацияGitter' куда передать токен. - -#### Пример Gitter - - ИмяКомнаты = "organization/repo"; - Мессенджер = Новый Мессенджер(); - Мессенджер.ИнициализацияGitter(ТокенПользователя); - Мессенджер.ОтправитьСообщение(Мессенджер.ДоступныеПротоколы().gitter, ИмяКомнаты, "Всем привет!" ); +# Отправка сообщений используя разные транспорты + +[![GitHub release](https://img.shields.io/github/release/oscript-library/messenger.svg)](https://github.com/oscript-library/messenger) + +## Введение + +## Установка + +Для использования необходимо выполнить инициализацию параметров транспорта, используя соответствующий метод класса и параметры авторизации (см. ниже). + +## Использование + +### Для Slack + +Необходимо зарегистрировать бота, получить его токен авторизации и дать доступ в необходимые каналы. +Описание API `https://api.slack.com/bot-users`. +Перед отправкой сообщений необходимо у созданного объекта вызвать метод 'ИнициализацияSLACK' куда передать данные авторизации. + +### Для RocketChat + +Необходимо создать пользователя-бота, получить его параметры авторизации. +Описание API `https://rocket.chat/docs/developer-guides/rest-api`. +Перед отправкой сообщений необходимо у созданного объекта вызвать метод 'ИнициализацияRocketChat' куда передать данные авторизации и сдрес сервера. + +#### Пример RocketChat + + Мессенджер = Новый Мессенджер(); + МессенджерИнициализацияRocketChat("https://rocketchat.mycompany.ru", "user-bot", "pass-bot"); + ОтправитьСообщениеВКаналRocketChat("chanel", "Всем привет", "Внимание"); + ОтправитьСообщениеВКаналRocketChat("@user", "@User, привет!", ":pensive:"); + +### Для SMS + +На данный момент поддерживается отправка сообщений через операторов SMS-Bliss, Infobip и sms4b. +Для использования необходимо заключить договор с соответствующим оператором. + +- SMS-Bliss: `https://smsbliss.ru/` +- Infobip: `http://www.infobip.com.ru/` +- sms4b: `https://www.sms4b.ru/` + +Перед отправкой сообщений необходимо у созданного объекта вызвать метод 'ИнициализацияSMS' куда передать код оператора "SMSBliss" ,"infobip" или "sms4b" и данные авторизации. + +### Для Gitter + +Необходимо получить токен авторизации `https://developer.gitter.im/apps`. +Имя комнаты указывается полностью ИмяОрганизации/ИмяРепозитория. + +Например для `https://gitter.im/asosnoviy/Lobby` имя комнаты `asosnoviy/Lobby`. + +Перед отправкой сообщений необходимо у созданного объекта вызвать метод 'ИнициализацияGitter' куда передать токен. + +#### Пример Gitter + + ИмяКомнаты = "organization/repo"; + Мессенджер = Новый Мессенджер(); + Мессенджер.ИнициализацияGitter(ТокенПользователя); + Мессенджер.ОтправитьСообщение(Мессенджер.ДоступныеПротоколы().gitter, ИмяКомнаты, "Всем привет!" ); + +### Для Telegram + +Необходимо создать бота через канал @BotFather и получить токен `https://tlgrm.ru/docs/bots#botfather`. +Написать своему боту и с помощью Мессенджер.telegramGetUpdates() получить id чата. + +#### Пример Telegram + +##### Получаем id чата + + Мессенджер = Новый Мессенджер(); + Мессенджер.ИнициализацияTelegram(Токен); + Мессенджер.telegramGetUpdates(); + +##### Отправляем сообщение в чат + + idчата = "123"; + Мессенджер = Новый Мессенджер(); + Мессенджер.ИнициализацияTelegram(Токен); + Мессенджер.ОтправитьСообщение(Мессенджер.ДоступныеПротоколы().telegram, idчата, "Всем привет!" ); + \ No newline at end of file diff --git "a/src/\320\234\320\265\321\201\321\201\320\265\320\275\320\264\320\266\320\265\321\200.os" "b/src/\320\234\320\265\321\201\321\201\320\265\320\275\320\264\320\266\320\265\321\200.os" index 5ba25dc..504e73e 100644 --- "a/src/\320\234\320\265\321\201\321\201\320\265\320\275\320\264\320\266\320\265\321\200.os" +++ "b/src/\320\234\320\265\321\201\321\201\320\265\320\275\320\264\320\266\320\265\321\200.os" @@ -1,468 +1,535 @@ - -/////////////////////////////////////////////////////////////////////////////////////////////// -// -// Модуль отправки сообщений -// Доступные варианты -// - Канал SLACK -// - SMS -// - Gitter -// -// (с) BIA Technologies, LLC -// -/////////////////////////////////////////////////////////////////////////////////////////////// -#Использовать json - -Перем АвторизацияSLACK; -Перем АвторизацияRocketChat; -Перем АвторизацияSMS; -Перем АвторизацияGitter Экспорт; - -Перем ПараметрыДоступныеОператорыSMS; -Перем ПараметрыДоступныеПротоколы; - -/////////////////////////////////////////////////////////////////////////////////////////////// - -Функция ДоступныеПротоколы() Экспорт - - Если ПараметрыДоступныеПротоколы = Неопределено Тогда - - ПараметрыДоступныеПротоколы = Новый Структура("slack, sms, gitter, rocketchat", "slack", "sms", "gitter", "rocketchat"); - - КонецЕсли; - - Возврат ПараметрыДоступныеПротоколы; - -КонецФункции - -/////////////////////////////////////////////////////////////////////////////////////////////// - -Процедура ОтправитьСообщениеSMS(Адресат, Сообщение) Экспорт - - ОтправитьСообщение("sms", Адресат, Сообщение); - -КонецПроцедуры - -Процедура ОтправитьСообщениеSLACK(Адресат, Сообщение, ТипСообщения) Экспорт - - ОтправитьСообщение("slack", Адресат, Сообщение,, ТипСообщения); - -КонецПроцедуры - -Процедура ОтправитьСообщениеGitter(Комната, Сообщение) Экспорт - - IdКомнаты = АвторизацияGitter.Комнаты[Комната]; - Если IdКомнаты = Неопределено Тогда - - ВызватьИсключение "Комната не найдена в списке комнат пользователя"; - - Иначе - ОтправитьСообщениеВКомнатуGitter(IdКомнаты, Сообщение); - КонецЕсли; - -КонецПроцедуры - -Процедура ОтправитьСообщениеRocketChat(Адресат, Сообщение, ТипСообщения) Экспорт - - ОтправитьСообщение("rocketchat", Адресат, Сообщение,, ТипСообщения); - -КонецПроцедуры - -/////////////////////////////////////////////////////////////////////////////////////////////// - -Процедура ОтправитьСообщение(Протокол, Адресат, Сообщение, ТемаСообщения = "", ТипСообщения = "") Экспорт - - Если Протокол = ДоступныеПротоколы().slack Тогда - - ОтправитьСообщениеВКаналSLACK(Адресат, Сообщение, ТипСообщения) - - ИначеЕсли Протокол = ДоступныеПротоколы().sms Тогда - - ОтправитьСообщениеОператоруSMS(Адресат, Сообщение); - - ИначеЕсли Протокол = ДоступныеПротоколы().gitter Тогда - - ОтправитьСообщениеGitter(Адресат, Сообщение); - - ИначеЕсли Протокол = ДоступныеПротоколы().rocketchat Тогда - - ОтправитьСообщениеВКаналRocketChat(Адресат, Сообщение, ТипСообщения); - - Иначе - - ВызватьИсключение "Неизвестный протокол отправки: " + Протокол; - - КонецЕсли; - -КонецПроцедуры - -Процедура ОтправитьСообщениеОператоруSMS(Адресат, Знач Сообщение) Экспорт - - Если АвторизацияSMS = Неопределено Тогда - - ВызватьИсключение "Необходимо выполнить инициализацию транспорта SMS"; - - КонецЕсли; - - URL = АвторизацияSMS.URL; - ИмяСервера = АвторизацияSMS.ИмяСервера; - - ТелоЗапроса = СтрШаблон(АвторизацияSMS.ШаблонТелаЗапроса, - АвторизацияSMS.Логин, - АвторизацияSMS.Пароль, - Адресат, - Сообщение, - АвторизацияSMS.Подпись); - - HTTPЗапрос = Новый HTTPЗапрос(АвторизацияSMS.URL, АвторизацияSMS.Заголовки); - HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); - - HTTP = Новый HTTPСоединение(ИмяСервера); - Ответ = HTTP.ОтправитьДляОбработки(HTTPЗапрос); - -КонецПроцедуры - -Процедура ОтправитьСообщениеВКаналSLACK(Канал, ТекстСообщения, ТипСообщения) Экспорт - - Если АвторизацияSLACK = Неопределено Тогда - - ВызватьИсключение "Необходимо выполнить инициализацию транспорта Slack"; - - КонецЕсли; - - ИмяСервера = "slack.com"; - - Прокси = Новый ИнтернетПрокси(ИСТИНА); - - URL = "api/chat.postMessage?channel=" - + Канал - + "&text=" + СформироватьТекстСообщенияSLACK(ТипСообщения, ТекстСообщения) - + "&as_user=" + АвторизацияSLACK.Логин + "&token=" + АвторизацияSLACK.Ключ; - - - HTTPЗапрос = Новый HTTPЗапрос; - HTTPЗапрос.АдресРесурса = URL; - - HTTP = Новый HTTPСоединение(ИмяСервера,,,, Прокси); - Ответ = HTTP.Получить(HTTPЗапрос); - -КонецПроцедуры - -Процедура ОтправитьСообщениеВКаналRocketChat(Канал, ТекстСообщения, ТипСообщения) Экспорт - - Если АвторизацияRocketChat = Неопределено Тогда - - ВызватьИсключение "Необходимо выполнить инициализацию транспорта RocketChat"; - - КонецЕсли; - - Прокси = Новый ИнтернетПрокси(ИСТИНА); - - // сначала авторизация - URL = "api/v1/login"; - HTTPЗапрос = Новый HTTPЗапрос; - HTTPЗапрос.АдресРесурса = URL; - HTTPЗапрос.УстановитьТелоИзСтроки("{""user"":""" + АвторизацияRocketChat.Логин + """, ""password"":""" + АвторизацияRocketChat.Пароль + """}"); - HTTP = Новый HTTPСоединение(АвторизацияRocketChat.АдресСервера,,,, Прокси); - ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); - - Если ОтветHTTP.КодСостояния = 200 Тогда - - json = Новый ПарсерJSON(); - ОтветJson = json.ПрочитатьJSON(ОтветHTTP.ПолучитьТелоКакСтроку()); - Если ОтветJson.Получить("status") = "success" Тогда - - Токен = ОтветJson.Получить("data").Получить("authToken"); - ИД = ОтветJson.Получить("data").Получить("userId"); - - // отправка сообщения - URL = "api/v1/chat.postMessage"; - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Content-Type", "application/json"); - Заголовки.Вставить("Accept", "application/json"); - Заголовки.Вставить("X-Auth-Token", Токен); - Заголовки.Вставить("X-User-Id", ИД); - - ОписаниеСообщения = Новый Структура; - ОписаниеСообщения.Вставить("channel", Канал); - ОписаниеСообщения.Вставить("text", ТекстСообщения); - ОписаниеСообщения.Вставить("emoji", ПолучитьИконкуТипаСообщения(ТипСообщения)); - HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки); - HTTPЗапрос.УстановитьТелоИзСтроки(json.ЗаписатьJSON(ОписаниеСообщения)); - HTTP = Новый HTTPСоединение(АвторизацияRocketChat.АдресСервера,,,, Прокси); - ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); - Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку()); - - Иначе - - ВызватьИсключение "Ошибка авторизации"; - - КонецЕсли; - - Иначе - - ВызватьИсключение "Ошибка выполнения команды"; - - КонецЕсли; - -КонецПроцедуры - -Процедура ОтправитьСообщениеВКомнатуGitter(IdКомнаты, ТекстСообщения) Экспорт - - Если АвторизацияGitter = Неопределено Тогда - - ВызватьИсключение "Необходимо выполнить инициализацию комнат Gitter"; - - КонецЕсли; - - ИмяСервера = "https://api.gitter.im"; - - Прокси = Новый ИнтернетПрокси(Истина); - - URL = "/v1/rooms/" - + IdКомнаты - + "/chatMessages"; - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Content-Type", "application/json"); - Заголовки.Вставить("Accept", "application/json"); - Заголовки.Вставить("Authorization", " Bearer " + АвторизацияGitter.Токен); - - HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки); - - Сообщение = СтрЗаменить(ТекстСообщения, Символы.ПС, "\n"); - Сообщение = СтрЗаменить(Сообщение, Символы.ВК, "\r"); - - ТекстТела = "{""text"":""%1""}"; - ТелоЗапроса = СтрШаблон(ТекстТела, Сообщение); - - HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); - - HTTP = Новый HTTPСоединение(ИмяСервера); - ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); - -КонецПроцедуры - -/////////////////////////////////////////////////////////////////////////////////////////////// -// Инициализация -/////////////////////////////////////////////////////////////////////////////////////////////// - -Процедура ИнициализацияGitter(Токен) Экспорт - - Комнаты = ПолучитьСписокКомнатGitter(Токен); - АвторизацияGitter = Новый Структура("Токен, Комнаты", Токен, Комнаты); - -КонецПроцедуры - -Процедура ИнициализацияSLACK(Логин, Ключ)Экспорт - - АвторизацияSLACK = Новый Структура("Логин, Ключ", Логин, Ключ); - -КонецПроцедуры - -Процедура ИнициализацияSMS(КодОператора, Логин, Пароль, Подпись) Экспорт - - Если КодОператора = ДоступныеОператорыSMS().smsbliss Тогда - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Content-Type", "application/json"); - - АвторизацияSMS = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаSMSBliss(), Логин, Пароль, Подпись); - АвторизацияSMS.Вставить("ИмяСервера", "json.gate.smsbliss.ru"); - АвторизацияSMS.Вставить("URL", "send"); - АвторизацияSMS.Вставить("Заголовки", Заголовки); - - ИначеЕсли КодОператора = ДоступныеОператорыSMS().infobip Тогда - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Content-Type", "application/json"); - - АвторизацияSMS = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаInfobip(), Логин, Пароль, Подпись); - АвторизацияSMS.Вставить("ИмяСервера", "api.infobip.com"); - АвторизацияSMS.Вставить("URL", "api/v3/sendsms/json"); - АвторизацияSMS.Вставить("Заголовки", Заголовки); - - ИначеЕсли КодОператора = ДоступныеОператорыSMS().sms4b Тогда - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Accept-Encoding", "gzip,deflate"); - Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8"); - Заголовки.Вставить("SOAPAction", "SMS4B/SendSMS"); - - АвторизацияSMS = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаSms4b(), Логин, Пароль, Подпись); - АвторизацияSMS.Вставить("ИмяСервера", "https://sms4b.ru"); - АвторизацияSMS.Вставить("URL", "ws/sms.asmx"); - АвторизацияSMS.Вставить("Заголовки", Заголовки); - - Иначе - - ВызватьИсключение "Неизвестный код оператора: " + КодОператора; - - КонецЕсли; - -КонецПроцедуры - -Процедура ИнициализацияRocketChat(АдресСервера, Логин, Пароль)Экспорт - - АвторизацияRocketChat = Новый Структура("АдресСервера, Логин, Пароль", АдресСервера, Логин, Пароль); - -КонецПроцедуры - -/////////////////////////////////////////////////////////////////////////////////////////////// - -Функция СформироватьТекстСообщенияSLACK(ТипСообщения, ТекстСообщения) - - Сообщение = ПолучитьИконкуТипаСообщения(ТипСообщения) + " " + КодироватьСтроку(ТекстСообщения, СпособКодированияСтроки.КодировкаURL); - Возврат Сообщение; - -КонецФункции - -/////////////////////////////////////////////////////////////////////////////////////////////// - -Функция ПолучитьИконкуТипаСообщения(ТипСообщения) - - Иконка = ТипСообщения; - Если ТипСообщения = "Ошибка" Тогда - - Иконка = ":no_entry:"; - - ИначеЕсли ТипСообщения = "Информация" Тогда - - Иконка = ":speech_balloon:"; - - ИначеЕсли ТипСообщения = "Предупреждение" Тогда - - Иконка = ":warning:"; - - КонецЕсли; - - Возврат Иконка; - -КонецФункции - -/////////////////////////////////////////////////////////////////////////////////////////////// - -Функция ПолучитьШаблонТелаЗапросаSMSBliss() - - Возврат - "{ - |""login"": ""%1"", - |""password"": ""%2"", - |""messages"" :[ - | { - | ""clientId"": 0, - | ""phone"": ""%3"", - | ""text"": ""%4"", - | ""sender"": ""%5"" - | }] - |}"; - -КонецФункции - -Функция ПолучитьШаблонТелаЗапросаInfobip() - - Возврат - "{ - |""authentication"": - | { - | ""username"": ""%1"", - | ""password"": ""%2"" - | }, - |""messages"" :[ - | { - | ""sender"": ""%5"", - | ""text"": ""%4"", - | ""type"": ""longSMS"", - | ""datacoding"": ""8"", - | ""recipients"": [{ - | ""gsm"": ""%3""}] - | } - |] - |}"; - -КонецФункции - -Функция ПолучитьШаблонТелаЗапросаSms4b() - - Возврат - " - | - | - | - |%1 - |%2 - |%5 - |%3 - |%4 - | - | - |"; - -КонецФункции - -/////////////////////////////////////////////////////////////////////////////////////////////// - -Функция ДоступныеОператорыSMS()Экспорт - - Если ПараметрыДоступныеОператорыSMS = Неопределено Тогда - - ПараметрыДоступныеОператорыSMS = Новый Структура("smsbliss, infobip, sms4b", "smsbliss", "infobip", "sms4b"); - - КонецЕсли; - - Возврат ПараметрыДоступныеОператорыSMS; - -КонецФункции - -/////////////////////////////////////////////////////////////////////////////////////////////// - -Функция ПолучитьСписокКомнатGitter(Токен) - - СписокКомнат = Новый Соответствие(); - - ИмяСервера = "https://api.gitter.im"; - - Прокси = Новый ИнтернетПрокси(ИСТИНА); - - URL = "v1/rooms?access_token=" - + Токен ; - - HTTPЗапрос = Новый HTTPЗапрос; - HTTPЗапрос.АдресРесурса = URL; - - HTTP = Новый HTTPСоединение(ИмяСервера); - Ответ = HTTP.Получить(HTTPЗапрос); - - json = Новый ПарсерJSON(); - UnJason = json.ПрочитатьJSON(Ответ.ПолучитьТелоКакСтроку()); - - Если Ответ.КодСостояния = 200 И ТипЗнч(UnJason) = Тип("Массив") Тогда - - Для Каждого Комната Из UnJason Цикл - - СписокКомнат.Вставить(Комната.Получить("name"),Комната.Получить("id")); - - КонецЦикла; - - ИначеЕсли ТипЗнч(UnJason) = Тип("Соответствие") И UnJason["error"] = "Unauthorized" Тогда - - ВызватьИсключение "Ошибка авторизации"; - - Иначе - - ВызватьИсключение "Ошибка получения списка комнат"; - - КонецЕсли; - - Возврат СписокКомнат; - -КонецФункции - -/////////////////////////////////////////////////////////////////////////////////////////////// - -АвторизацияSLACK = Неопределено; -АвторизацияSMS = Неопределено; -АвторизацияGitter = Неопределено; -АвторизацияRocketChat = Неопределено; -ПараметрыДоступныеОператорыSMS = Неопределено; -ПараметрыДоступныеПротоколы = Неопределено; + +/////////////////////////////////////////////////////////////////////////////////////////////// +// +// Модуль отправки сообщений +// Доступные варианты +// - Канал SLACK +// - SMS +// - Gitter +// +// (с) BIA Technologies, LLC +// +/////////////////////////////////////////////////////////////////////////////////////////////// +#Использовать json + +Перем АвторизацияSLACK; +Перем АвторизацияRocketChat; +Перем АвторизацияSMS; +Перем АвторизацияGitter Экспорт; +Перем АвторизацияTelegram; + +Перем ПараметрыДоступныеОператорыSMS; +Перем ПараметрыДоступныеПротоколы; + +/////////////////////////////////////////////////////////////////////////////////////////////// + +Функция ДоступныеПротоколы() Экспорт + + Если ПараметрыДоступныеПротоколы = Неопределено Тогда + + ПараметрыДоступныеПротоколы = Новый Структура("slack, sms, gitter, rocketchat, telegram", "slack", "sms", "gitter", "rocketchat", "telegram"); + + КонецЕсли; + + Возврат ПараметрыДоступныеПротоколы; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////// + +Процедура ОтправитьСообщениеSMS(Адресат, Сообщение) Экспорт + + ОтправитьСообщение("sms", Адресат, Сообщение); + +КонецПроцедуры + +Процедура ОтправитьСообщениеSLACK(Адресат, Сообщение, ТипСообщения) Экспорт + + ОтправитьСообщение("slack", Адресат, Сообщение,, ТипСообщения); + +КонецПроцедуры + +Процедура ОтправитьСообщениеGitter(Комната, Сообщение) Экспорт + + IdКомнаты = АвторизацияGitter.Комнаты[Комната]; + Если IdКомнаты = Неопределено Тогда + + ВызватьИсключение "Комната не найдена в списке комнат пользователя"; + + Иначе + ОтправитьСообщениеВКомнатуGitter(IdКомнаты, Сообщение); + КонецЕсли; + +КонецПроцедуры + +Процедура ОтправитьСообщениеRocketChat(Адресат, Сообщение, ТипСообщения) Экспорт + + ОтправитьСообщение("rocketchat", Адресат, Сообщение,, ТипСообщения); + +КонецПроцедуры + +Процедура ОтправитьСообщениеTelegram(Чат, Сообщение) Экспорт + + ОтправитьСообщение("telegram", Чат, Сообщение); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////////////////////// + +Процедура ОтправитьСообщение(Протокол, Адресат, Сообщение, ТемаСообщения = "", ТипСообщения = "") Экспорт + + Если Протокол = ДоступныеПротоколы().slack Тогда + + ОтправитьСообщениеВКаналSLACK(Адресат, Сообщение, ТипСообщения) + + ИначеЕсли Протокол = ДоступныеПротоколы().sms Тогда + + ОтправитьСообщениеОператоруSMS(Адресат, Сообщение); + + ИначеЕсли Протокол = ДоступныеПротоколы().gitter Тогда + + ОтправитьСообщениеGitter(Адресат, Сообщение); + + ИначеЕсли Протокол = ДоступныеПротоколы().rocketchat Тогда + + ОтправитьСообщениеВКаналRocketChat(Адресат, Сообщение, ТипСообщения); + + ИначеЕсли Протокол = ДоступныеПротоколы().telegram Тогда + + ОтправитьСообщениеВЧатTelegram(Адресат, Сообщение); + + Иначе + + ВызватьИсключение "Неизвестный протокол отправки: " + Протокол; + + КонецЕсли; + +КонецПроцедуры + +Процедура ОтправитьСообщениеОператоруSMS(Адресат, Знач Сообщение) Экспорт + + Если АвторизацияSMS = Неопределено Тогда + + ВызватьИсключение "Необходимо выполнить инициализацию транспорта SMS"; + + КонецЕсли; + + URL = АвторизацияSMS.URL; + ИмяСервера = АвторизацияSMS.ИмяСервера; + + ТелоЗапроса = СтрШаблон(АвторизацияSMS.ШаблонТелаЗапроса, + АвторизацияSMS.Логин, + АвторизацияSMS.Пароль, + Адресат, + Сообщение, + АвторизацияSMS.Подпись); + + HTTPЗапрос = Новый HTTPЗапрос(АвторизацияSMS.URL, АвторизацияSMS.Заголовки); + HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); + + HTTP = Новый HTTPСоединение(ИмяСервера); + Ответ = HTTP.ОтправитьДляОбработки(HTTPЗапрос); + +КонецПроцедуры + +Процедура ОтправитьСообщениеВКаналSLACK(Канал, ТекстСообщения, ТипСообщения) Экспорт + + Если АвторизацияSLACK = Неопределено Тогда + + ВызватьИсключение "Необходимо выполнить инициализацию транспорта Slack"; + + КонецЕсли; + + ИмяСервера = "slack.com"; + + Прокси = Новый ИнтернетПрокси(ИСТИНА); + + URL = "api/chat.postMessage?channel=" + + Канал + + "&text=" + СформироватьТекстСообщенияSLACK(ТипСообщения, ТекстСообщения) + + "&as_user=" + АвторизацияSLACK.Логин + "&token=" + АвторизацияSLACK.Ключ; + + + HTTPЗапрос = Новый HTTPЗапрос; + HTTPЗапрос.АдресРесурса = URL; + + HTTP = Новый HTTPСоединение(ИмяСервера,,,, Прокси); + Ответ = HTTP.Получить(HTTPЗапрос); + +КонецПроцедуры + +Процедура ОтправитьСообщениеВКаналRocketChat(Канал, ТекстСообщения, ТипСообщения) Экспорт + + Если АвторизацияRocketChat = Неопределено Тогда + + ВызватьИсключение "Необходимо выполнить инициализацию транспорта RocketChat"; + + КонецЕсли; + + Прокси = Новый ИнтернетПрокси(ИСТИНА); + + // сначала авторизация + URL = "api/v1/login"; + HTTPЗапрос = Новый HTTPЗапрос; + HTTPЗапрос.АдресРесурса = URL; + HTTPЗапрос.УстановитьТелоИзСтроки("{""user"":""" + АвторизацияRocketChat.Логин + """, ""password"":""" + АвторизацияRocketChat.Пароль + """}"); + HTTP = Новый HTTPСоединение(АвторизацияRocketChat.АдресСервера,,,, Прокси); + ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); + + Если ОтветHTTP.КодСостояния = 200 Тогда + + json = Новый ПарсерJSON(); + ОтветJson = json.ПрочитатьJSON(ОтветHTTP.ПолучитьТелоКакСтроку()); + Если ОтветJson.Получить("status") = "success" Тогда + + Токен = ОтветJson.Получить("data").Получить("authToken"); + ИД = ОтветJson.Получить("data").Получить("userId"); + + // отправка сообщения + URL = "api/v1/chat.postMessage"; + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Content-Type", "application/json"); + Заголовки.Вставить("Accept", "application/json"); + Заголовки.Вставить("X-Auth-Token", Токен); + Заголовки.Вставить("X-User-Id", ИД); + + ОписаниеСообщения = Новый Структура; + ОписаниеСообщения.Вставить("channel", Канал); + ОписаниеСообщения.Вставить("text", ТекстСообщения); + ОписаниеСообщения.Вставить("emoji", ПолучитьИконкуТипаСообщения(ТипСообщения)); + HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки); + HTTPЗапрос.УстановитьТелоИзСтроки(json.ЗаписатьJSON(ОписаниеСообщения)); + HTTP = Новый HTTPСоединение(АвторизацияRocketChat.АдресСервера,,,, Прокси); + ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); + Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку()); + + Иначе + + ВызватьИсключение "Ошибка авторизации"; + + КонецЕсли; + + Иначе + + ВызватьИсключение "Ошибка выполнения команды"; + + КонецЕсли; + +КонецПроцедуры + +Процедура ОтправитьСообщениеВКомнатуGitter(IdКомнаты, ТекстСообщения) Экспорт + + Если АвторизацияGitter = Неопределено Тогда + + ВызватьИсключение "Необходимо выполнить инициализацию комнат Gitter"; + + КонецЕсли; + + ИмяСервера = "https://api.gitter.im"; + + Прокси = Новый ИнтернетПрокси(Истина); + + URL = "/v1/rooms/" + + IdКомнаты + + "/chatMessages"; + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Content-Type", "application/json"); + Заголовки.Вставить("Accept", "application/json"); + Заголовки.Вставить("Authorization", " Bearer " + АвторизацияGitter.Токен); + + HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки); + + Сообщение = СтрЗаменить(ТекстСообщения, Символы.ПС, "\n"); + Сообщение = СтрЗаменить(Сообщение, Символы.ВК, "\r"); + + ТекстТела = "{""text"":""%1""}"; + ТелоЗапроса = СтрШаблон(ТекстТела, Сообщение); + + HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); + + HTTP = Новый HTTPСоединение(ИмяСервера); + ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); + +КонецПроцедуры + +Процедура ОтправитьСообщениеВЧатTelegram(IdЧата, ТекстСообщения) Экспорт + + Сообщение = СтрЗаменить(ТекстСообщения, Символы.ПС, "%0A"); + ОтветHTTP = ВызватьМетодTelegramAPI("sendMessage", Новый Структура("chat_id, text", IdЧата, Сообщение)); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////////////////////// +// Инициализация +/////////////////////////////////////////////////////////////////////////////////////////////// + +Процедура ИнициализацияGitter(Токен) Экспорт + + Комнаты = ПолучитьСписокКомнатGitter(Токен); + АвторизацияGitter = Новый Структура("Токен, Комнаты", Токен, Комнаты); + +КонецПроцедуры + +Процедура ИнициализацияSLACK(Логин, Ключ)Экспорт + + АвторизацияSLACK = Новый Структура("Логин, Ключ", Логин, Ключ); + +КонецПроцедуры + +Процедура ИнициализацияSMS(КодОператора, Логин, Пароль, Подпись) Экспорт + + Если КодОператора = ДоступныеОператорыSMS().smsbliss Тогда + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Content-Type", "application/json"); + + АвторизацияSMS = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаSMSBliss(), Логин, Пароль, Подпись); + АвторизацияSMS.Вставить("ИмяСервера", "json.gate.smsbliss.ru"); + АвторизацияSMS.Вставить("URL", "send"); + АвторизацияSMS.Вставить("Заголовки", Заголовки); + + ИначеЕсли КодОператора = ДоступныеОператорыSMS().infobip Тогда + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Content-Type", "application/json"); + + АвторизацияSMS = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаInfobip(), Логин, Пароль, Подпись); + АвторизацияSMS.Вставить("ИмяСервера", "api.infobip.com"); + АвторизацияSMS.Вставить("URL", "api/v3/sendsms/json"); + АвторизацияSMS.Вставить("Заголовки", Заголовки); + + ИначеЕсли КодОператора = ДоступныеОператорыSMS().sms4b Тогда + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Accept-Encoding", "gzip,deflate"); + Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8"); + Заголовки.Вставить("SOAPAction", "SMS4B/SendSMS"); + + АвторизацияSMS = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаSms4b(), Логин, Пароль, Подпись); + АвторизацияSMS.Вставить("ИмяСервера", "https://sms4b.ru"); + АвторизацияSMS.Вставить("URL", "ws/sms.asmx"); + АвторизацияSMS.Вставить("Заголовки", Заголовки); + + Иначе + + ВызватьИсключение "Неизвестный код оператора: " + КодОператора; + + КонецЕсли; + +КонецПроцедуры + +Процедура ИнициализацияRocketChat(АдресСервера, Логин, Пароль)Экспорт + + АвторизацияRocketChat = Новый Структура("АдресСервера, Логин, Пароль", АдресСервера, Логин, Пароль); + +КонецПроцедуры + +Процедура ИнициализацияTelegram(Токен) Экспорт + + АвторизацияTelegram = Новый Структура("Токен", Токен); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////////////////////// + +Функция СформироватьТекстСообщенияSLACK(ТипСообщения, ТекстСообщения) + + Сообщение = ПолучитьИконкуТипаСообщения(ТипСообщения) + " " + КодироватьСтроку(ТекстСообщения, СпособКодированияСтроки.КодировкаURL); + Возврат Сообщение; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////// + +Функция ПолучитьИконкуТипаСообщения(ТипСообщения) + + Иконка = ТипСообщения; + Если ТипСообщения = "Ошибка" Тогда + + Иконка = ":no_entry:"; + + ИначеЕсли ТипСообщения = "Информация" Тогда + + Иконка = ":speech_balloon:"; + + ИначеЕсли ТипСообщения = "Предупреждение" Тогда + + Иконка = ":warning:"; + + КонецЕсли; + + Возврат Иконка; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////// + +Функция ПолучитьШаблонТелаЗапросаSMSBliss() + + Возврат + "{ + |""login"": ""%1"", + |""password"": ""%2"", + |""messages"" :[ + | { + | ""clientId"": 0, + | ""phone"": ""%3"", + | ""text"": ""%4"", + | ""sender"": ""%5"" + | }] + |}"; + +КонецФункции + +Функция ПолучитьШаблонТелаЗапросаInfobip() + + Возврат + "{ + |""authentication"": + | { + | ""username"": ""%1"", + | ""password"": ""%2"" + | }, + |""messages"" :[ + | { + | ""sender"": ""%5"", + | ""text"": ""%4"", + | ""type"": ""longSMS"", + | ""datacoding"": ""8"", + | ""recipients"": [{ + | ""gsm"": ""%3""}] + | } + |] + |}"; + +КонецФункции + +Функция ПолучитьШаблонТелаЗапросаSms4b() + + Возврат + " + | + | + | + |%1 + |%2 + |%5 + |%3 + |%4 + | + | + |"; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////// + +Функция ДоступныеОператорыSMS()Экспорт + + Если ПараметрыДоступныеОператорыSMS = Неопределено Тогда + + ПараметрыДоступныеОператорыSMS = Новый Структура("smsbliss, infobip, sms4b", "smsbliss", "infobip", "sms4b"); + + КонецЕсли; + + Возврат ПараметрыДоступныеОператорыSMS; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////// + +Функция ПолучитьСписокКомнатGitter(Токен) + + СписокКомнат = Новый Соответствие(); + + ИмяСервера = "https://api.gitter.im"; + + Прокси = Новый ИнтернетПрокси(ИСТИНА); + + URL = "v1/rooms?access_token=" + + Токен ; + + HTTPЗапрос = Новый HTTPЗапрос; + HTTPЗапрос.АдресРесурса = URL; + + HTTP = Новый HTTPСоединение(ИмяСервера); + Ответ = HTTP.Получить(HTTPЗапрос); + + json = Новый ПарсерJSON(); + UnJason = json.ПрочитатьJSON(Ответ.ПолучитьТелоКакСтроку()); + + Если Ответ.КодСостояния = 200 И ТипЗнч(UnJason) = Тип("Массив") Тогда + + Для Каждого Комната Из UnJason Цикл + + СписокКомнат.Вставить(Комната.Получить("name"),Комната.Получить("id")); + + КонецЦикла; + + ИначеЕсли ТипЗнч(UnJason) = Тип("Соответствие") И UnJason["error"] = "Unauthorized" Тогда + + ВызватьИсключение "Ошибка авторизации"; + + Иначе + + ВызватьИсключение "Ошибка получения списка комнат"; + + КонецЕсли; + + Возврат СписокКомнат; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////// + +Процедура telegramGetUpdates() Экспорт + + ОтветHTTP = ВызватьМетодTelegramAPI("getUpdates", Новый Структура()); + + Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку()); + +КонецПроцедуры + +Функция ВызватьМетодTelegramAPI(ИмяМетода, Параметры) + + Если Авторизацияtelegram = Неопределено Тогда + + ВызватьИсключение "Необходимо выполнить инициализацию Telegram"; + + КонецЕсли; + + СтрокаПараметров = ""; + Для Каждого Параметр Из Параметры Цикл + + Шаблон = "%1=%2&"; + СтрокаПараметров = СтрокаПараметров + СтрШаблон(Шаблон, Параметр.Ключ, Параметр.Значение); + + КонецЦикла; + + ИмяСервера = "https://api.telegram.org"; + + URL = "/bot" + + АвторизацияTelegram.Токен + + "/" + ИмяМетода + + "?" + СтрокаПараметров; + + HTTPЗапрос = Новый HTTPЗапрос(URL); + + HTTP = Новый HTTPСоединение(ИмяСервера); + ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); + + Возврат ОтветHTTP; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////// + +АвторизацияSLACK = Неопределено; +АвторизацияSMS = Неопределено; +АвторизацияGitter = Неопределено; +АвторизацияRocketChat = Неопределено; +АвторизацияTelegram = Неопределено; +ПараметрыДоступныеОператорыSMS = Неопределено; +ПараметрыДоступныеПротоколы = Неопределено;