├── .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 | | Andreas Mehlsen | Карим Шакиров| 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 | Инициализировать(); --------------------------------------------------------------------------------