├── .gitattributes ├── .gitignore ├── installlocalhost.bat ├── installlocalhost.sh ├── lib.config ├── packagedef ├── readme.md ├── src ├── Мессенджер.os ├── Мессенджер_v2.os └── Транспорты │ ├── ТранспортMattermost.os │ ├── ТранспортГиттер.os │ ├── ТранспортРокетЧат.os │ ├── ТранспортСМС.os │ ├── ТранспортСлак.os │ ├── ТранспортСлакHook.os │ ├── ТранспортТелеграм.os │ └── ТранспортШаблон.os └── tests └── gitter-test.os /.gitattributes: -------------------------------------------------------------------------------- 1 | *.os text eol=lf 2 | *.md text eol=lf 3 | *.config text eol=lf 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.ospx 2 | -------------------------------------------------------------------------------- /installlocalhost.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | call del "*.ospx" 3 | 4 | for /f %%i in ('"oscript -version"') do set result=%%i 5 | 6 | if %result%==1.0.19.105 ( 7 | call opm build . -mf ./packagedef -out . 8 | ) else ( 9 | call opm build -m ./packagedef -o . 10 | ) 11 | 12 | call opm install -f *.ospx -------------------------------------------------------------------------------- /installlocalhost.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | rm "*.ospx" 3 | 4 | result=$(oscript -version) 5 | 6 | if [[ $result = "1.0.19.105" ]]; then 7 | opm build . -mf ./packagedef -out . 8 | else 9 | opm build -m ./packagedef -o . 10 | fi 11 | 12 | opm install -f *.ospx 13 | -------------------------------------------------------------------------------- /lib.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packagedef: -------------------------------------------------------------------------------- 1 | Описание.Имя("messenger") 2 | .Версия("2.0.8") 3 | .ЗависитОт("json") 4 | .ВключитьФайл("readme.md") 5 | .ВключитьФайл("src") 6 | .ВерсияСреды("1.0.21") 7 | .ВключитьФайл("lib.config"); 8 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Отправка сообщений адресатам, используя разные транспорты 2 | 3 | [![GitHub release](https://img.shields.io/github/release/bia-technologies/messenger.svg)](https://github.com/bia-technologies/messenger) 4 | 5 | ## Введение 6 | 7 | Библиотека на 1Script, предоставляющая интерфейсы отправки сообщений посредством различных транспортов. 8 | 9 | ## Использование 10 | 11 | Перед отправкой сообщения необходимо выполнить инициализацию нужного транспорта. Доступные транспорты можно получить методом `ДоступныеТранспорты()` либо создать объект, передав в конструктор `ИСТИНА`. 12 | 13 | В зависимости от выбранного транспорта могут отличаться входные параметры методов инициализации и отправки. Для того, чтобы узнать параметры, которые необходимо передавать нужно вызвать метод `ИнициализироватьТранспорт` указав в качестве параметра только идентификатор транспорта. 14 | 15 | ## Доступные транспорты 16 | 17 | В библиотеке на данный момент поддерживаются указанные ниже транспорты 18 | 19 | ### Slack 20 | 21 | Для использования необходимо зарегистрировать бота, получить его токен авторизации и дать доступ в необходимые каналы. 22 | Описание API `https://api.slack.com/bot-users`. 23 | 24 | ### RocketChat 25 | 26 | Для использования необходимо создать пользователя-бота, получить его параметры авторизации. 27 | Описание API `https://rocket.chat/docs/developer-guides/rest-api`. 28 | 29 | #### Пример RocketChat 30 | 31 | Мессенджер = Новый Мессенджер(); 32 | Мессенджер.ИнициализироватьТранспорт("rocketchat", Новый Структура("Логин, Пароль, АдресСервера", "user-bot", "pass-bot", "https://rocketchat.mycompany.ru"); 33 | Мессенджер.ОтправитьСообщение("rocketchat", "chanel", "Всем привет", Новый Структура("ТипСообщения", "Внимание")); 34 | Мессенджер.ОтправитьСообщение("rocketchat", "@user", "@User, привет!", Новый Структура("ТипСообщения", ":pensive:")); 35 | 36 | ### SMS 37 | 38 | На данный момент поддерживается отправка сообщений через операторов SMS-Bliss, Infobip и sms4b. 39 | Для использования необходимо заключить договор с соответствующим оператором. 40 | 41 | - SMS-Bliss: `https://smsbliss.ru/` 42 | - Infobip: `http://www.infobip.com.ru/` 43 | - sms4b: `https://www.sms4b.ru/` 44 | 45 | ### Gitter 46 | 47 | Для использования необходимо получить токен авторизации `https://developer.gitter.im/apps`. 48 | Имя комнаты указывается полностью ИмяОрганизации/ИмяРепозитория. 49 | 50 | Например для `https://gitter.im/asosnoviy/Lobby` имя комнаты `asosnoviy/Lobby`. 51 | 52 | #### Пример Gitter 53 | 54 | ИмяКомнаты = "organization/repo"; 55 | Мессенджер = Новый Мессенджер(); 56 | Мессенджер.ИнициализироватьТранспорт("gitter", Новый Структура("Логин", ТокенПользователя)); 57 | Мессенджер.ОтправитьСообщение("gitter", ИмяКомнаты, "Всем привет!"); 58 | 59 | ### Telegram 60 | 61 | Для использования Необходимо создать бота через канал @BotFather и получить токен `https://tlgrm.ru/docs/bots#botfather`. 62 | 63 | #### Пример Telegram 64 | 65 | Мессенджер = Новый Мессенджер(); 66 | Мессенджер.ИнициализироватьТранспорт("telegram", Новый Структура("Логин", BotID)); 67 | Сообщение = "Что-то пошло не так"; //сообщение как html 68 | Мессенджер.ОтправитьСообщение("telegram", "-***169", Сообщение, , "html"); 69 | 70 | Сообщение = "**Что-то пошло не так**"; //сообщение как markdown 71 | Мессенджер.ОтправитьСообщение("telegram", "-***169", Сообщение, , "md"); 72 | 73 | Сообщение = "Что-то пошло не так"; //сообщение как просто текст 74 | Мессенджер.ОтправитьСообщение("telegram", "-***169", Сообщение); 75 | 76 | ### Mattermost 77 | 78 | Для использования необходимо создать hook `https://developers.mattermost.com/integrate/webhooks/incoming/`. 79 | 80 | #### Пример Mattermost 81 | 82 | Сервер = "http://localhost"; 83 | Hook = "00000000000000000000"; 84 | Мессенджер = Новый Мессенджер(); 85 | Мессенджер.ИнициализироватьТранспорт("mattermost", Новый Структура("Сервер, Hook", Сервер, Hook)); 86 | Мессенджер.ОтправитьСообщение("mattermost", "test-channel", "Всем привет!"); 87 | 88 | ## Добавление новых транспортов 89 | 90 | Для добавления нового транспорта необходимо: 91 | 92 | - Cкопировать файл `Транспорты\ТранспортШаблон.os` 93 | - Изменить имя по аналогии с существующими 94 | - Дополнить методы программного интерфеса своей реализацией отправки сообщений новым транспортом 95 | 96 | ## Обратная совместимость 97 | 98 | **По умолчанию, при создании объекта класса используется новая версия библиотеки в которой удалены многие методы прошлой версии. Таким образом нарушена обратная совместимость.** 99 | 100 | Для плавного перехода на новую версию библиотеки прошлая версия реализации библиотеки вынесена в класс `Мессенджер_v1`. 101 | -------------------------------------------------------------------------------- /src/Мессенджер.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Модуль отправки сообщений 4 | // Доступные варианты 5 | // - Канал SLACK 6 | // - SMS 7 | // - Gitter 8 | // 9 | // (с) BIA Technologies, LLC 10 | // 11 | /////////////////////////////////////////////////////////////////////////////////////////////// 12 | 13 | #Использовать json 14 | 15 | Перем АвторизацияSLACK; 16 | Перем АвторизацияRocketChat; 17 | Перем АвторизацияSMS; 18 | Перем АвторизацияGitter Экспорт; 19 | Перем АвторизацияTelegram; 20 | 21 | Перем ПараметрыДоступныеОператорыSMS; 22 | Перем ПараметрыДоступныеПротоколы; 23 | 24 | /////////////////////////////////////////////////////////////////////////////////////////////// 25 | 26 | Функция ДоступныеПротоколы() Экспорт 27 | 28 | Если ПараметрыДоступныеПротоколы = Неопределено Тогда 29 | 30 | ПараметрыДоступныеПротоколы = Новый Структура("slack, sms, gitter, rocketchat, telegram", "slack", "sms", "gitter", "rocketchat", "telegram"); 31 | 32 | КонецЕсли; 33 | 34 | Возврат ПараметрыДоступныеПротоколы; 35 | 36 | КонецФункции 37 | 38 | /////////////////////////////////////////////////////////////////////////////////////////////// 39 | 40 | Процедура ОтправитьСообщениеSMS(Адресат, Сообщение) Экспорт 41 | 42 | ОтправитьСообщение("sms", Адресат, Сообщение); 43 | 44 | КонецПроцедуры 45 | 46 | Процедура ОтправитьСообщениеSLACK(Адресат, Сообщение, ТипСообщения) Экспорт 47 | 48 | ОтправитьСообщение("slack", Адресат, Сообщение,, ТипСообщения); 49 | 50 | КонецПроцедуры 51 | 52 | Процедура ОтправитьСообщениеGitter(Комната, Сообщение) Экспорт 53 | 54 | IdКомнаты = АвторизацияGitter.Комнаты[Комната]; 55 | Если IdКомнаты = Неопределено Тогда 56 | 57 | ВызватьИсключение "Комната не найдена в списке комнат пользователя"; 58 | 59 | Иначе 60 | ОтправитьСообщениеВКомнатуGitter(IdКомнаты, Сообщение); 61 | КонецЕсли; 62 | 63 | КонецПроцедуры 64 | 65 | Процедура ОтправитьСообщениеRocketChat(Адресат, Сообщение, ТипСообщения) Экспорт 66 | 67 | ОтправитьСообщение("rocketchat", Адресат, Сообщение,, ТипСообщения); 68 | 69 | КонецПроцедуры 70 | 71 | Процедура ОтправитьСообщениеTelegram(Чат, Сообщение) Экспорт 72 | 73 | ОтправитьСообщение("telegram", Чат, Сообщение); 74 | 75 | КонецПроцедуры 76 | 77 | /////////////////////////////////////////////////////////////////////////////////////////////// 78 | 79 | Процедура ОтправитьСообщение(Протокол, Адресат, Сообщение, ТемаСообщения = "", ТипСообщения = "") Экспорт 80 | 81 | Если Протокол = ДоступныеПротоколы().slack Тогда 82 | 83 | ОтправитьСообщениеВКаналSLACK(Адресат, Сообщение, ТипСообщения) 84 | 85 | ИначеЕсли Протокол = ДоступныеПротоколы().sms Тогда 86 | 87 | ОтправитьСообщениеОператоруSMS(Адресат, Сообщение); 88 | 89 | ИначеЕсли Протокол = ДоступныеПротоколы().gitter Тогда 90 | 91 | ОтправитьСообщениеGitter(Адресат, Сообщение); 92 | 93 | ИначеЕсли Протокол = ДоступныеПротоколы().rocketchat Тогда 94 | 95 | ОтправитьСообщениеВКаналRocketChat(Адресат, Сообщение, ТипСообщения); 96 | 97 | ИначеЕсли Протокол = ДоступныеПротоколы().telegram Тогда 98 | 99 | ОтправитьСообщениеВЧатTelegram(Адресат, Сообщение); 100 | 101 | Иначе 102 | 103 | ВызватьИсключение "Неизвестный протокол отправки: " + Протокол; 104 | 105 | КонецЕсли; 106 | 107 | КонецПроцедуры 108 | 109 | Процедура ОтправитьСообщениеОператоруSMS(Адресат, Знач Сообщение) Экспорт 110 | 111 | Если АвторизацияSMS = Неопределено Тогда 112 | 113 | ВызватьИсключение "Необходимо выполнить инициализацию транспорта SMS"; 114 | 115 | КонецЕсли; 116 | 117 | URL = АвторизацияSMS.URL; 118 | ИмяСервера = АвторизацияSMS.ИмяСервера; 119 | 120 | ТелоЗапроса = СтрШаблон(АвторизацияSMS.ШаблонТелаЗапроса, 121 | АвторизацияSMS.Логин, 122 | АвторизацияSMS.Пароль, 123 | Адресат, 124 | Сообщение, 125 | АвторизацияSMS.Подпись); 126 | 127 | HTTPЗапрос = Новый HTTPЗапрос(АвторизацияSMS.URL, АвторизацияSMS.Заголовки); 128 | HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); 129 | 130 | HTTP = Новый HTTPСоединение(ИмяСервера); 131 | Ответ = HTTP.ОтправитьДляОбработки(HTTPЗапрос); 132 | 133 | КонецПроцедуры 134 | 135 | Процедура ОтправитьСообщениеВКаналSLACK(Канал, ТекстСообщения, ТипСообщения) Экспорт 136 | 137 | Если АвторизацияSLACK = Неопределено Тогда 138 | 139 | ВызватьИсключение "Необходимо выполнить инициализацию транспорта Slack"; 140 | 141 | КонецЕсли; 142 | 143 | ИмяСервера = "slack.com"; 144 | 145 | Прокси = Новый ИнтернетПрокси(ИСТИНА); 146 | 147 | URL = "api/chat.postMessage?channel=" 148 | + Канал 149 | + "&text=" + СформироватьТекстСообщенияSLACK(ТипСообщения, ТекстСообщения) 150 | + "&as_user=" + АвторизацияSLACK.Логин + "&token=" + АвторизацияSLACK.Ключ; 151 | 152 | 153 | HTTPЗапрос = Новый HTTPЗапрос; 154 | HTTPЗапрос.АдресРесурса = URL; 155 | 156 | HTTP = Новый HTTPСоединение(ИмяСервера,,,, Прокси); 157 | Ответ = HTTP.Получить(HTTPЗапрос); 158 | 159 | КонецПроцедуры 160 | 161 | Процедура ОтправитьСообщениеВКаналRocketChat(Канал, ТекстСообщения, ТипСообщения) Экспорт 162 | 163 | Если АвторизацияRocketChat = Неопределено Тогда 164 | 165 | ВызватьИсключение "Необходимо выполнить инициализацию транспорта RocketChat"; 166 | 167 | КонецЕсли; 168 | 169 | Прокси = Новый ИнтернетПрокси(ИСТИНА); 170 | 171 | // сначала авторизация 172 | URL = "api/v1/login"; 173 | HTTPЗапрос = Новый HTTPЗапрос; 174 | HTTPЗапрос.АдресРесурса = URL; 175 | HTTPЗапрос.УстановитьТелоИзСтроки("{""user"":""" + АвторизацияRocketChat.Логин + """, ""password"":""" + АвторизацияRocketChat.Пароль + """}"); 176 | HTTP = Новый HTTPСоединение(АвторизацияRocketChat.АдресСервера,,,, Прокси); 177 | ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); 178 | 179 | Если ОтветHTTP.КодСостояния = 200 Тогда 180 | 181 | json = Новый ПарсерJSON(); 182 | ОтветJson = json.ПрочитатьJSON(ОтветHTTP.ПолучитьТелоКакСтроку()); 183 | Если ОтветJson.Получить("status") = "success" Тогда 184 | 185 | Токен = ОтветJson.Получить("data").Получить("authToken"); 186 | ИД = ОтветJson.Получить("data").Получить("userId"); 187 | 188 | // отправка сообщения 189 | URL = "api/v1/chat.postMessage"; 190 | 191 | Заголовки = Новый Соответствие; 192 | Заголовки.Вставить("Content-Type", "application/json"); 193 | Заголовки.Вставить("Accept", "application/json"); 194 | Заголовки.Вставить("X-Auth-Token", Токен); 195 | Заголовки.Вставить("X-User-Id", ИД); 196 | 197 | ОписаниеСообщения = Новый Структура; 198 | ОписаниеСообщения.Вставить("channel", Канал); 199 | ОписаниеСообщения.Вставить("text", ТекстСообщения); 200 | ОписаниеСообщения.Вставить("emoji", ПолучитьИконкуТипаСообщения(ТипСообщения)); 201 | HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки); 202 | HTTPЗапрос.УстановитьТелоИзСтроки(json.ЗаписатьJSON(ОписаниеСообщения)); 203 | HTTP = Новый HTTPСоединение(АвторизацияRocketChat.АдресСервера,,,, Прокси); 204 | ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); 205 | Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку()); 206 | 207 | Иначе 208 | 209 | ВызватьИсключение "Ошибка авторизации"; 210 | 211 | КонецЕсли; 212 | 213 | Иначе 214 | 215 | ВызватьИсключение "Ошибка выполнения команды"; 216 | 217 | КонецЕсли; 218 | 219 | КонецПроцедуры 220 | 221 | Процедура ОтправитьСообщениеВКомнатуGitter(IdКомнаты, ТекстСообщения) Экспорт 222 | 223 | Если АвторизацияGitter = Неопределено Тогда 224 | 225 | ВызватьИсключение "Необходимо выполнить инициализацию комнат Gitter"; 226 | 227 | КонецЕсли; 228 | 229 | ИмяСервера = "https://api.gitter.im"; 230 | 231 | Прокси = Новый ИнтернетПрокси(Истина); 232 | 233 | URL = "/v1/rooms/" 234 | + IdКомнаты 235 | + "/chatMessages"; 236 | 237 | Заголовки = Новый Соответствие; 238 | Заголовки.Вставить("Content-Type", "application/json"); 239 | Заголовки.Вставить("Accept", "application/json"); 240 | Заголовки.Вставить("Authorization", " Bearer " + АвторизацияGitter.Токен); 241 | 242 | HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки); 243 | 244 | Сообщение = СтрЗаменить(ТекстСообщения, Символы.ПС, "\n"); 245 | Сообщение = СтрЗаменить(Сообщение, Символы.ВК, "\r"); 246 | 247 | ТекстТела = "{""text"":""%1""}"; 248 | ТелоЗапроса = СтрШаблон(ТекстТела, Сообщение); 249 | 250 | HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); 251 | 252 | HTTP = Новый HTTPСоединение(ИмяСервера); 253 | ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); 254 | 255 | КонецПроцедуры 256 | 257 | Процедура ОтправитьСообщениеВЧатTelegram(IdЧата, ТекстСообщения) Экспорт 258 | 259 | Сообщение = СтрЗаменить(ТекстСообщения, Символы.ПС, "%0A"); 260 | ОтветHTTP = ВызватьМетодTelegramAPI("sendMessage", Новый Структура("chat_id, text", IdЧата, Сообщение)); 261 | 262 | КонецПроцедуры 263 | 264 | /////////////////////////////////////////////////////////////////////////////////////////////// 265 | // Инициализация 266 | /////////////////////////////////////////////////////////////////////////////////////////////// 267 | 268 | Процедура ИнициализацияGitter(Токен) Экспорт 269 | 270 | Комнаты = ПолучитьСписокКомнатGitter(Токен); 271 | АвторизацияGitter = Новый Структура("Токен, Комнаты", Токен, Комнаты); 272 | 273 | КонецПроцедуры 274 | 275 | Процедура ИнициализацияSLACK(Логин, Ключ)Экспорт 276 | 277 | АвторизацияSLACK = Новый Структура("Логин, Ключ", Логин, Ключ); 278 | 279 | КонецПроцедуры 280 | 281 | Процедура ИнициализацияSMS(КодОператора, Логин, Пароль, Подпись) Экспорт 282 | 283 | Если КодОператора = ДоступныеОператорыSMS().smsbliss Тогда 284 | 285 | Заголовки = Новый Соответствие; 286 | Заголовки.Вставить("Content-Type", "application/json"); 287 | 288 | АвторизацияSMS = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаSMSBliss(), Логин, Пароль, Подпись); 289 | АвторизацияSMS.Вставить("ИмяСервера", "json.gate.smsbliss.ru"); 290 | АвторизацияSMS.Вставить("URL", "send"); 291 | АвторизацияSMS.Вставить("Заголовки", Заголовки); 292 | 293 | ИначеЕсли КодОператора = ДоступныеОператорыSMS().infobip Тогда 294 | 295 | Заголовки = Новый Соответствие; 296 | Заголовки.Вставить("Content-Type", "application/json"); 297 | 298 | АвторизацияSMS = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаInfobip(), Логин, Пароль, Подпись); 299 | АвторизацияSMS.Вставить("ИмяСервера", "api.infobip.com"); 300 | АвторизацияSMS.Вставить("URL", "api/v3/sendsms/json"); 301 | АвторизацияSMS.Вставить("Заголовки", Заголовки); 302 | 303 | ИначеЕсли КодОператора = ДоступныеОператорыSMS().sms4b Тогда 304 | 305 | Заголовки = Новый Соответствие; 306 | Заголовки.Вставить("Accept-Encoding", "gzip,deflate"); 307 | Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8"); 308 | Заголовки.Вставить("SOAPAction", "SMS4B/SendSMS"); 309 | 310 | АвторизацияSMS = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаSms4b(), Логин, Пароль, Подпись); 311 | АвторизацияSMS.Вставить("ИмяСервера", "https://sms4b.ru"); 312 | АвторизацияSMS.Вставить("URL", "ws/sms.asmx"); 313 | АвторизацияSMS.Вставить("Заголовки", Заголовки); 314 | 315 | Иначе 316 | 317 | ВызватьИсключение "Неизвестный код оператора: " + КодОператора; 318 | 319 | КонецЕсли; 320 | 321 | КонецПроцедуры 322 | 323 | Процедура ИнициализацияRocketChat(АдресСервера, Логин, Пароль)Экспорт 324 | 325 | АвторизацияRocketChat = Новый Структура("АдресСервера, Логин, Пароль", АдресСервера, Логин, Пароль); 326 | 327 | КонецПроцедуры 328 | 329 | Процедура ИнициализацияTelegram(Токен) Экспорт 330 | 331 | АвторизацияTelegram = Новый Структура("Токен", Токен); 332 | 333 | КонецПроцедуры 334 | 335 | /////////////////////////////////////////////////////////////////////////////////////////////// 336 | 337 | Функция СформироватьТекстСообщенияSLACK(ТипСообщения, ТекстСообщения) 338 | 339 | Сообщение = ПолучитьИконкуТипаСообщения(ТипСообщения) + " " + КодироватьСтроку(ТекстСообщения, СпособКодированияСтроки.КодировкаURL); 340 | Возврат Сообщение; 341 | 342 | КонецФункции 343 | 344 | /////////////////////////////////////////////////////////////////////////////////////////////// 345 | 346 | Функция ПолучитьИконкуТипаСообщения(ТипСообщения) 347 | 348 | Иконка = ТипСообщения; 349 | Если ТипСообщения = "Ошибка" Тогда 350 | 351 | Иконка = ":no_entry:"; 352 | 353 | ИначеЕсли ТипСообщения = "Информация" Тогда 354 | 355 | Иконка = ":speech_balloon:"; 356 | 357 | ИначеЕсли ТипСообщения = "Предупреждение" Тогда 358 | 359 | Иконка = ":warning:"; 360 | 361 | КонецЕсли; 362 | 363 | Возврат Иконка; 364 | 365 | КонецФункции 366 | 367 | /////////////////////////////////////////////////////////////////////////////////////////////// 368 | 369 | Функция ПолучитьШаблонТелаЗапросаSMSBliss() 370 | 371 | Возврат 372 | "{ 373 | |""login"": ""%1"", 374 | |""password"": ""%2"", 375 | |""messages"" :[ 376 | | { 377 | | ""clientId"": 0, 378 | | ""phone"": ""%3"", 379 | | ""text"": ""%4"", 380 | | ""sender"": ""%5"" 381 | | }] 382 | |}"; 383 | 384 | КонецФункции 385 | 386 | Функция ПолучитьШаблонТелаЗапросаInfobip() 387 | 388 | Возврат 389 | "{ 390 | |""authentication"": 391 | | { 392 | | ""username"": ""%1"", 393 | | ""password"": ""%2"" 394 | | }, 395 | |""messages"" :[ 396 | | { 397 | | ""sender"": ""%5"", 398 | | ""text"": ""%4"", 399 | | ""type"": ""longSMS"", 400 | | ""datacoding"": ""8"", 401 | | ""recipients"": [{ 402 | | ""gsm"": ""%3""}] 403 | | } 404 | |] 405 | |}"; 406 | 407 | КонецФункции 408 | 409 | Функция ПолучитьШаблонТелаЗапросаSms4b() 410 | 411 | Возврат 412 | " 413 | | 414 | | 415 | | 416 | |%1 417 | |%2 418 | |%5 419 | |%3 420 | |%4 421 | | 422 | | 423 | |"; 424 | 425 | КонецФункции 426 | 427 | /////////////////////////////////////////////////////////////////////////////////////////////// 428 | 429 | Функция ДоступныеОператорыSMS()Экспорт 430 | 431 | Если ПараметрыДоступныеОператорыSMS = Неопределено Тогда 432 | 433 | ПараметрыДоступныеОператорыSMS = Новый Структура("smsbliss, infobip, sms4b", "smsbliss", "infobip", "sms4b"); 434 | 435 | КонецЕсли; 436 | 437 | Возврат ПараметрыДоступныеОператорыSMS; 438 | 439 | КонецФункции 440 | 441 | /////////////////////////////////////////////////////////////////////////////////////////////// 442 | 443 | Функция ПолучитьСписокКомнатGitter(Токен) 444 | 445 | СписокКомнат = Новый Соответствие(); 446 | 447 | ИмяСервера = "https://api.gitter.im"; 448 | 449 | Прокси = Новый ИнтернетПрокси(ИСТИНА); 450 | 451 | URL = "v1/rooms?access_token=" 452 | + Токен ; 453 | 454 | HTTPЗапрос = Новый HTTPЗапрос; 455 | HTTPЗапрос.АдресРесурса = URL; 456 | 457 | HTTP = Новый HTTPСоединение(ИмяСервера); 458 | Ответ = HTTP.Получить(HTTPЗапрос); 459 | 460 | json = Новый ПарсерJSON(); 461 | UnJason = json.ПрочитатьJSON(Ответ.ПолучитьТелоКакСтроку()); 462 | 463 | Если Ответ.КодСостояния = 200 И ТипЗнч(UnJason) = Тип("Массив") Тогда 464 | 465 | Для Каждого Комната Из UnJason Цикл 466 | 467 | СписокКомнат.Вставить(Комната.Получить("name"),Комната.Получить("id")); 468 | 469 | КонецЦикла; 470 | 471 | ИначеЕсли ТипЗнч(UnJason) = Тип("Соответствие") И UnJason["error"] = "Unauthorized" Тогда 472 | 473 | ВызватьИсключение "Ошибка авторизации"; 474 | 475 | Иначе 476 | 477 | ВызватьИсключение "Ошибка получения списка комнат"; 478 | 479 | КонецЕсли; 480 | 481 | Возврат СписокКомнат; 482 | 483 | КонецФункции 484 | 485 | /////////////////////////////////////////////////////////////////////////////////////////////// 486 | 487 | Процедура telegramGetUpdates() Экспорт 488 | 489 | ОтветHTTP = ВызватьМетодTelegramAPI("getUpdates", Новый Структура()); 490 | 491 | Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку()); 492 | 493 | КонецПроцедуры 494 | 495 | Функция ВызватьМетодTelegramAPI(ИмяМетода, Параметры) 496 | 497 | Если Авторизацияtelegram = Неопределено Тогда 498 | 499 | ВызватьИсключение "Необходимо выполнить инициализацию Telegram"; 500 | 501 | КонецЕсли; 502 | 503 | СтрокаПараметров = ""; 504 | Для Каждого Параметр Из Параметры Цикл 505 | 506 | Шаблон = "%1=%2&"; 507 | СтрокаПараметров = СтрокаПараметров + СтрШаблон(Шаблон, Параметр.Ключ, Параметр.Значение); 508 | 509 | КонецЦикла; 510 | 511 | ИмяСервера = "https://api.telegram.org"; 512 | 513 | URL = "/bot" 514 | + АвторизацияTelegram.Токен 515 | + "/" + ИмяМетода 516 | + "?" + СтрокаПараметров; 517 | 518 | HTTPЗапрос = Новый HTTPЗапрос(URL); 519 | 520 | HTTP = Новый HTTPСоединение(ИмяСервера); 521 | ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); 522 | 523 | Возврат ОтветHTTP; 524 | 525 | КонецФункции 526 | 527 | /////////////////////////////////////////////////////////////////////////////////////////////// 528 | 529 | АвторизацияSLACK = Неопределено; 530 | АвторизацияSMS = Неопределено; 531 | АвторизацияGitter = Неопределено; 532 | АвторизацияRocketChat = Неопределено; 533 | ПараметрыДоступныеОператорыSMS = Неопределено; 534 | ПараметрыДоступныеПротоколы = Неопределено; 535 | АвторизацияTelegram = Неопределено; 536 | -------------------------------------------------------------------------------- /src/Мессенджер_v2.os: -------------------------------------------------------------------------------- 1 |  2 | /////////////////////////////////////////////////////////////////////////////////////////////// 3 | // 4 | // Модуль отправки сообщений 5 | // Для использования доступны тарнспорты, реализация которых находится в каталоге сценариев 6 | // "Транспорты" 7 | // 8 | // (с) BIA Technologies, LLC 9 | // 10 | /////////////////////////////////////////////////////////////////////////////////////////////// 11 | 12 | Перем Транспорты; // подключенные транспорты отправки сообщений 13 | 14 | /////////////////////////////////////////////////////////////////////////////////////////////// 15 | // Программный интерфейс 16 | /////////////////////////////////////////////////////////////////////////////////////////////// 17 | 18 | // ДоступныеТранспорты 19 | // Вовзращает подключенные и доступные для использования транспорты 20 | // 21 | // Параметры: 22 | // 23 | // Возвращаемое значение: 24 | // Структура - подключенные транспорты. 25 | // В качестве ключа выступает имя транспорта, в качестве значения - объект сценария, реализующий 26 | // интерфейс 27 | // 28 | Функция ДоступныеТранспорты() Экспорт 29 | 30 | Возврат Транспорты; 31 | 32 | КонецФункции // ДоступныеТранспорты() 33 | 34 | // ОтправитьСообщение 35 | // Выполняет отправку сообщения выбарнным транспортом 36 | // 37 | // Параметры: 38 | // ИмяТранспорта - Строка - Имя транспорта (см ДоступныеТранспорты) 39 | // Адресат - Строка - Адресат сообщения 40 | // Сообщение - Строка - Текст отправляемого сообщения 41 | // ТемаСообщения - Строка - Тема сообщения, воспринимается не всеми транспортами 42 | // ТипСообщения - Строка - Тип сообщения, воспринимается не всеми транспортами 43 | // 44 | Процедура ОтправитьСообщение(ИмяТранспорта, Адресат, Сообщение, ТемаСообщения = "", ТипСообщения = "") Экспорт 45 | 46 | Транспорт = Неопределено; 47 | Если Не Транспорты.Свойство(ИмяТранспорта, Транспорт) Тогда 48 | 49 | ВызватьИсключение СтрШаблон("Неизвестный транспорт отправки сообщения: %1", ИмяТранспорта); 50 | 51 | КонецЕсли; 52 | 53 | ДополнительныеПараметры = Новый Структура; 54 | ДополнительныеПараметры.Вставить("ТемаСообщения", ТемаСообщения); 55 | ДополнительныеПараметры.Вставить("ТипСообщения", ТипСообщения); 56 | Транспорт.ОтправитьСообщение(Адресат, Сообщение, ДополнительныеПараметры); 57 | 58 | КонецПроцедуры // ОтправитьСообщение() 59 | 60 | // ИнициализироватьТранспорт 61 | // Выполняет настройку транспорта для использования 62 | // 63 | // Параметры: 64 | // ИмяТранспорта - Строка - Имя транспорта (см ДоступныеТранспорты) 65 | // ПараметрыИнициализации - Структура - Набор параметров для инициализации транспорта. 66 | // Если вызвать метод без этого параметра, то в сообщении будет выведена подсказка 67 | // 68 | Процедура ИнициализироватьТранспорт(ИмяТранспорта, ПараметрыИнициализации = Неопределено) Экспорт 69 | 70 | Транспорт = Неопределено; 71 | Если Не Транспорты.Свойство(ИмяТранспорта, Транспорт) Тогда 72 | 73 | ВызватьИсключение СтрШаблон("Неизвестный транспорт отправки сообщения: %1", ИмяТранспорта); 74 | 75 | КонецЕсли; 76 | 77 | Транспорт.Инициализация(ПараметрыИнициализации); 78 | 79 | КонецПроцедуры // ИнициализироватьТранспорт() 80 | 81 | /////////////////////////////////////////////////////////////////////////////////////////////// 82 | 83 | Процедура ПриСозданииОбъекта(ВывестиИнфо = ЛОЖЬ) 84 | 85 | // Загрузка классов транспортов 86 | Транспорты = Новый Структура; 87 | ФайлыТранспортов = НайтиФайлы(ОбъединитьПути(ТекущийСценарий().Каталог, "Транспорты"), "*.os"); 88 | Для Каждого ФайлТранспорта Из ФайлыТранспортов Цикл 89 | 90 | Попытка 91 | 92 | СценарийТранспорта = ЗагрузитьСценарий(ФайлТранспорта.ПолноеИмя); 93 | ОписаниеПротокола = СценарийТранспорта.Протокол(); 94 | Если СтрСравнить(ОписаниеПротокола.Имя, "Шаблон") = 0 Тогда 95 | 96 | Продолжить; 97 | 98 | КонецЕсли; 99 | Транспорты.Вставить(ОписаниеПротокола.Имя, СценарийТранспорта); 100 | 101 | Исключение 102 | 103 | Сообщить(СтрШаблон("Ошибка загрузки сценария %1: %2", ФайлТранспорта.ПолноеИмя, ОписаниеОшибки())); 104 | Продолжить; 105 | 106 | КонецПопытки; 107 | 108 | КонецЦикла; 109 | 110 | Если Транспорты.Количество() = 0 Тогда 111 | 112 | ВызватьИсключение "Нет доступных транспортов отправки сообщений" 113 | 114 | КонецЕсли; 115 | 116 | // вывод инфо при необходимости 117 | Если ВывестиИнфо = ИСТИНА Тогда 118 | 119 | Сообщить(""); 120 | Сообщить("messenger"); 121 | Сообщить(""); 122 | Сообщить("Доступные транспорты:"); 123 | Сообщить(""); 124 | Для Каждого Транспорт Из Транспорты Цикл 125 | 126 | ОписаниеПротокола = Транспорт.Значение.Протокол(); 127 | Сообщить(СтрШаблон("Имя: %1 128 | |Представление: %2 129 | |Описание: %3", ОписаниеПротокола.Имя, ОписаниеПротокола.Представление, ОписаниеПротокола.Описание)); 130 | 131 | Если ОписаниеПротокола.Операторы <> Неопределено И ОписаниеПротокола.Операторы.Количество() Тогда 132 | 133 | Сообщить("Возможные операторы:"); 134 | Для Каждого Оператор Из ОписаниеПротокола.Операторы Цикл 135 | 136 | Сообщить(СтрШаблон(" - %1", Оператор.Ключ)); 137 | 138 | КонецЦикла; 139 | 140 | КонецЕсли; 141 | 142 | Сообщить(""); 143 | 144 | КонецЦикла; 145 | 146 | КонецЕсли; 147 | 148 | КонецПроцедуры 149 | -------------------------------------------------------------------------------- /src/Транспорты/ТранспортMattermost.os: -------------------------------------------------------------------------------- 1 |  2 | /////////////////////////////////////////////////////////////////////////////////////////////// 3 | // 4 | // Модуль транспорта отправки сообщений <ИмяТранспорта> 5 | // 6 | /////////////////////////////////////////////////////////////////////////////////////////////// 7 | 8 | Перем ПараметрыАвторизации; // хранит структуру авторизации 9 | Перем ОписаниеПротокола; // хранит структуру описания протокола 10 | 11 | /////////////////////////////////////////////////////////////////////////////////////////////// 12 | // Стандартный интерфейс 13 | /////////////////////////////////////////////////////////////////////////////////////////////// 14 | 15 | // Протокол 16 | // Метод возвращает описание используемого протокола 17 | // 18 | // Возвращаемое значение: 19 | // Структура - Описание протокола 20 | // { 21 | // Имя - Строка - Системное имя транспорта 22 | // Представление - Строка - пользовательское представление транспорта 23 | // Описание - Строка - Строковое описание транспорта 24 | // Операторы - Структура - Возможные операторы транспорта 25 | // } 26 | // 27 | Функция Протокол() Экспорт 28 | 29 | Если ОписаниеПротокола = Неопределено Тогда 30 | 31 | ОписаниеПротокола = Новый Структура("Имя, Представление, Описание, Операторы", "mattermost", "mattermost hook", "Отправка сообщений в каналы mattermost через incoming hook", Неопределено); 32 | 33 | КонецЕсли; 34 | 35 | Возврат ОписаниеПротокола; 36 | 37 | КонецФункции // Протокол() 38 | 39 | // Инициализация 40 | // Инициализация параметров транспорта 41 | // 42 | // Параметры: 43 | // ПараметрыИнициализации - Структура - набор параметров инициализации 44 | // 45 | Процедура Инициализация(ПараметрыИнициализации) Экспорт 46 | 47 | Если ПараметрыИнициализации = Неопределено Тогда 48 | 49 | Сообщить(СтрШаблон("Для инициализации транспорта %1 необходимо передавать в параметрах: ", Протокол().Представление)); 50 | Сообщить(" - Сервер"); 51 | Сообщить(" - Hook"); 52 | 53 | ВызватьИсключение СтрШаблон("Инициализация транспорта %1 невыполнена", Протокол().Представление); 54 | 55 | КонецЕсли; 56 | 57 | ПараметрыАвторизации = Новый Структура("ИмяСервера, Hook", ПараметрыИнициализации.Сервер, ПараметрыИнициализации.Hook); 58 | 59 | КонецПроцедуры // Инициализация() 60 | 61 | // ОтправитьСообщение 62 | // Метод отправки сообщения 63 | // 64 | // Параметры: 65 | // Адресат - Строка - Адресат сообщения 66 | // Сообщение - Строка - Текст отправляемого сообщения 67 | // ДополнительныеПараметры - Структура - Набор дополнительных параметров 68 | // 69 | Процедура ОтправитьСообщение(Адресат, Сообщение, ДополнительныеПараметры = Неопределено) Экспорт 70 | 71 | Если ПараметрыАвторизации = Неопределено Тогда 72 | 73 | ВызватьИсключение СтрШаблон("Для отправки сообщения необходимо выполнить инициализацию транспорта %1", Протокол().Представление); 74 | 75 | КонецЕсли; 76 | 77 | URL = СтрШаблон("/hooks/%1", ПараметрыАвторизации.Hook); 78 | 79 | Прокси = Новый ИнтернетПрокси(Истина); 80 | 81 | Заголовки = Новый Соответствие; 82 | Заголовки.Вставить("Content-Type", "text/plain"); 83 | 84 | HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки); 85 | 86 | ТекстСообщения = СтрЗаменить(Сообщение, Символы.ПС, "\n"); 87 | ТекстСообщения = СтрЗаменить(ТекстСообщения, Символы.ВК, "\r"); 88 | 89 | ТелоЗапроса = СтрШаблон("{""text"":""%1"", ""channel"":""%2""}", ТекстСообщения, Адресат); 90 | 91 | HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); 92 | 93 | HTTP = Новый HTTPСоединение(ПараметрыАвторизации.ИмяСервера,,,, Прокси); 94 | Ответ = HTTP.ОтправитьДляОбработки(HTTPЗапрос); 95 | 96 | КонецПроцедуры // ОтправитьСообщение() 97 | 98 | /////////////////////////////////////////////////////////////////////////////////////////////// 99 | 100 | ПараметрыАвторизации = Неопределено; 101 | -------------------------------------------------------------------------------- /src/Транспорты/ТранспортГиттер.os: -------------------------------------------------------------------------------- 1 |  2 | /////////////////////////////////////////////////////////////////////////////////////////////// 3 | // 4 | // Модуль транспорта отправки сообщений gitter 5 | // 6 | /////////////////////////////////////////////////////////////////////////////////////////////// 7 | 8 | Перем ПараметрыАвторизации; // хранит структуру авторизации 9 | Перем ОписаниеПротокола; // хранит структуру описания протокола 10 | 11 | /////////////////////////////////////////////////////////////////////////////////////////////// 12 | // Стандартный интерфейс 13 | /////////////////////////////////////////////////////////////////////////////////////////////// 14 | 15 | // Протокол 16 | // Метод возвращает описание используемого протокола 17 | // 18 | // Возвращаемое значение: 19 | // Структура - Описание протокола 20 | // { 21 | // Имя - Строка - Системное имя транспорта 22 | // Представление - Строка - пользовательское представление транспорта 23 | // Описание - Строка - Строковое описание транспорта 24 | // Операторы - Структура - Возможные операторы транспорта 25 | // } 26 | // 27 | Функция Протокол() Экспорт 28 | 29 | Если ОписаниеПротокола = Неопределено Тогда 30 | 31 | ОписаниеПротокола = Новый Структура("Имя, Представление, Описание, Операторы", "gitter", "gitter", "Отправка сообщений в комнаты gitter", Неопределено); 32 | 33 | КонецЕсли; 34 | 35 | Возврат ОписаниеПротокола; 36 | 37 | КонецФункции // Протокол() 38 | 39 | // Инициализация 40 | // Инициализация параметров транспорта 41 | // 42 | // Параметры: 43 | // ПараметрыИнициализации - Структура - набор параметров инициализации 44 | // 45 | Процедура Инициализация(ПараметрыИнициализации) Экспорт 46 | 47 | Если ПараметрыИнициализации = Неопределено Тогда 48 | 49 | Сообщить(СтрШаблон("Для инициализации транспорта %1 необходимо передавать в параметрах: ", Протокол().Представление)); 50 | Сообщить(" - Логин"); 51 | 52 | ВызватьИсключение СтрШаблон("Инициализация транспорта %1 невыполнена", Протокол().Представление); 53 | 54 | КонецЕсли; 55 | 56 | Комнаты = ПолучитьСписокКомнат(ПараметрыИнициализации.Логин); 57 | ПараметрыАвторизации = Новый Структура("Токен, Комнаты", ПараметрыИнициализации.Логин, Комнаты); 58 | 59 | КонецПроцедуры // Инициализация() 60 | 61 | // ОтправитьСообщение 62 | // Метод отправки сообщения 63 | // 64 | // Параметры: 65 | // Адресат - Строка - Адресат сообщения 66 | // Сообщение - Строка - Текст отправляемого сообщения 67 | // ДополнительныеПараметры - Структура - Набор дополнительных параметров 68 | // 69 | Процедура ОтправитьСообщение(Адресат, Сообщение, ДополнительныеПараметры = Неопределено) Экспорт 70 | 71 | Если ПараметрыАвторизации = Неопределено Тогда 72 | 73 | ВызватьИсключение СтрШаблон("Для отправки сообщения необходимо выполнить инициализацию транспорта %1", Протокол().Представление); 74 | 75 | КонецЕсли; 76 | 77 | ИмяСервера = "https://api.gitter.im"; 78 | IdКомнаты = ПараметрыАвторизации.Комнаты[Адресат]; 79 | URL = СтрШаблон("/v1/rooms/%1/chatMessages", IdКомнаты); 80 | 81 | Прокси = Новый ИнтернетПрокси(Истина); 82 | 83 | Заголовки = Новый Соответствие; 84 | Заголовки.Вставить("Content-Type", "application/json"); 85 | Заголовки.Вставить("Accept", "application/json"); 86 | Заголовки.Вставить("Authorization", " Bearer " + ПараметрыАвторизации.Токен); 87 | 88 | HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки); 89 | 90 | ТекстСообщения = СтрЗаменить(Сообщение, Символы.ПС, "\n"); 91 | ТекстСообщения = СтрЗаменить(ТекстСообщения, Символы.ВК, "\r"); 92 | 93 | ТелоЗапроса = СтрШаблон("{""text"":""%1""}", ТекстСообщения); 94 | 95 | HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); 96 | 97 | HTTP = Новый HTTPСоединение(ИмяСервера); 98 | ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); 99 | 100 | КонецПроцедуры // ОтправитьСообщение() 101 | 102 | /////////////////////////////////////////////////////////////////////////////////////////////// 103 | // Методы реализации 104 | /////////////////////////////////////////////////////////////////////////////////////////////// 105 | 106 | Функция ПолучитьСписокКомнат(Токен) 107 | 108 | СписокКомнат = Новый Соответствие(); 109 | 110 | ИмяСервера = "https://api.gitter.im"; 111 | URL = "v1/rooms?access_token=" + Токен ; 112 | 113 | Прокси = Новый ИнтернетПрокси(ИСТИНА); 114 | 115 | HTTPЗапрос = Новый HTTPЗапрос; 116 | HTTPЗапрос.АдресРесурса = URL; 117 | 118 | HTTP = Новый HTTPСоединение(ИмяСервера); 119 | Ответ = HTTP.Получить(HTTPЗапрос); 120 | 121 | json = Новый ПарсерJSON(); 122 | UnJason = json.ПрочитатьJSON(Ответ.ПолучитьТелоКакСтроку()); 123 | 124 | Если Ответ.КодСостояния = 200 И ТипЗнч(UnJason) = Тип("Массив") Тогда 125 | 126 | Для Каждого Комната Из UnJason Цикл 127 | 128 | СписокКомнат.Вставить(Комната.Получить("name"), Комната.Получить("id")); 129 | 130 | КонецЦикла; 131 | 132 | ИначеЕсли ТипЗнч(UnJason) = Тип("Соответствие") И UnJason["error"] = "Unauthorized" Тогда 133 | 134 | ВызватьИсключение "Ошибка авторизации"; 135 | 136 | Иначе 137 | 138 | ВызватьИсключение "Ошибка получения списка комнат"; 139 | 140 | КонецЕсли; 141 | 142 | Возврат СписокКомнат; 143 | 144 | КонецФункции 145 | 146 | /////////////////////////////////////////////////////////////////////////////////////////////// 147 | 148 | ПараметрыАвторизации = Неопределено; 149 | -------------------------------------------------------------------------------- /src/Транспорты/ТранспортРокетЧат.os: -------------------------------------------------------------------------------- 1 |  2 | /////////////////////////////////////////////////////////////////////////////////////////////// 3 | // 4 | // Модуль транспорта отправки сообщений rocketchat 5 | // 6 | /////////////////////////////////////////////////////////////////////////////////////////////// 7 | 8 | Перем ПараметрыАвторизации; // хранит структуру авторизации 9 | Перем ОписаниеПротокола; // хранит структуру описания протокола 10 | 11 | /////////////////////////////////////////////////////////////////////////////////////////////// 12 | // Стандартный интерфейс 13 | /////////////////////////////////////////////////////////////////////////////////////////////// 14 | 15 | // Протокол 16 | // Метод возвращает описание используемого протокола 17 | // 18 | // Возвращаемое значение: 19 | // Структура - Описание протокола 20 | // { 21 | // Имя - Строка - Системное имя транспорта 22 | // Представление - Строка - пользовательское представление транспорта 23 | // Описание - Строка - Строковое описание транспорта 24 | // Операторы - Структура - Возможные операторы транспорта 25 | // } 26 | // 27 | Функция Протокол() Экспорт 28 | 29 | Если ОписаниеПротокола = Неопределено Тогда 30 | 31 | ОписаниеПротокола = Новый Структура("Имя, Представление, Описание, Операторы", "rocketchat", "rocketchat", "Отправка сообщений в каналы и пользователям RocketChat", Неопределено); 32 | 33 | КонецЕсли; 34 | 35 | Возврат ОписаниеПротокола; 36 | 37 | КонецФункции // Протокол() 38 | 39 | // Инициализация 40 | // Инициализация параметров транспорта 41 | // 42 | // Параметры: 43 | // ПараметрыИнициализации - Структура - набор параметров инициализации 44 | // 45 | Процедура Инициализация(ПараметрыИнициализации) Экспорт 46 | 47 | Если ПараметрыИнициализации = Неопределено Тогда 48 | 49 | Сообщить(СтрШаблон("Для инициализации транспорта %1 необходимо передавать в параметрах: ", Протокол().Представление)); 50 | Сообщить(" - Логин"); 51 | Сообщить(" - Пароль"); 52 | Сообщить(" - АдресСервера"); 53 | 54 | ВызватьИсключение СтрШаблон("Инициализация транспорта %1 невыполнена", Протокол().Представление); 55 | 56 | КонецЕсли; 57 | 58 | ПараметрыАвторизации = Новый Структура("АдресСервера, Логин, Пароль", 59 | ПараметрыИнициализации.АдресСервера, 60 | ПараметрыИнициализации.Логин, 61 | ПараметрыИнициализации.Пароль); 62 | 63 | КонецПроцедуры // Инициализация() 64 | 65 | // ОтправитьСообщение 66 | // Метод отправки сообщения 67 | // 68 | // Параметры: 69 | // Адресат - Строка - Адресат сообщения 70 | // Сообщение - Строка - Текст отправляемого сообщения 71 | // ДополнительныеПараметры - Структура - Набор дополнительных параметров 72 | // 73 | Процедура ОтправитьСообщение(Адресат, Сообщение, ДополнительныеПараметры = Неопределено) Экспорт 74 | 75 | Если ПараметрыАвторизации = Неопределено Тогда 76 | 77 | ВызватьИсключение СтрШаблон("Для отправки сообщения необходимо выполнить инициализацию транспорта %1", Протокол().Представление); 78 | 79 | КонецЕсли; 80 | 81 | Прокси = Новый ИнтернетПрокси(ИСТИНА); 82 | 83 | // сначала авторизация 84 | URL = "api/v1/login"; 85 | HTTPЗапрос = Новый HTTPЗапрос; 86 | HTTPЗапрос.АдресРесурса = URL; 87 | HTTPЗапрос.УстановитьТелоИзСтроки(СтрШаблон("{""user"":""%1"", ""password"":""%2""}", ПараметрыАвторизации.Логин, ПараметрыАвторизации.Пароль)); 88 | HTTP = Новый HTTPСоединение(ПараметрыАвторизации.АдресСервера,,,, Прокси); 89 | ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); 90 | 91 | Если ОтветHTTP.КодСостояния = 200 Тогда 92 | 93 | json = Новый ПарсерJSON(); 94 | ОтветJson = json.ПрочитатьJSON(ОтветHTTP.ПолучитьТелоКакСтроку()); 95 | Если ОтветJson.Получить("status") = "success" Тогда 96 | 97 | Токен = ОтветJson.Получить("data").Получить("authToken"); 98 | ИД = ОтветJson.Получить("data").Получить("userId"); 99 | 100 | // отправка сообщения 101 | URL = "api/v1/chat.postMessage"; 102 | 103 | Заголовки = Новый Соответствие; 104 | Заголовки.Вставить("Content-Type", "application/json"); 105 | Заголовки.Вставить("Accept", "application/json"); 106 | Заголовки.Вставить("X-Auth-Token", Токен); 107 | Заголовки.Вставить("X-User-Id", ИД); 108 | 109 | ОписаниеСообщения = Новый Структура; 110 | ОписаниеСообщения.Вставить("channel", Адресат); 111 | ОписаниеСообщения.Вставить("text", Сообщение); 112 | ОписаниеСообщения.Вставить("emoji", ПолучитьИконкуТипаСообщения(ДополнительныеПараметры.ТипСообщения)); 113 | HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки); 114 | HTTPЗапрос.УстановитьТелоИзСтроки(json.ЗаписатьJSON(ОписаниеСообщения)); 115 | HTTP = Новый HTTPСоединение(ПараметрыАвторизации.АдресСервера,,,, Прокси); 116 | ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); 117 | Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку()); 118 | 119 | Иначе 120 | 121 | ВызватьИсключение "Ошибка авторизации"; 122 | 123 | КонецЕсли; 124 | 125 | Иначе 126 | 127 | ВызватьИсключение "Ошибка выполнения команды: " + ОтветHTTP.ПолучитьТелоКакСтроку(); 128 | 129 | КонецЕсли; 130 | 131 | КонецПроцедуры // ОтправитьСообщение() 132 | 133 | /////////////////////////////////////////////////////////////////////////////////////////////// 134 | // Методы реализации 135 | /////////////////////////////////////////////////////////////////////////////////////////////// 136 | 137 | Функция ПолучитьИконкуТипаСообщения(ТипСообщения) 138 | 139 | Иконка = ТипСообщения; 140 | Если ТипСообщения = "Ошибка" Тогда 141 | 142 | Иконка = ":no_entry:"; 143 | 144 | ИначеЕсли ТипСообщения = "Информация" Тогда 145 | 146 | Иконка = ":speech_balloon:"; 147 | 148 | ИначеЕсли ТипСообщения = "Предупреждение" Тогда 149 | 150 | Иконка = ":warning:"; 151 | 152 | КонецЕсли; 153 | 154 | Возврат Иконка; 155 | 156 | КонецФункции 157 | 158 | /////////////////////////////////////////////////////////////////////////////////////////////// 159 | 160 | ПараметрыАвторизации = Неопределено; 161 | -------------------------------------------------------------------------------- /src/Транспорты/ТранспортСМС.os: -------------------------------------------------------------------------------- 1 |  2 | /////////////////////////////////////////////////////////////////////////////////////////////// 3 | // 4 | // Модуль транспорта отправки сообщений СМС 5 | // 6 | /////////////////////////////////////////////////////////////////////////////////////////////// 7 | 8 | Перем ПараметрыАвторизации; // хранит структуру авторизации 9 | Перем ОписаниеПротокола; // хранит структуру описания протокола 10 | 11 | Перем ДоступныеОператорыSMS; 12 | 13 | /////////////////////////////////////////////////////////////////////////////////////////////// 14 | // Стандартный интерфейс 15 | /////////////////////////////////////////////////////////////////////////////////////////////// 16 | 17 | // Протокол 18 | // Метод возвращает описание используемого протокола 19 | // 20 | // Возвращаемое значение: 21 | // Структура - Описание протокола 22 | // { 23 | // Имя - Строка - Системное имя транспорта 24 | // Представление - Строка - пользовательское представление транспорта 25 | // Описание - Строка - Строковое описание транспорта 26 | // Операторы - Структура - Возможные операторы транспорта 27 | // } 28 | // 29 | Функция Протокол() Экспорт 30 | 31 | Если ОписаниеПротокола = Неопределено Тогда 32 | 33 | ОписаниеПротокола = Новый Структура("Имя, Представление, Описание, Операторы", "sms", "СМС", "Отправка СМС", ДоступныеОператоры()); 34 | 35 | КонецЕсли; 36 | 37 | Возврат ОписаниеПротокола; 38 | 39 | КонецФункции // Протокол() 40 | 41 | // Инициализация 42 | // Инициализация параметров транспорта 43 | // 44 | // Параметры: 45 | // ПараметрыИнициализации - Структура - набор параметров инициализации 46 | // 47 | Процедура Инициализация(ПараметрыИнициализации) Экспорт 48 | 49 | Если ПараметрыИнициализации = Неопределено Тогда 50 | 51 | Сообщить(СтрШаблон("Для инициализации транспорта %1 необходимо передавать в параметрах: ", Протокол().Представление)); 52 | Сообщить(" - Логин"); 53 | Сообщить(" - Пароль"); 54 | Сообщить(" - Подпись"); 55 | Сообщить(" - КодОператора"); 56 | 57 | ВызватьИсключение СтрШаблон("Инициализация транспорта %1 невыполнена", Протокол().Представление); 58 | 59 | КонецЕсли; 60 | 61 | Логин = ПараметрыИнициализации.Логин; 62 | Пароль = ПараметрыИнициализации.Пароль; 63 | Подпись = ПараметрыИнициализации.Подпись; 64 | КодОператора = ПараметрыИнициализации.КодОператора; 65 | 66 | Если КодОператора = ДоступныеОператоры().smsbliss Тогда 67 | 68 | Заголовки = Новый Соответствие; 69 | Заголовки.Вставить("Content-Type", "application/json"); 70 | 71 | ПараметрыАвторизации = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаSMSBliss(), Логин, Пароль, Подпись); 72 | ПараметрыАвторизации.Вставить("ИмяСервера", "json.gate.smsbliss.ru"); 73 | ПараметрыАвторизации.Вставить("URL", "send"); 74 | ПараметрыАвторизации.Вставить("Заголовки", Заголовки); 75 | 76 | ИначеЕсли КодОператора = ДоступныеОператоры().infobip Тогда 77 | 78 | Заголовки = Новый Соответствие; 79 | Заголовки.Вставить("Content-Type", "application/json"); 80 | 81 | ПараметрыАвторизации = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаInfobip(), Логин, Пароль, Подпись); 82 | ПараметрыАвторизации.Вставить("ИмяСервера", "api.infobip.com"); 83 | ПараметрыАвторизации.Вставить("URL", "api/v3/sendsms/json"); 84 | ПараметрыАвторизации.Вставить("Заголовки", Заголовки); 85 | 86 | ИначеЕсли КодОператора = ДоступныеОператоры().sms4b Тогда 87 | 88 | Заголовки = Новый Соответствие; 89 | Заголовки.Вставить("Accept-Encoding", "gzip,deflate"); 90 | Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8"); 91 | Заголовки.Вставить("SOAPAction", "SMS4B/SendSMS"); 92 | 93 | ПараметрыАвторизации = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаSms4b(), Логин, Пароль, Подпись); 94 | ПараметрыАвторизации.Вставить("ИмяСервера", "https://sms4b.ru"); 95 | ПараметрыАвторизации.Вставить("URL", "ws/sms.asmx"); 96 | ПараметрыАвторизации.Вставить("Заголовки", Заголовки); 97 | 98 | ИначеЕсли КодОператора = ДоступныеОператоры().smsclub Тогда 99 | 100 | Заголовки = Новый Соответствие; 101 | Заголовки.Вставить("Authorization", "Bearer " + ПараметрыИнициализации.Токен); 102 | Заголовки.Вставить("Content-Type", "application/json"); 103 | 104 | ПараметрыАвторизации = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаSmsClub(), Логин, Пароль, Подпись); 105 | ПараметрыАвторизации.Вставить("ИмяСервера", "https://im.smsclub.mobi"); 106 | ПараметрыАвторизации.Вставить("URL", "sms/send"); 107 | ПараметрыАвторизации.Вставить("Заголовки", Заголовки); 108 | 109 | Иначе 110 | 111 | ВызватьИсключение "Неизвестный код оператора: " + КодОператора; 112 | 113 | КонецЕсли; 114 | 115 | КонецПроцедуры // Инициализация() 116 | 117 | // ОтправитьСообщение 118 | // Метод отправки сообщения 119 | // 120 | // Параметры: 121 | // Адресат - Строка - Адресат сообщения 122 | // Сообщение - Строка - Текст отправляемого сообщения 123 | // ДополнительныеПараметры - Структура - Набор дополнительных параметров 124 | // 125 | Процедура ОтправитьСообщение(Адресат, Сообщение, ДополнительныеПараметры = Неопределено) Экспорт 126 | 127 | Если ПараметрыАвторизации = Неопределено Тогда 128 | 129 | ВызватьИсключение СтрШаблон("Для отправки сообщения необходимо выполнить инициализацию транспорта %1", Протокол().Представление); 130 | 131 | КонецЕсли; 132 | 133 | URL = ПараметрыАвторизации.URL; 134 | ИмяСервера = ПараметрыАвторизации.ИмяСервера; 135 | 136 | ТелоЗапроса = СтрШаблон(ПараметрыАвторизации.ШаблонТелаЗапроса, 137 | ПараметрыАвторизации.Логин, 138 | ПараметрыАвторизации.Пароль, 139 | Адресат, 140 | Сообщение, 141 | ПараметрыАвторизации.Подпись); 142 | 143 | HTTPЗапрос = Новый HTTPЗапрос(ПараметрыАвторизации.URL, ПараметрыАвторизации.Заголовки); 144 | HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); 145 | 146 | HTTP = Новый HTTPСоединение(ИмяСервера); 147 | Ответ = HTTP.ОтправитьДляОбработки(HTTPЗапрос); 148 | 149 | КонецПроцедуры // ОтправитьСообщение() 150 | 151 | /////////////////////////////////////////////////////////////////////////////////////////////// 152 | // Методы реализации 153 | /////////////////////////////////////////////////////////////////////////////////////////////// 154 | 155 | Функция ДоступныеОператоры() 156 | 157 | Если ДоступныеОператорыSMS = Неопределено Тогда 158 | 159 | ДоступныеОператорыSMS = Новый Структура("smsbliss, infobip, sms4b, smsclub", "smsbliss", "infobip", "sms4b", "smsclub"); 160 | 161 | КонецЕсли; 162 | 163 | Возврат ДоступныеОператорыSMS; 164 | 165 | КонецФункции 166 | 167 | Функция ПолучитьШаблонТелаЗапросаSMSBliss() 168 | 169 | Возврат 170 | "{ 171 | |""login"": ""%1"", 172 | |""password"": ""%2"", 173 | |""messages"" :[ 174 | | { 175 | | ""clientId"": 0, 176 | | ""phone"": ""%3"", 177 | | ""text"": ""%4"", 178 | | ""sender"": ""%5"" 179 | | }] 180 | |}"; 181 | 182 | КонецФункции 183 | 184 | Функция ПолучитьШаблонТелаЗапросаInfobip() 185 | 186 | Возврат 187 | "{ 188 | |""authentication"": 189 | | { 190 | | ""username"": ""%1"", 191 | | ""password"": ""%2"" 192 | | }, 193 | |""messages"" :[ 194 | | { 195 | | ""sender"": ""%5"", 196 | | ""text"": ""%4"", 197 | | ""type"": ""longSMS"", 198 | | ""datacoding"": ""8"", 199 | | ""recipients"": [{ 200 | | ""gsm"": ""%3""}] 201 | | } 202 | |] 203 | |}"; 204 | 205 | КонецФункции 206 | 207 | Функция ПолучитьШаблонТелаЗапросаSms4b() 208 | 209 | Возврат 210 | " 211 | | 212 | | 213 | | 214 | |%1 215 | |%2 216 | |%5 217 | |%3 218 | |%4 219 | | 220 | | 221 | |"; 222 | 223 | КонецФункции 224 | 225 | Функция ПолучитьШаблонТелаЗапросаSmsClub () 226 | 227 | Возврат 228 | "{%1%2 229 | |""phone"": [ ""%3""], 230 | |""src_addr"": ""%5"", 231 | |""message"" : ""%4"" 232 | |}"; 233 | 234 | КонецФункции 235 | 236 | /////////////////////////////////////////////////////////////////////////////////////////////// 237 | 238 | ПараметрыАвторизации = Неопределено; 239 | -------------------------------------------------------------------------------- /src/Транспорты/ТранспортСлак.os: -------------------------------------------------------------------------------- 1 |  2 | /////////////////////////////////////////////////////////////////////////////////////////////// 3 | // 4 | // Модуль транспорта отправки сообщений slack 5 | // 6 | /////////////////////////////////////////////////////////////////////////////////////////////// 7 | 8 | Перем ПараметрыАвторизации; // хранит структуру авторизации 9 | Перем ОписаниеПротокола; // хранит структуру описания протокола 10 | 11 | /////////////////////////////////////////////////////////////////////////////////////////////// 12 | // Стандартный интерфейс 13 | /////////////////////////////////////////////////////////////////////////////////////////////// 14 | 15 | // Протокол 16 | // Метод возвращает описание используемого протокола 17 | // 18 | // Возвращаемое значение: 19 | // Структура - Описание протокола 20 | // { 21 | // Имя - Строка - Системное имя транспорта 22 | // Представление - Строка - пользовательское представление транспорта 23 | // Описание - Строка - Строковое описание транспорта 24 | // Операторы - Структура - Возможные операторы транспорта 25 | // } 26 | // 27 | Функция Протокол() Экспорт 28 | 29 | Если ОписаниеПротокола = Неопределено Тогда 30 | 31 | ОписаниеПротокола = Новый Структура("Имя, Представление, Описание, Операторы", "slack", "slack", "Отправка сообщений в каналы slack", Неопределено); 32 | 33 | КонецЕсли; 34 | 35 | Возврат ОписаниеПротокола; 36 | 37 | КонецФункции // Протокол() 38 | 39 | // Инициализация 40 | // Инициализация параметров транспорта 41 | // 42 | // Параметры: 43 | // ПараметрыИнициализации - Структура - набор параметров инициализации 44 | // 45 | Процедура Инициализация(ПараметрыИнициализации) Экспорт 46 | 47 | Если ПараметрыИнициализации = Неопределено Тогда 48 | 49 | Сообщить(СтрШаблон("Для инициализации транспорта %1 необходимо передавать в параметрах: ", Протокол().Представление)); 50 | Сообщить(" - Логин"); 51 | Сообщить(" - Ключ"); 52 | 53 | ВызватьИсключение СтрШаблон("Инициализация транспорта %1 невыполнена", Протокол().Представление); 54 | 55 | КонецЕсли; 56 | 57 | ПараметрыАвторизации = Новый Структура("Логин, Ключ", ПараметрыИнициализации.Логин, ПараметрыИнициализации.Пароль); 58 | 59 | КонецПроцедуры // Инициализация() 60 | 61 | // ОтправитьСообщение 62 | // Метод отправки сообщения 63 | // 64 | // Параметры: 65 | // Адресат - Строка - Адресат сообщения 66 | // Сообщение - Строка - Текст отправляемого сообщения 67 | // ДополнительныеПараметры - Структура - Набор дополнительных параметров 68 | // 69 | Процедура ОтправитьСообщение(Адресат, Сообщение, ДополнительныеПараметры = Неопределено) Экспорт 70 | 71 | Если ПараметрыАвторизации = Неопределено Тогда 72 | 73 | ВызватьИсключение СтрШаблон("Для отправки сообщения необходимо выполнить инициализацию транспорта %1", Протокол().Представление); 74 | 75 | КонецЕсли; 76 | 77 | ИмяСервера = "slack.com"; 78 | Прокси = Новый ИнтернетПрокси(ИСТИНА); 79 | 80 | URL = "api/chat.postMessage?channel=" 81 | + Адресат 82 | + "&text=" + СформироватьТекстСообщения(ДополнительныеПараметры.ТипСообщения, Сообщение) 83 | + "&as_user=" + ПараметрыАвторизации.Логин + "&token=" + ПараметрыАвторизации.Ключ; 84 | 85 | 86 | HTTPЗапрос = Новый HTTPЗапрос; 87 | HTTPЗапрос.АдресРесурса = URL; 88 | 89 | HTTP = Новый HTTPСоединение(ИмяСервера,,,, Прокси); 90 | Ответ = HTTP.Получить(HTTPЗапрос); 91 | 92 | КонецПроцедуры // ОтправитьСообщение() 93 | 94 | /////////////////////////////////////////////////////////////////////////////////////////////// 95 | // Методы реализации 96 | /////////////////////////////////////////////////////////////////////////////////////////////// 97 | 98 | Функция СформироватьТекстСообщения(ТипСообщения, ТекстСообщения) 99 | 100 | Сообщение = ПолучитьИконкуТипаСообщения(ТипСообщения) + " " + КодироватьСтроку(ТекстСообщения, СпособКодированияСтроки.КодировкаURL); 101 | Возврат Сообщение; 102 | 103 | КонецФункции 104 | 105 | Функция ПолучитьИконкуТипаСообщения(ТипСообщения) 106 | 107 | Иконка = ТипСообщения; 108 | Если СтрСравнить(ТипСообщения, "Ошибка") = 0 Тогда 109 | 110 | Иконка = ":no_entry:"; 111 | 112 | ИначеЕсли СтрСравнить(ТипСообщения, "Информация") = 0 Тогда 113 | 114 | Иконка = ":speech_balloon:"; 115 | 116 | ИначеЕсли СтрСравнить(ТипСообщения, "Предупреждение") = 0 Тогда 117 | 118 | Иконка = ":warning:"; 119 | 120 | КонецЕсли; 121 | 122 | Возврат Иконка; 123 | 124 | КонецФункции 125 | 126 | /////////////////////////////////////////////////////////////////////////////////////////////// 127 | 128 | ПараметрыАвторизации = Неопределено; 129 | -------------------------------------------------------------------------------- /src/Транспорты/ТранспортСлакHook.os: -------------------------------------------------------------------------------- 1 |  2 | /////////////////////////////////////////////////////////////////////////////////////////////// 3 | // 4 | // Модуль транспорта отправки сообщений slack-hook 5 | // 6 | /////////////////////////////////////////////////////////////////////////////////////////////// 7 | 8 | Перем ПараметрыАвторизации; // хранит структуру авторизации 9 | Перем ОписаниеПротокола; // хранит структуру описания протокола 10 | 11 | /////////////////////////////////////////////////////////////////////////////////////////////// 12 | // Стандартный интерфейс 13 | /////////////////////////////////////////////////////////////////////////////////////////////// 14 | 15 | // Протокол 16 | // Метод возвращает описание используемого протокола 17 | // 18 | // Возвращаемое значение: 19 | // Структура - Описание протокола 20 | // { 21 | // Имя - Строка - Системное имя транспорта 22 | // Представление - Строка - пользовательское представление транспорта 23 | // Описание - Строка - Строковое описание транспорта 24 | // Операторы - Структура - Возможные операторы транспорта 25 | // } 26 | // 27 | Функция Протокол() Экспорт 28 | 29 | Если ОписаниеПротокола = Неопределено Тогда 30 | 31 | ОписаниеПротокола = Новый Структура("Имя, Представление, Описание, Операторы", "slackhook", "slack hook", "Отправка сообщений в каналы slack через webhook", Неопределено); 32 | 33 | КонецЕсли; 34 | 35 | Возврат ОписаниеПротокола; 36 | 37 | КонецФункции // Протокол() 38 | 39 | // Инициализация 40 | // Инициализация параметров транспорта 41 | // 42 | // Параметры: 43 | // ПараметрыИнициализации - Структура - набор параметров инициализации 44 | // 45 | Процедура Инициализация(ПараметрыИнициализации) Экспорт 46 | 47 | Если ПараметрыИнициализации = Неопределено Тогда 48 | 49 | Сообщить(СтрШаблон("Для инициализации транспорта %1 необходимо передавать в параметрах: ", Протокол().Представление)); 50 | Сообщить(" - Логин"); 51 | Сообщить(" - Префикс"); 52 | 53 | ВызватьИсключение СтрШаблон("Инициализация транспорта %1 невыполнена", Протокол().Представление); 54 | 55 | КонецЕсли; 56 | 57 | ПараметрыАвторизации = Новый Структура("Токен, Префикс", ПараметрыИнициализации.Логин, ПараметрыИнициализации.Префикс); 58 | 59 | КонецПроцедуры // Инициализация() 60 | 61 | // ОтправитьСообщение 62 | // Метод отправки сообщения 63 | // 64 | // Параметры: 65 | // Адресат - Строка - Адресат сообщения 66 | // Сообщение - Строка - Текст отправляемого сообщения 67 | // ДополнительныеПараметры - Структура - Набор дополнительных параметров 68 | // 69 | Процедура ОтправитьСообщение(Адресат, Сообщение, ДополнительныеПараметры = Неопределено) Экспорт 70 | 71 | Если ПараметрыАвторизации = Неопределено Тогда 72 | 73 | ВызватьИсключение СтрШаблон("Для отправки сообщения необходимо выполнить инициализацию транспорта %1", Протокол().Представление); 74 | 75 | КонецЕсли; 76 | 77 | ИмяСервера = "https://hooks.slack.com"; 78 | URL = СтрШаблон("/services/%1/%2", ПараметрыАвторизации.Префикс, ПараметрыАвторизации.Токен); 79 | 80 | Прокси = Новый ИнтернетПрокси(Истина); 81 | 82 | Заголовки = Новый Соответствие; 83 | Заголовки.Вставить("Content-Type", "application/json"); 84 | Заголовки.Вставить("Accept", "application/json"); 85 | 86 | HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки); 87 | 88 | ТекстСообщения = СтрЗаменить(Сообщение, Символы.ПС, "\n"); 89 | ТекстСообщения = СтрЗаменить(ТекстСообщения, Символы.ВК, "\r"); 90 | 91 | ТелоЗапроса = СтрШаблон("{""text"":""%1""}", ТекстСообщения); 92 | 93 | HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); 94 | 95 | HTTP = Новый HTTPСоединение(ИмяСервера,,,, Прокси); 96 | Ответ = HTTP.ОтправитьДляОбработки(HTTPЗапрос); 97 | 98 | КонецПроцедуры // ОтправитьСообщение() 99 | 100 | /////////////////////////////////////////////////////////////////////////////////////////////// 101 | 102 | ПараметрыАвторизации = Неопределено; 103 | -------------------------------------------------------------------------------- /src/Транспорты/ТранспортТелеграм.os: -------------------------------------------------------------------------------- 1 |  2 | /////////////////////////////////////////////////////////////////////////////////////////////// 3 | // 4 | // Модуль транспорта отправки сообщений telegram 5 | // 6 | /////////////////////////////////////////////////////////////////////////////////////////////// 7 | 8 | Перем ПараметрыАвторизации; // хранит структуру авторизации 9 | Перем ОписаниеПротокола; // хранит структуру описания протокола 10 | 11 | /////////////////////////////////////////////////////////////////////////////////////////////// 12 | // Стандартный интерфейс 13 | /////////////////////////////////////////////////////////////////////////////////////////////// 14 | 15 | // Протокол 16 | // Метод возвращает описание используемого протокола 17 | // 18 | // Возвращаемое значение: 19 | // Структура - Описание протокола 20 | // { 21 | // Имя - Строка - Системное имя транспорта 22 | // Представление - Строка - пользовательское представление транспорта 23 | // Описание - Строка - Строковое описание транспорта 24 | // Операторы - Структура - Возможные операторы транспорта 25 | // } 26 | // 27 | Функция Протокол() Экспорт 28 | 29 | Если ОписаниеПротокола = Неопределено Тогда 30 | 31 | ОписаниеПротокола = Новый Структура("Имя, Представление, Описание, Операторы", "telegram", "telegram", "Отправка сообщений в каналы telegram", Неопределено); 32 | 33 | КонецЕсли; 34 | 35 | Возврат ОписаниеПротокола; 36 | 37 | КонецФункции // Протокол() 38 | 39 | // Инициализация 40 | // Инициализация параметров транспорта 41 | // 42 | // Параметры: 43 | // ПараметрыИнициализации - Структура - набор параметров инициализации 44 | // 45 | Процедура Инициализация(ПараметрыИнициализации) Экспорт 46 | 47 | Если ПараметрыИнициализации = Неопределено Тогда 48 | 49 | Сообщить(СтрШаблон("Для инициализации транспорта %1 необходимо передавать в параметрах: ", Протокол().Представление)); 50 | Сообщить(" - Логин"); 51 | 52 | ВызватьИсключение СтрШаблон("Инициализация транспорта %1 невыполнена", Протокол().Представление); 53 | 54 | КонецЕсли; 55 | 56 | ПараметрыАвторизации = Новый Структура("Токен", ПараметрыИнициализации.Логин); 57 | 58 | КонецПроцедуры // Инициализация() 59 | 60 | // ОтправитьСообщение 61 | // Метод отправки сообщения 62 | // 63 | // Параметры: 64 | // Адресат - Строка - Адресат сообщения 65 | // Сообщение - Строка - Текст отправляемого сообщения 66 | // ДополнительныеПараметры - Структура - Набор дополнительных параметров 67 | // 68 | Процедура ОтправитьСообщение(Адресат, Сообщение, ДополнительныеПараметры = Неопределено) Экспорт 69 | 70 | Если ПараметрыАвторизации = Неопределено Тогда 71 | 72 | ВызватьИсключение СтрШаблон("Для отправки сообщения необходимо выполнить инициализацию транспорта %1", Протокол().Представление); 73 | 74 | КонецЕсли; 75 | 76 | ТекстСообщения = СтрЗаменить(Сообщение, Символы.ПС, "%0A"); 77 | ПараметрыСообщения = Новый Структура("chat_id, text", Адресат, ТекстСообщения); 78 | 79 | ОпределитьТипСообщения(ДополнительныеПараметры, ПараметрыСообщения); 80 | 81 | Попытка 82 | ОтветHTTP = ВызватьМетодTelegramAPI("sendMessage", ПараметрыСообщения); 83 | Если ОтветHTTP.КодСостояния <> 200 Тогда 84 | ОтправкаВСлучаеОшибок(ПараметрыСообщения); 85 | КонецЕсли; 86 | Исключение 87 | ОтправкаВСлучаеОшибок(ПараметрыСообщения); 88 | КонецПопытки; 89 | 90 | КонецПроцедуры // ОтправитьСообщение() 91 | 92 | Процедура ОтправкаВСлучаеОшибок(ПараметрыСообщения) 93 | 94 | КодСостоянияСоединения = 301; 95 | КоличествоПопытокПодключения = 0; 96 | 97 | Пока ((КодСостоянияСоединения > 300) И (КоличествоПопытокПодключения < 25)) Цикл 98 | Попытка 99 | Прокси = СоздатьДинамическийПрокси(КоличествоПопытокПодключения); 100 | ОтветHTTP = ВызватьМетодTelegramAPI("sendMessage", ПараметрыСообщения, Прокси); 101 | КодСостоянияСоединения = ОтветHTTP.КодСостояния; 102 | КоличествоПопытокПодключения = КоличествоПопытокПодключения + 1; 103 | Исключение 104 | Приостановить(2); 105 | КоличествоПопытокПодключения = КоличествоПопытокПодключения + 1; 106 | КонецПопытки; 107 | КонецЦикла; 108 | 109 | КонецПроцедуры 110 | 111 | /////////////////////////////////////////////////////////////////////////////////////////////// 112 | // Методы реализации 113 | /////////////////////////////////////////////////////////////////////////////////////////////// 114 | Функция ВызватьМетодTelegramAPI(ИмяМетода, Параметры, Прокси = Неопределено) 115 | 116 | СтрокаПараметров = ""; 117 | Для Каждого Параметр Из Параметры Цикл 118 | 119 | Шаблон = "%1=%2&"; 120 | СтрокаПараметров = СтрокаПараметров + СтрШаблон(Шаблон, Параметр.Ключ, Параметр.Значение); 121 | 122 | КонецЦикла; 123 | 124 | ИмяСервера = "https://api.telegram.org"; 125 | 126 | URL = "/bot" 127 | + ПараметрыАвторизации.Токен 128 | + "/" + ИмяМетода 129 | + "?" + СтрокаПараметров; 130 | 131 | HTTPЗапрос = Новый HTTPЗапрос(URL); 132 | HTTP = Новый HTTPСоединение(ИмяСервера,443,,,Прокси,3); 133 | ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); 134 | 135 | Возврат ОтветHTTP; 136 | 137 | КонецФункции 138 | 139 | Функция СоздатьДинамическийПрокси(НомерПопытки) 140 | ИмяСервера = "https://www.proxy-list.download"; 141 | URL = "api/v1/get?type=https&anon=transparent&country=NL"; 142 | 143 | HTTPЗапрос = Новый HTTPЗапрос(URL); 144 | HTTP = Новый HTTPСоединение(ИмяСервера); 145 | ОтветHTTP = HTTP.Получить(HTTPЗапрос); 146 | Ответ = ОтветHTTP.ПолучитьТелоКакСтроку(); 147 | 148 | МассивСтрок = Новый Массив(); 149 | Для Н = 1 По СтрЧислоСтрок(Ответ) Цикл 150 | Строка = СтрЗаменить(СтрПолучитьСтроку(Ответ, Н), Символы.ВК, ""); 151 | МассивСтрок.Добавить(СтрРазделить(Строка, ":")); 152 | КонецЦикла; 153 | 154 | ProxyIP = МассивСтрок[НомерПопытки][0]; 155 | ProxyPort = Число(МассивСтрок[НомерПопытки][1]); 156 | Прокси = Новый ИнтернетПрокси(Ложь); 157 | Прокси.Установить("https", ProxyIP, ProxyPort, "", "", Ложь); 158 | Возврат Прокси; 159 | 160 | КонецФункции 161 | 162 | 163 | Процедура ОпределитьТипСообщения(ДополнительныеПараметры, ПараметрыСообщения) 164 | Если ДополнительныеПараметры <> Неопределено 165 | И 166 | ДополнительныеПараметры.Свойство("ТипСообщения") Тогда 167 | ТипСообщения = НРег(ДополнительныеПараметры.ТипСообщения); 168 | Если ТипСообщения = "html" Тогда 169 | ПараметрыСообщения.Вставить("parse_mode", "html"); 170 | ИначеЕсли ТипСообщения = "markdown" или ТипСообщения = "md" Тогда 171 | ПараметрыСообщения.Вставить("parse_mode", "Markdown"); 172 | КонецЕсли; 173 | КонецЕсли; 174 | КонецПроцедуры 175 | 176 | /////////////////////////////////////////////////////////////////////////////////////////////// 177 | 178 | ПараметрыАвторизации = Неопределено; 179 | -------------------------------------------------------------------------------- /src/Транспорты/ТранспортШаблон.os: -------------------------------------------------------------------------------- 1 |  2 | /////////////////////////////////////////////////////////////////////////////////////////////// 3 | // 4 | // Модуль транспорта отправки сообщений <ИмяТранспорта> 5 | // 6 | /////////////////////////////////////////////////////////////////////////////////////////////// 7 | 8 | Перем ПараметрыАвторизации; // хранит структуру авторизации 9 | Перем ОписаниеПротокола; // хранит структуру описания протокола 10 | 11 | /////////////////////////////////////////////////////////////////////////////////////////////// 12 | // Стандартный интерфейс 13 | /////////////////////////////////////////////////////////////////////////////////////////////// 14 | 15 | // Протокол 16 | // Метод возвращает описание используемого протокола 17 | // 18 | // Возвращаемое значение: 19 | // Структура - Описание протокола 20 | // { 21 | // Имя - Строка - Системное имя транспорта 22 | // Представление - Строка - пользовательское представление транспорта 23 | // Описание - Строка - Строковое описание транспорта 24 | // Операторы - Структура - Возможные операторы транспорта 25 | // } 26 | // 27 | Функция Протокол() Экспорт 28 | 29 | Если ОписаниеПротокола = Неопределено Тогда 30 | 31 | ОписаниеПротокола = Новый Структура("Имя, Представление, Описание, Операторы", "Шаблон", "Шаблон", "Шаблонный протокол", Неопределено); 32 | 33 | КонецЕсли; 34 | 35 | Возврат ОписаниеПротокола; 36 | 37 | КонецФункции // Протокол() 38 | 39 | // Инициализация 40 | // Инициализация параметров транспорта 41 | // 42 | // Параметры: 43 | // ПараметрыИнициализации - Структура - набор параметров инициализации 44 | // 45 | Процедура Инициализация(ПараметрыИнициализации) Экспорт 46 | 47 | Если ПараметрыИнициализации = Неопределено Тогда 48 | 49 | Сообщить(СтрШаблон("Для инициализации транспорта %1 необходимо передавать в параметрах: ", Протокол().Представление)); 50 | Сообщить(" - Параметр1"); 51 | Сообщить(" - Параметр2"); 52 | 53 | ВызватьИсключение СтрШаблон("Инициализация транспорта %1 невыполнена", Протокол().Представление); 54 | 55 | КонецЕсли; 56 | 57 | ВызватьИсключение СтрШаблон("Отсутствует реализация иницициализации транспорта %1", Протокол().Представление); 58 | 59 | КонецПроцедуры // Инициализация() 60 | 61 | // ОтправитьСообщение 62 | // Метод отправки сообщения 63 | // 64 | // Параметры: 65 | // Адресат - Строка - Адресат сообщения 66 | // Сообщение - Строка - Текст отправляемого сообщения 67 | // ДополнительныеПараметры - Структура - Набор дополнительных параметров 68 | // 69 | Процедура ОтправитьСообщение(Адресат, Сообщение, ДополнительныеПараметры = Неопределено) Экспорт 70 | 71 | Если ПараметрыАвторизации = Неопределено Тогда 72 | 73 | ВызватьИсключение СтрШаблон("Для отправки сообщения необходимо выполнить инициализацию транспорта %1", Протокол().Представление); 74 | 75 | КонецЕсли; 76 | 77 | ВызватьИсключение СтрШаблон("Отсутствует реализация отправки сообщения для транспорта %1", Протокол().Представление); 78 | 79 | КонецПроцедуры // ОтправитьСообщение() 80 | 81 | /////////////////////////////////////////////////////////////////////////////////////////////// 82 | 83 | ПараметрыАвторизации = Неопределено; 84 | -------------------------------------------------------------------------------- /tests/gitter-test.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать "../" 3 | 4 | Перем юТест; 5 | Перем Мессенджер; 6 | 7 | Перем ИмяКомнаты; 8 | Перем IdКомнаты; 9 | Перем ТокенПользователя; 10 | Перем ОшибкаВходящихПараметров; 11 | 12 | Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт 13 | 14 | // Мока нет, или задавть параметры тут или передвать через переменные окружения 15 | // Переменные окружения: 16 | // GitterToken 17 | // GitterRoomId 18 | // GitterRoomName 19 | 20 | ТокенПользователя = ""; // https://developer.gitter.im/apps 21 | IdКомнаты = ""; // https://api.gitter.im/v1/rooms?access_token=ТокенПользователя 22 | ИмяКомнаты = ""; // для комнаты https://gitter.im/asosnoviy/Lobby имя будет asosnoviy/Lobby 23 | 24 | ЗаполнитьПарметрыИзПеременныхОкружения(); 25 | 26 | 27 | юТест = ЮнитТестирование; 28 | 29 | ВсеТесты = Новый Массив; 30 | 31 | ВсеТесты.Добавить("ТестДолжен_ПроверитьАвторизацию"); 32 | 33 | Если ЗначениеЗаполнено(ТокенПользователя) И 34 | ЗначениеЗаполнено(IdКомнаты) И 35 | ЗначениеЗаполнено(ИмяКомнаты) Тогда 36 | 37 | ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучениеСпискаКомнат"); 38 | ВсеТесты.Добавить("ТестДолжен_ОтправитьСообщениеВGitterПоidКомнаты"); 39 | ВсеТесты.Добавить("ТестДолжен_ОтправитьСообщениеВGitterПоИмениКомнаты"); 40 | ВсеТесты.Добавить("ТестДолжен_НеНайтиКомнатуПоИмениКомнаты"); 41 | ВсеТесты.Добавить("ТестДолжен_ОтправитьСообщениеМетодомОтправитьСообщение"); 42 | ВсеТесты.Добавить("ТестДолжен_ПроверитьОтправкуМногострочногоСообщения"); 43 | 44 | Иначе 45 | 46 | Сообщить("Не заполненны входящие параметры"); 47 | Сообщить("Тест ТестДолжен_ПроверитьПолучениеСпискаКомнат будет пропущен"); 48 | Сообщить("Тест ТестДолжен_ОтправитьСообщениеВGitterПоidКомнаты будет пропущен"); 49 | Сообщить("Тест ТестДолжен_НеНайтиКомнатуПоИмениКомнаты будет пропущен"); 50 | Сообщить("Тест ТестДолжен_ОтправитьСообщениеВGitterПоИмениКомнаты будет пропущен"); 51 | Сообщить("Тест ТестДолжен_ОтправитьСообщениеМетодомОтправитьСообщение будет пропущен"); 52 | Сообщить("Тест ТестДолжен_ПроверитьОтправкуМногострочногоСообщения будет пропущен"); 53 | 54 | КонецЕсли; 55 | 56 | Возврат ВсеТесты; 57 | 58 | КонецФункции 59 | 60 | Процедура ПередЗапускомТеста() Экспорт 61 | 62 | Мессенджер = Новый Мессенджер_v1(); 63 | 64 | КонецПроцедуры 65 | 66 | Процедура ПослеЗапускаТеста() Экспорт 67 | 68 | Мессенджер = Неопределено; 69 | 70 | КонецПроцедуры 71 | 72 | Процедура ТестДолжен_ПроверитьАвторизацию() Экспорт 73 | 74 | НеверныйТокенПользователя = "123"; 75 | 76 | Попытка 77 | Мессенджер.ИнициализацияGitter(НеверныйТокенПользователя); 78 | Исключение 79 | Ожидаем.Что(ОписаниеОшибки(), "Должен Упасть С Ошибкой авторизации").Содержит("Ошибка авторизации"); 80 | КонецПопытки 81 | 82 | КонецПроцедуры 83 | 84 | Процедура ТестДолжен_ПроверитьПолучениеСпискаКомнат() Экспорт 85 | 86 | Мессенджер.ИнициализацияGitter(ТокенПользователя); 87 | 88 | Ожидаем.Что(Мессенджер.ДоступныеПротоколы().Количество(), "Количество доступных протоколов 3").Равно(3); 89 | Ожидаем.Что(Мессенджер.АвторизацияGitter.Токен, "Токен должен инициализироватся").Равно(ТокенПользователя) ; 90 | Ожидаем.Что(Мессенджер.АвторизацияGitter.Комнаты.Количество(), "Комнаты Должны быть").Больше(0) ; 91 | Ожидаем.Что(Мессенджер.АвторизацияGitter.Комнаты.Получить(ИмяКомнаты), "Комнаты Должны совпадать с id").Равно(IdКомнаты) ; 92 | 93 | КонецПроцедуры 94 | 95 | Процедура ТестДолжен_ОтправитьСообщениеВGitterПоidКомнаты() Экспорт 96 | 97 | Мессенджер.ИнициализацияGitter(ТокенПользователя); 98 | 99 | Мессенджер.ОтправитьСообщениеВКомнатуGitter(IdКомнаты,"Тестовое сообщение по IdКомнаты " + Строка(ТекущаяДата())); 100 | 101 | КонецПроцедуры 102 | 103 | Процедура ТестДолжен_ОтправитьСообщениеВGitterПоИмениКомнаты() Экспорт 104 | 105 | Мессенджер.ИнициализацияGitter(ТокенПользователя); 106 | Мессенджер.ОтправитьСообщениеGitter(ИмяКомнаты, "Тестовое сообщение по имени комнаты " + Строка(ТекущаяДата())); 107 | 108 | КонецПроцедуры 109 | 110 | Процедура ТестДолжен_НеНайтиКомнатуПоИмениКомнаты() Экспорт 111 | 112 | НевернаяИмяКомнаты = "КомнатаКоторойНет"; 113 | 114 | Мессенджер.ИнициализацияGitter(ТокенПользователя); 115 | 116 | Попытка 117 | Мессенджер.ОтправитьСообщениеGitter(НевернаяИмяКомнаты, "Тестовое сообщение по имени комнаты " + Строка(ТекущаяДата())); 118 | Исключение 119 | Ожидаем.Что(ОписаниеОшибки(), "Должен Упасть С Ошибкой комната не найдена").Содержит("Комната не найдена в списке"); 120 | КонецПопытки 121 | 122 | КонецПроцедуры 123 | 124 | Процедура ТестДолжен_ОтправитьСообщениеМетодомОтправитьСообщение() Экспорт 125 | 126 | Мессенджер.ИнициализацияGitter(ТокенПользователя); 127 | Мессенджер.ОтправитьСообщение(Мессенджер.ДоступныеПротоколы().gitter, ИмяКомнаты, "Тестовое сообщение Методом отправить сообщение " + Строка(ТекущаяДата())); 128 | 129 | КонецПроцедуры 130 | 131 | Процедура ТестДолжен_ПроверитьОтправкуМногострочногоСообщения() Экспорт 132 | 133 | Мессенджер.ИнициализацияGitter(ТокенПользователя); 134 | 135 | Сообщение = СтрШаблон( 136 | "Многострочная строка сейчас будет ПС %1 Это уже вторая строка, сейчас будет ВК %2А это урл: %3 Дата:%4", 137 | Символы.ПС, 138 | Символы.ВК, 139 | "http://git", 140 | Строка(ТекущаяДата()) 141 | ); 142 | 143 | Мессенджер.ОтправитьСообщение(Мессенджер.ДоступныеПротоколы().gitter, ИмяКомнаты, Сообщение); 144 | 145 | КонецПроцедуры 146 | 147 | Процедура ЗаполнитьПарметрыИзПеременныхОкружения() 148 | 149 | 150 | СИ = Новый СистемнаяИнформация(); 151 | ПеременныеСреды = СИ.ПеременныеСреды(); 152 | 153 | Если НЕ ЗначениеЗаполнено(ТокенПользователя) И НЕ ПеременныеСреды["GitterToken"] = Неопределено Тогда 154 | ТокенПользователя = ПеременныеСреды["GitterToken"]; 155 | КонецЕсли; 156 | 157 | Если НЕ ЗначениеЗаполнено(IdКомнаты) И НЕ ПеременныеСреды["GitterRoomId"] = Неопределено Тогда 158 | IdКомнаты = ПеременныеСреды["GitterRoomId"]; 159 | КонецЕсли; 160 | 161 | Если НЕ ЗначениеЗаполнено(ИмяКомнаты) И НЕ ПеременныеСреды["GitterRoomName"] = Неопределено Тогда 162 | ИмяКомнаты = ПеременныеСреды["GitterRoomName"]; 163 | КонецЕсли; 164 | 165 | КонецПроцедуры 166 | --------------------------------------------------------------------------------