├── .gitlab-ci.yml
├── README.md
├── lib.config
├── opm-metadata.xml
├── packagedef
└── src
├── ТелеграмАПИ.os
└── ТелеграмБот.os
/.gitlab-ci.yml:
--------------------------------------------------------------------------------
1 | image: evilbeaver/onescript
2 |
3 | stages:
4 | - build
5 | - deploy
6 |
7 | build:
8 | stage: build
9 | script:
10 | - grep '%ver' -P -R -I -l packagedef | xargs sed -i 's/%ver/'$CI_COMMIT_REF_NAME'/g'
11 | - mkdir ./build
12 | - opm build . -mf packagedef -out ./build
13 | artifacts:
14 | name: "$CI_PROJECT_NAME-$CI_COMMIT_REF_NAME"
15 | paths:
16 | - $CI_PROJECT_NAME-$CI_COMMIT_REF_NAME.ospx
17 | only:
18 | - tags
19 |
20 | deploy to hub.oscript:
21 | stage: deploy
22 | variables:
23 | GIT_STRATEGY: none
24 | script:
25 | - cd ./build
26 | - opm push --token $GITHUB_TOKEN --file $CI_PROJECT_NAME-$CI_COMMIT_REF_NAME --channel stable
27 | artifacts:
28 | when: on_failure
29 | paths:
30 | - .
31 | expire_in: 1 day
32 | only:
33 | - tags
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # telegrambot
2 | Библиотека для взаимодействия с [Telegram Bot API](https://core.telegram.org/bots/api)
3 |
4 | ### Установка telegrambot
5 | ----
6 | Первый способ - установить через opm:
7 |
8 | ```
9 | $ opm install telegrambot
10 | ```
11 |
12 | Второй способ - скачать нужный релиз (https://github.com/pallid/telegrambot/releasess) и установить вручную:
13 |
14 | ```
15 | $ opm install -f "path/to/file.ospx"
16 | ```
17 |
18 | где path/to/file.ospx - путь к файлу реализа пакета для onescript.
19 |
20 | ### Пример
21 |
22 | [Пример](https://github.com/pallid/example-telegrambot) реализации telegram bot на oscript-web
23 |
24 | [Демо бот](https://t.me/oswebbot?start)
25 |
26 | Библиотека к вашему проекту подключается с помощью директивы #Использовать telegrambot. После этого в области видимости скрипта будет доступен класс ТелеграмБот и модуль ТелеграмАПИ:
27 |
28 | ```
29 |
30 | Бот = Новый ТелеграмБот;
31 | Бот.УстановитьТокенАвторизации("ТВОЙ_ТОКЕН_БОТА");
32 | Бот.УстановитьВебхук("ТВОЙ_АДРЕС_ДЛЯ_ХУКОВ");
33 |
34 | ///
35 |
36 | ОбъектЗапрос = ПарсерJSON.ПрочитатьJSON(ТекстТелаЗапроса);
37 |
38 | Если ОбъектЗапрос["message"] <> Неопределено Тогда
39 |
40 | ТекстСообщения = ОбъектЗапрос["message"]["text"];
41 | ПолучательИД = ОбъектЗапрос["message"]["chat"]["id"];
42 |
43 | Если ТекстСообщения = "/start" тогда
44 |
45 | ТекстСообщения = "Привет, в низу меню для навигации";
46 | Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения);
47 | ТелеграмАПИ.ДобавитьКлавиатуру(Сообщение, ГлавноеМеню());
48 | Результат = Бот.Отправить(Сообщение);
49 |
50 | КонецЕсли;
51 |
52 | КонецЕсли;
53 |
54 | ///
55 |
56 | Ответ = Новый РезультатДействияСодержимое();
57 | Ответ.КодСостояния = 200;
58 | Ответ.ТипСодержимого = "application/json;charset=UTF-8";
59 | Ответ.Содержимое = Результат["ok"];
60 |
61 | Возврат Ответ;
62 |
63 | ```
64 |
65 | ```
66 | Функция ГлавноеМеню()
67 |
68 | КомандаКаталог = ТелеграмАПИ.НоваяКнопка("Каталог");
69 | КомандаКорзина = ТелеграмАПИ.НоваяКнопка("Корзина");
70 |
71 | ПервыйРяд = ТелеграмАПИ.ПолучитьРядКнопок(КомандаКаталог, КомандаКорзина);
72 |
73 | КомандаНашТелегон = ТелеграмАПИ.НоваяКнопка("Наш телефон");
74 | КомандаЛичныйКабинет = ТелеграмАПИ.НоваяКнопка("Личный кабинет");
75 |
76 | ВторойРяд = ТелеграмАПИ.ПолучитьРядКнопок(КомандаНашТелегон, КомандаЛичныйКабинет);
77 |
78 | МассивРядов = ТелеграмАПИ.ПолучитьМассивРядовДляКлавиатуры(ПервыйРяд, ВторойРяд);
79 |
80 | Возврат ТелеграмАПИ.ПолучитьКлавиатуру(МассивРядов);
81 |
82 | КонецФункции
83 |
84 |
85 | ```
86 |
87 | На текущий момент реализовано получение данных только через WebHooks.
88 |
89 | Разработка ведется в репозитории [oscript-library/telegrambot](https://github.com/oscript-library/telegrambot) по Git Flow.
90 | Ждем ваши PR и Issues.
91 |
92 |
93 |
94 | ### Контрибьюторы:
95 |
96 | |
|
|
97 | |:--------------------------------------------------:|:--------------------------------------------------:|
98 | | [Василий Попов](https://github.com/pallid) | [Карим Шакиров](https://github.com/k2589) |
99 | |Создатель | Мейнтейнер |
--------------------------------------------------------------------------------
/lib.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/opm-metadata.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | telegrambot
4 | 0.0.6
5 |
6 |
7 |
--------------------------------------------------------------------------------
/packagedef:
--------------------------------------------------------------------------------
1 | Описание.Имя("telegrambot")
2 | .Версия("0.0.6")
3 | .ЗависитОт("json")
4 | .ЗависитОт("logos")
5 | .ВключитьФайл("src")
6 | .ВключитьФайл("lib.config")
7 | .ВключитьФайл("opm-metadata.xml")
8 | .ВключитьФайл("packagedef");
--------------------------------------------------------------------------------
/src/ТелеграмАПИ.os:
--------------------------------------------------------------------------------
1 | #Использовать json
2 |
3 | Функция НовоеСообщение(ПолучательИД, ТекстСообщения) Экспорт
4 |
5 | Сообщение = Новый Соответствие;
6 | Сообщение.Вставить("chat_id", ПолучательИД);
7 | Сообщение.Вставить("text", ТекстСообщения);
8 |
9 | Возврат Сообщение;
10 |
11 | КонецФункции
12 |
13 | Функция НоваяКнопка(ТекстКнопки) Экспорт
14 |
15 | Соответствие = Новый Соответствие;
16 | Соответствие.Вставить("text", ТекстКнопки);
17 |
18 | Возврат Соответствие;
19 |
20 | КонецФункции
21 |
22 | Функция НоваяКнопкаОтправитьКонтакт(ТекстКнопки) Экспорт
23 |
24 | Соответствие = НоваяКнопка(ТекстКнопки) ;
25 | Соответствие.Вставить("request_contact", Истина);
26 |
27 | Возврат Соответствие;
28 |
29 | КонецФункции
30 |
31 | Функция НоваяКнопкаОтправитьМестоположение(ТекстКнопки) Экспорт
32 |
33 | Соответствие = НоваяКнопка(ТекстКнопки) ;
34 | Соответствие.Вставить("request_location", Истина);
35 |
36 | Возврат Соответствие;
37 |
38 | КонецФункции
39 |
40 | // для инлайн клавиатуры
41 | Функция НоваяУРЛКнопка(ТекстКнопки, УРЛ) Экспорт
42 |
43 | Соответствие = НоваяКнопка(ТекстКнопки);
44 | Соответствие.Вставить("url", УРЛ);
45 |
46 | Возврат Соответствие;
47 |
48 | КонецФункции
49 |
50 | // для инлайн клавиатуры
51 | Функция НоваяКоллбекКнопка(ТекстКнопки, Коллбек) Экспорт
52 |
53 | Соответствие = НоваяКнопка(ТекстКнопки);
54 | Соответствие.Вставить("callback_data", Коллбек);
55 |
56 | Возврат Соответствие;
57 |
58 | КонецФункции
59 |
60 | Функция ПолучитьРядКнопок(Кнопка1, Кнопка2 = Неопределено, Кнопка3 = Неопределено, Кнопка4 = Неопределено, Кнопка5 = Неопределено) Экспорт
61 |
62 | Массив = Новый Массив;
63 |
64 | Массив.Добавить(Кнопка1);
65 |
66 | Если Кнопка2 <> Неопределено Тогда
67 | Массив.Добавить(Кнопка2);
68 | КонецЕсли;
69 |
70 | Если Кнопка3 <> Неопределено Тогда
71 | Массив.Добавить(Кнопка3);
72 | КонецЕсли;
73 |
74 | Если Кнопка4 <> Неопределено Тогда
75 | Массив.Добавить(Кнопка4);
76 | КонецЕсли;
77 |
78 | Если Кнопка5 <> Неопределено Тогда
79 | Массив.Добавить(Кнопка5);
80 | КонецЕсли;
81 |
82 | Возврат Массив;
83 |
84 | КонецФункции
85 |
86 | Функция ПолучитьМассивРядовДляКлавиатуры(Ряд1, Ряд2 = Неопределено, Ряд3 = Неопределено, Ряд4 = Неопределено, Ряд5 = Неопределено) Экспорт
87 |
88 | Массив = Новый Массив;
89 |
90 | Массив.Добавить(Ряд1);
91 |
92 | Если Ряд2 <> Неопределено Тогда
93 | Массив.Добавить(Ряд2);
94 | КонецЕсли;
95 |
96 | Если Ряд3 <> Неопределено Тогда
97 | Массив.Добавить(Ряд3);
98 | КонецЕсли;
99 |
100 | Если Ряд4 <> Неопределено Тогда
101 | Массив.Добавить(Ряд4);
102 | КонецЕсли;
103 |
104 | Если Ряд5 <> Неопределено Тогда
105 | Массив.Добавить(Ряд5);
106 | КонецЕсли;
107 |
108 | Возврат Массив;
109 |
110 | КонецФункции
111 |
112 | Функция ПолучитьКлавиатуру(МассивРядов) Экспорт
113 |
114 | Клавиатура = Новый Соответствие;
115 | Клавиатура.Вставить("keyboard", МассивРядов);
116 | Клавиатура.Вставить("resize_keyboard", Истина);
117 | Клавиатура.Вставить("selective", Истина);
118 |
119 | Возврат Клавиатура;
120 |
121 | КонецФункции
122 |
123 | Функция ПолучитьИнлайнКлавиатуру(МассивРядов) Экспорт
124 |
125 | Клавиатура = Новый Соответствие;
126 | Клавиатура.Вставить("inline_keyboard", МассивРядов);
127 |
128 | Возврат Клавиатура;
129 |
130 | КонецФункции
131 |
132 | Функция УдалитьКлавиатуру(Сообщение) Экспорт
133 |
134 | Удаление = Новый Структура("remove_keyboard", Истина);
135 |
136 | Сообщение.Вставить("reply_markup", Удаление);
137 |
138 | КонецФункции
139 |
140 | Процедура ДобавитьКлавиатуру(Сообщение, Клавиатура) Экспорт
141 |
142 | Сообщение.Вставить("reply_markup", Клавиатура);
143 |
144 | КонецПроцедуры
145 |
146 | Функция НовыйКоллбекОтвет(ПолучательИД, СообщениеИД) Экспорт
147 |
148 | Ответ = Новый Соответствие;
149 | Ответ.Вставить("chat_id", ПолучательИД);
150 | Ответ.Вставить("message_id", СообщениеИД);
151 |
152 | Возврат Ответ;
153 |
154 | КонецФункции
155 |
156 | Функция НовыйКоллбекОтветНаЗапрос(ЗапросИД, Текст, ПоказыватьУведомление = Ложь, УРЛ = Неопределено) Экспорт
157 |
158 | Ответ = Новый Соответствие;
159 | Ответ.Вставить("callback_query_id", ЗапросИД);
160 | Ответ.Вставить("text", Текст);
161 | Ответ.Вставить("show_alert", ПоказыватьУведомление);
162 |
163 | Если УРЛ <> Неопределено Тогда
164 | Ответ.Вставить("url", УРЛ);
165 | КонецЕсли;
166 |
167 | Возврат Ответ;
168 |
169 | КонецФункции
170 |
171 | Функция РедактироватьТекст(Сообщение, ТекстСообщения) Экспорт
172 |
173 | Сообщение.Вставить("text", ТекстСообщения);
174 |
175 | Возврат Сообщение;
176 |
177 | КонецФункции
178 |
179 | Процедура РедактироватьКлавиатуру(Сообщение, Клавиатура) Экспорт
180 |
181 | Сообщение.Вставить("reply_markup", Клавиатура);
182 |
183 | КонецПроцедуры
184 |
185 | Процедура УстановитьФорматСообщения(Сообщение, Формат = "") Экспорт
186 |
187 | Сообщение.Вставить("parse_mode", Формат);
188 |
189 | КонецПроцедуры
190 |
191 | Процедура ОтветитьНаСообщение(Сообщение, message_id) Экспорт
192 |
193 | Сообщение.Вставить("reply_to_message_id", message_id);
194 |
195 | КонецПроцедуры
196 |
197 | Функция НовыйПринудительныйОтвет(Избирательно = Ложь) Экспорт
198 |
199 | СоответствиеВнутреннее = Новый Соответствие;
200 |
201 | СоответствиеВнутреннее.Вставить("force_reply", Истина);
202 | СоответствиеВнутреннее.Вставить("selective", Избирательно);
203 |
204 | Возврат СоответствиеВнутреннее;
205 |
206 | КонецФункции
207 |
208 | // Формирует данные для создания пересылаемого сообщения
209 | // (Метод forwardMessage)
210 | //
211 | // Параметры:
212 | // ПолучательИД - Число - chat_id получателя
213 | // СообщениеИД - Число - id пересылаемого сообщения
214 | // ИзКакогоЧатаИД - Число - id чата из которого пересылается сообщение
215 | // БезОповещения - Булево - Если Истина, то сообщение будет переслано без оповещения получателя
216 | //
217 | // Возвращаемое значение:
218 | // Структура - Структура, готовая для передачи в ПереслатьСообщение() в классе ТелеграмБот
219 | //
220 | Функция НовоеПересылаемоеСообщение(ПолучательИД, СообщениеИД, ИзКакогоЧатаИД, БезОповещения = Ложь) Экспорт
221 |
222 | Сообщение = Новый Соответствие;
223 | Сообщение.Вставить("chat_id", ПолучательИД);
224 | Сообщение.Вставить("message_id", СообщениеИД);
225 | Сообщение.Вставить("from_chat_id", ИзКакогоЧатаИД);
226 | Сообщение.Вставить("disable_notification", БезОповещения);
227 |
228 | Возврат Сообщение;
229 |
230 | КонецФункции
231 |
232 | // Формирует данные для создания удаляемого сообщения
233 | // (Метод deleteMessage)
234 | //
235 | // Параметры:
236 | // ЧатИД - Число - id чата, где находится сообщение
237 | // СообщениеИД - Число - id удаляемого сообщения
238 | //
239 | // Возвращаемое значение:
240 | // Структура - для передачи в УдалитьСообщение() в классе ТелеграмБот
241 | //
242 | Функция УдаляемоеСообщение(ЧатИД, СообщениеИД) Экспорт
243 |
244 | Структура = Новый Структура;
245 | Структура.Вставить("chat_id", ЧатИД);
246 | Структура.Вставить("message_id", СообщениеИД);
247 |
248 | Возврат Структура;
249 |
250 | КонецФункции
251 |
252 | // Создает каркас для нового опроса (не добавляет варианты ответа!)
253 | // (Метод sendPoll)
254 | //
255 | // Параметры:
256 | // ПолучательИД - Число - chat_id получателя
257 | // ТекстВопроса - Строка - Текст вопроса, длина 1-255 символов
258 | // Анонимный - Булево - Если Ложь, то показывается какой вариант ответа выбрал участник опроса
259 | // ВозможенМножественныйОтвет - Булево - Если Истина, то участник может проголосовать за несколько вариантов
260 | // БезОповещения - Булево - Если Истина, то сообщение будет переслано без оповещения получателя
261 | //
262 | // Возвращаемое значение:
263 | // Структура - Структура, которую дополнительно нужно передать в функцию ДобавитьВариантОтветаНаОпрос()
264 | //
265 | Функция НовыйОпрос(ПолучательИД, ТекстВопроса, Анонимный = Истина, ВозможенМножественныйОтвет = Ложь, БезОповещения = Ложь) Экспорт
266 |
267 | Опрос = Новый Соответствие;
268 | Опрос.Вставить("chat_id", ПолучательИД);
269 | Опрос.Вставить("question", ТекстВопроса);
270 | Опрос.Вставить("is_anonymous", Анонимный);
271 | Опрос.Вставить("allows_multiple_answers", ВозможенМножественныйОтвет);
272 | Опрос.Вставить("disable_notification", БезОповещения);
273 | МассивВариантовОтвета = Новый Массив();
274 | Опрос.Вставить("options", МассивВариантовОтвета);
275 |
276 | Возврат Опрос;
277 |
278 | КонецФункции
279 |
280 | // Создает каркас для нового опроса квиз (не добавляет варианты ответа!)
281 | // (Метод sendPoll)
282 | //
283 | // Параметры:
284 | // ПолучательИД - Число - chat_id получателя
285 | // ТекстВопроса - Строка - Текст вопроса, длинна 1-255 символов
286 | // Анонимный - Булево - Если Ложь, то показывается какой вариант ответа выбрал участник опроса
287 | // БезОповещения - Булево - Если Истина, то сообщение будет переслано без оповещения получателя
288 | //
289 | // Возвращаемое значение:
290 | // Структура - Структура, которую дополнительно нужно передать в функцию ДобавитьВариантОтветаНаОпрос(),
291 | // по умолчанию признак правильного ответа будет являться первый добавленный ответ,
292 | // в случае когда требуется явное указание правильного ответа Структуру необходимо передать
293 | // дополнительно в функцию ДобавитьПравильныйОтветКвиз()
294 | //
295 | Функция НовыйОпросКвиз(ПолучательИД, ТекстВопроса, Анонимный = Истина, БезОповещения = Ложь) Экспорт
296 |
297 | Опрос = НовыйОпрос(ПолучательИД, ТекстВопроса, Анонимный, , БезОповещения);
298 | Опрос.Вставить("type", "quiz");
299 |
300 | Возврат Опрос;
301 |
302 | КонецФункции
303 |
304 | // Добавляет варианты ответа на опрос
305 | // Необходимо поочередно добавить от 2 до 10 вариантов
306 | // (Метод sendPoll)
307 | //
308 | // Параметры:
309 | // Опрос - Структура - То, что вернулось от НовыйОпрос()
310 | // ВариантОтвета - Строка - Текст варианта ответа, длина 1-100 символов
311 | //
312 | // Возвращаемое значение:
313 | // Структура - Структура, готовая для передачи в ОтправитьОпрос() в классе ТелеграмБот
314 | //
315 | Функция ДобавитьВариантОтветаНаОпрос(Опрос, ВариантОтвета) Экспорт
316 |
317 | Опрос["options"].Добавить(ВариантОтвета);
318 |
319 | Возврат Опрос;
320 |
321 | КонецФункции
322 |
323 | // Добавляет правильный вариант ответ на опрос
324 | // Правильный ответ может быть только один
325 | // (Метод sendPoll)
326 | //
327 | // Параметры:
328 | // Опрос - Структура - То, что вернулось от НовыйОпрос()
329 | // ПравильныйОтвет - Строка - Текст правильного ответа, длина 1-100 символов
330 | //
331 | // Возвращаемое значение:
332 | // Структура - Структура, готовая для передачи в ОтправитьОпрос() в классе ТелеграмБот
333 | //
334 | Функция ДобавитьПравильныйОтветКвиз(Опрос, ПравильныйОтвет) Экспорт
335 |
336 | МассивВариантовОтвета = Опрос["options"];
337 |
338 | МассивВариантовОтвета.Добавить(ПравильныйОтвет);
339 | Опрос.Вставить("correct_option_id", МассивВариантовОтвета.ВГраница());
340 |
341 | Возврат Опрос;
342 |
343 | КонецФункции
344 |
345 | // Команда бота (BotCommand), элемент массива устанавливаемых команд
346 | // (Метод setMyCommand)
347 | //
348 | // Параметры:
349 | // Имя - Строка - Имя команды, длина 1-32 символа
350 | // Описание - Строка - Описание команды, длина 3-256 символов
351 | //
352 | // Возвращаемое значение:
353 | // Структура - команда, добавляемая в массив команд
354 | //
355 | Функция КомандаБота(Имя, Описание) Экспорт
356 |
357 | Структура = Новый Структура;
358 | Структура.Вставить("command", Имя);
359 | Структура.Вставить("description", Описание);
360 |
361 | Возврат Структура;
362 |
363 | КонецФункции
364 |
--------------------------------------------------------------------------------
/src/ТелеграмБот.os:
--------------------------------------------------------------------------------
1 | #Использовать json
2 | #Использовать logos
3 |
4 | Перем ТокенАвторизации Экспорт;
5 | Перем АдресСервиса Экспорт;
6 | Перем ФорматСообщений Экспорт;
7 |
8 | Перем Соединение;
9 | Перем ПарсерJSON;
10 |
11 | Перем Лог;
12 |
13 | Процедура Инициализировать()
14 |
15 | АдресСервиса = "https://api.telegram.org";
16 | Соединение = Новый HTTPСоединение(АдресСервиса, 443);
17 | ПарсерJSON = Новый ПарсерJSON;
18 | ФорматСообщений = "";
19 |
20 | Лог = Логирование.ПолучитьЛог("oscript.lib.telegrambot");
21 |
22 | КонецПроцедуры
23 |
24 | #Область ПрограммныйИнтерфейс
25 |
26 | Процедура УстановитьТокенАвторизации(Токен) Экспорт
27 | ТокенАвторизации = Токен;
28 | КонецПроцедуры
29 |
30 | Процедура УстановитьАдресСервиса(Адрес) Экспорт
31 | АдресСервиса = Адрес;
32 | Соединение = Новый HTTPСоединение(АдресСервиса, 443);
33 | КонецПроцедуры
34 |
35 | Процедура УстановитьФорматСообщений(Формат) Экспорт
36 | ФорматСообщений = Формат;
37 | КонецПроцедуры
38 |
39 | Функция УстановитьВебхук(Адрес) Экспорт
40 |
41 | https = "https://";
42 | Если Сред(Адрес, 1, 8) <> https Тогда
43 | Адрес = https + Адрес;
44 | КонецЕсли;
45 |
46 | Возврат СделатьХук(Адрес);
47 |
48 | КонецФункции
49 |
50 | Функция УбратьВебхук() Экспорт
51 |
52 | Возврат СделатьХук("");
53 |
54 | КонецФункции
55 |
56 | Функция ОтправитьДанные(Сообщение, Команда) Экспорт
57 |
58 | Ресурс = "/bot{TOKEN}/" + Команда;
59 | Запрос = Новый HTTPЗапрос(ЗаменитьТокен(Ресурс));
60 | Запрос.Заголовки = ПолучитьЗаголовки();
61 |
62 | ТекстТелаЗапроса = ПарсерJSON.ЗаписатьJSON(Сообщение);
63 | КодированнаяСтрока = РаскодироватьСтроку(ТекстТелаЗапроса, СпособКодированияСтроки.КодировкаURL);
64 | Запрос.УстановитьТелоИзСтроки(КодированнаяСтрока);
65 |
66 | Лог.Отладка(КодированнаяСтрока);
67 |
68 | Попытка
69 | Ответ = Соединение.ОтправитьДляОбработки(Запрос);
70 | Исключение
71 | Лог.Ошибка("Не удалось отправить для обработки" + Ресурс);
72 | Возврат Неопределено;
73 | КонецПопытки;
74 |
75 | Возврат ПрочитатьОтветЗапроса(Ответ);
76 |
77 | КонецФункции
78 |
79 | Функция Отправить(Сообщение) Экспорт
80 |
81 | Команда = "sendMessage";
82 | Возврат ОтправитьДанные(Сообщение, Команда);
83 |
84 | КонецФункции
85 |
86 | Функция ОтредактироватьСообщение(Сообщение) Экспорт
87 |
88 | Команда = "editMessageText";
89 | Возврат ОтправитьДанные(Сообщение, Команда);
90 |
91 | КонецФункции
92 |
93 | Функция ОтредактироватьКлавиатуру(Сообщение) Экспорт
94 |
95 | Команда = "editMessageReplyMarkup";
96 | Возврат ОтправитьДанные(Сообщение, Команда);
97 |
98 | КонецФункции
99 |
100 | Функция ОправитьОтветНаКоллбекЗапрос(Сообщение) Экспорт
101 |
102 | Команда = "answerCallbackQuery";
103 | Возврат ОтправитьДанные(Сообщение, Команда);
104 |
105 | КонецФункции
106 |
107 | Функция ПереслатьСообщение(Сообщение) Экспорт
108 |
109 | Команда = "forwardMessage";
110 | Возврат ОтправитьДанные(Сообщение, Команда);
111 |
112 | КонецФункции
113 |
114 | Функция СкопироватьСообщение(Сообщение) Экспорт
115 |
116 | Команда = "copyMessage";
117 | Возврат ОтправитьДанные(Сообщение, Команда);
118 |
119 | КонецФункции
120 |
121 | Функция УдалитьСообщение(Сообщение) Экспорт
122 |
123 | Команда = "deleteMessage";
124 | Возврат ОтправитьДанные(Сообщение, Команда);
125 |
126 | КонецФункции
127 |
128 | Функция ОтправитьОпрос(Сообщение) Экспорт
129 |
130 | Команда = "sendPoll";
131 | Возврат ОтправитьДанные(Сообщение, Команда);
132 |
133 | КонецФункции
134 |
135 | Функция УстановитьКоманды(МассивКомандБота) Экспорт
136 |
137 | Параметры = Новый Структура("commands", МассивКомандБота);
138 |
139 | Команда = "setMyCommands";
140 |
141 | Возврат ОтправитьДанные(Параметры, Команда);
142 |
143 | КонецФункции
144 |
145 | Функция ЗакрепитьСообщение(ЧатИД, СообщениеИД, ОтключитьОповещение=Ложь) Экспорт
146 |
147 | Сообщение = Новый Структура();
148 | Сообщение.Вставить("chat_id", ЧатИД);
149 | Сообщение.Вставить("message_id", СообщениеИД);
150 | Сообщение.Вставить("disable_notification", ОтключитьОповещение);
151 |
152 | Команда = "pinChatMessage";
153 | Возврат ОтправитьДанные(Сообщение, Команда);
154 |
155 | КонецФункции
156 |
157 | Функция ОткрепитьСообщение(ЧатИД, СообщениеИД=Неопределено) Экспорт
158 |
159 | Сообщение = Новый Структура("chat_id", ЧатИД);
160 | Если СообщениеИД <> Неопределено Тогда
161 | Сообщение.Вставить("message_id", СообщениеИД);
162 | КонецЕсли;
163 |
164 | Команда = "unpinChatMessage";
165 |
166 | Возврат ОтправитьДанные(Сообщение, Команда);
167 |
168 | КонецФункции
169 |
170 | Функция ОткрепитьВсеСообщения(ЧатИД) Экспорт
171 |
172 | Сообщение = Новый Структура("chat_id", ЧатИД);
173 |
174 | Команда = "unpinAllChatMessages";
175 |
176 | Возврат ОтправитьДанные(Сообщение, Команда);
177 |
178 | КонецФункции
179 |
180 | #КонецОбласти
181 |
182 | #Область СлужебныеПроцедурыИФункции
183 |
184 | Функция ПрочитатьОтветЗапроса(Знач Ответ)
185 |
186 | ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
187 | Если ТелоОтвета = Неопределено Тогда
188 | ТелоОтвета = "";
189 | КонецЕсли;
190 |
191 | Результат = Неопределено;
192 | Если ЗначениеЗаполнено(ТелоОтвета) Тогда
193 | Результат = ПарсерJSON.ПрочитатьJSON(ТелоОтвета);
194 | КонецЕсли;
195 |
196 | Если Результат["ok"] Тогда
197 | Лог.Отладка("Код состояния: %1", Ответ.КодСостояния);
198 | Лог.Отладка("Тело ответа:
199 | |%1", ТелоОтвета);
200 | Иначе
201 | Лог.Ошибка("Код состояния: %1", Ответ.КодСостояния);
202 | Лог.Ошибка("Описание: %1", Результат["description"]);
203 | КонецЕсли;
204 |
205 | Возврат Результат;
206 |
207 | КонецФункции
208 |
209 | Функция ПолучитьЗаголовки()
210 |
211 | Заголовки = Новый Соответствие;
212 | Заголовки.Вставить("Content-type","application/json");
213 |
214 | Возврат Заголовки;
215 |
216 | КонецФункции
217 |
218 | Функция СделатьХук(Суффикс)
219 |
220 | Команда = "setWebhook";
221 | Ресурс = "/bot{TOKEN}/" + Команда + "?url=" + Суффикс;
222 | Запрос = Новый HTTPЗапрос(ЗаменитьТокен(Ресурс));
223 |
224 | Попытка
225 | Ответ = Соединение.Получить(Запрос);
226 | Исключение
227 | Лог.Ошибка("Не удалось выполнить запрос" + Ресурс);
228 | Возврат Неопределено;
229 | КонецПопытки;
230 |
231 | Возврат ПрочитатьОтветЗапроса(Ответ);
232 |
233 | КонецФункции
234 |
235 | Функция ОБоте() Экспорт
236 |
237 | Команда = "getMe";
238 |
239 | Возврат ОтправитьДанные(Неопределено, Команда);
240 |
241 | КонецФункции
242 |
243 | Функция ПолучитьОписаниеФайла(file_id) Экспорт
244 |
245 | Команда = "getFile";
246 | Параметры = Новый Структура("file_id", file_id);
247 |
248 | Возврат ОтправитьДанные(Параметры, Команда);
249 |
250 | КонецФункции
251 |
252 | // Передавать или ID, или готовый путь
253 | Функция ПолучитьФайл(file_id="",file_path="") Экспорт
254 |
255 | Если НЕ ЗначениеЗаполнено(file_path) Тогда
256 | ОписаниеФайла = ПолучитьОписаниеФайла(file_id);
257 | file_path = ОписаниеФайла["result"]["file_path"];
258 | КонецЕсли;
259 |
260 | // https://api.telegram.org/file/bot/
261 | Ресурс = "/file/bot{TOKEN}/" + file_path;
262 |
263 | Запрос = Новый HTTPЗапрос(ЗаменитьТокен(Ресурс));
264 |
265 | Попытка
266 | Ответ = Соединение.Получить(Запрос);
267 | Исключение
268 | Лог.Ошибка("Не удалось выполнить запрос" + Ресурс);
269 | Возврат Неопределено;
270 | КонецПопытки;
271 |
272 | Возврат Ответ.ПолучитьТелоКакДвоичныеДанные();
273 |
274 | КонецФункции
275 |
276 | Функция ЗаменитьТокен(Шаблон)
277 | Результат = СтрЗаменить(Шаблон, "{TOKEN}", ТокенАвторизации);
278 | Возврат Результат;
279 | КонецФункции
280 |
281 | #КонецОбласти
282 |
283 | ///////////////////////////////////////////////////////////////////////////////
284 | // ТОЧКА ВХОДА
285 | ///////////////////////////////////////////////////////////////////////////////
286 |
287 | Инициализировать();
--------------------------------------------------------------------------------