├── .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 | [](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 |
--------------------------------------------------------------------------------