// OneScript: ./OInt/core/Modules/OPI_Telegram.os // Lib: Telegram // CLI: telegram // Keywords: telegram // MIT License // Copyright (c) 2023-2025 Anton Tsitavets // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // https://github.com/Bayselonarrend/OpenIntegrations // BSLLS:Typo-off // BSLLS:LatinAndCyrillicSymbolInWord-off // BSLLS:IncorrectLineBreak-off // BSLLS:UnreachableCode-off // BSLLS:CommentedCode-off // BSLLS:UsingServiceTag-off // BSLLS:NumberOfParams-off // BSLLS:LineLength-off // BSLLS:UsingSynchronousCalls-off // BSLLS:MagicNumber-off //@skip-check module-structure-top-region //@skip-check module-structure-method-in-regions //@skip-check wrong-string-literal-content #Область ПрограммныйИнтерфейс #Область ПолучениеДанныхИНастройка // Получить информацию о боте // Выполняет запрос, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д. // // Примечание: // Метод в документации API: [getMe](@core.telegram.org/bots/api#getme) // // Параметры: // Токен - Строка - Токен бота - token // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ПолучитьИнформациюБота(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/getMe"; Ответ = OPI_ЗапросыHTTP.Get(URL); Возврат Ответ; КонецФункции // Получить обновления // Выполняет запрос, возвращающий информацию о событиях бота. Используется при работе в polling режиме // // Примечание: // Метод в документации API: [getUpdates](@core.telegram.org/bots/api#getupdates) // // Параметры: // Токен - Строка - Токен бота - token // Таймаут - Число - Время ожидания новых событий - timeout // Смещение - Число - Смещение в списке получаемых сообщений - offset // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ПолучитьОбновления(Знач Токен, Знач Таймаут = 0, Знач Смещение = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/getUpdates"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("timeout", Таймаут , "Строка", Параметры); OPI_Инструменты.ДобавитьПоле("offset" , Смещение, "Строка", Параметры); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Установить Webhook // Устанавливает URL обработчика событий бота для работы в режиме Webhook // // Примечание: // Метод в документации API: [setWebhook](@core.telegram.org/bots/api#setwebhook) // // Параметры: // Токен - Строка - Токен бота - token // URL - Строка - Адрес обработки запросов от Telegram (с https:) - url // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("url", URL, "Строка", Параметры); URL = "api.telegram.org/bot" + Токен + "/setWebHook"; Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Удалить Webhook // Удаляет URL обработчика событий бота для работы в режиме Webhook // // Примечание: // Метод в документации API: [deleteWebhook](@core.telegram.org/bots/api#deletewebhook) // // Параметры: // Токен - Строка - Токен бота - token // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция УдалитьWebhook(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/deleteWebHook"; Ответ = OPI_ЗапросыHTTP.Get(URL); Возврат Ответ; КонецФункции // Скачать файл // Скачивает файл с серверов Telegram // // Примечание: // Метод в документации API: [getFile](@core.telegram.org/bots/api#getfile) // // Параметры: // Токен - Строка - Токен - token // IDФайла - Строка - ID файла для скачивания - fileid // // Возвращаемое значение: // ДвоичныеДанные - данные файла Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт Result = "result"; OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); Параметры = Новый Структура("file_id", IDФайла); URL = "api.telegram.org/bot" + Токен + "/getFile"; Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Путь = Ответ[Result]["file_path"]; Если Не ЗначениеЗаполнено(Путь) Тогда Загружен = Ложь; Для Н = 1 По 5 Цикл OPI_Инструменты.Пауза(Н); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Путь = Ответ[Result]["file_path"]; Загружен = ЗначениеЗаполнено(Путь); Если Загружен Тогда Прервать; КонецЕсли; КонецЦикла; Если Не Загружен Тогда Возврат Ответ; КонецЕсли; КонецЕсли; URL = "api.telegram.org/file/bot" + Токен + "/" + Путь; Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Обработать данные Telegram Mini App !NOCLI // Обрабатывает данные Telegram Mini App и опредеяет их достоверность // // Параметры: // СтрокаДанных - Строка - query из Telegram.WebApp.initData - datastring // Токен - Строка - Токен бота - token // // Возвращаемое значение: // Соответствие из Строка - Соответствие данных с результатом проверки в поле passed Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(СтрокаДанных); Если СтрНачинаетсяС(СтрокаДанных, "?") Тогда СтрокаДанных = Прав(СтрокаДанных, СтрДлина(СтрокаДанных) - 1); КонецЕсли; КодированныеДанные = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных); СтруктураДанных = Новый Соответствие; Для Каждого ЭлементДанных Из КодированныеДанные Цикл ТекущийКлюч = РаскодироватьСтроку(ЭлементДанных.Ключ, СпособКодированияСтроки.КодировкаURL); ТекущееЗначение = РаскодироватьСтроку(ЭлементДанных.Значение, СпособКодированияСтроки.КодировкаURL); СтруктураДанных.Вставить(ТекущийКлюч, ТекущееЗначение); КонецЦикла; КлючСтрокой = "WebAppData"; Хэш = ""; КлючДвоичные = ПолучитьДвоичныеДанныеИзСтроки(КлючСтрокой); Результат = OPI_Криптография.HMAC(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен), "SHA256"); ТЗнач = Новый ТаблицаЗначений; ТЗнач.Колонки.Добавить("Ключ"); ТЗнач.Колонки.Добавить("Значение"); Для Каждого Данные Из СтруктураДанных Цикл НоваяСтрока = ТЗнач.Добавить(); НоваяСтрока.Ключ = Данные.Ключ; НоваяСтрока.Значение = Данные.Значение; КонецЦикла; ТЗнач.Сортировать("Ключ"); СоответствиеВозврата = Новый Соответствие; DCS = ""; Для Каждого СтрокаТЗ Из ТЗнач Цикл Если СтрокаТЗ.Ключ <> "hash" И СтрокаТЗ.Ключ <> "cookie" Тогда DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС; СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение); Иначе Хэш = СтрокаТЗ.Значение; КонецЕсли; КонецЦикла; DCS = Лев(DCS, СтрДлина(DCS) - 1); Подпись = OPI_Криптография.HMAC(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS), "SHA256"); Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись); Если Финал = вРег(Хэш) Тогда Ответ = Истина; Иначе Ответ = Ложь; КонецЕсли; СоответствиеВозврата.Вставить("passed", Ответ); Возврат СоответствиеВозврата; КонецФункции #КонецОбласти #Область ОтправкаДанных // Отправить текстовое сообщение // Отправляет текстовое сообщение в чат или канал // // Примечание: // Метод в документации API: [sendMessage](@core.telegram.org/bots/api#sendmessage) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Клавиатура - Строка, Структура Из КлючИЗначение - Клавиатура. См. СформироватьКлавиатуруПоМассивуКнопок - keyboard // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // IDВходящего - Строка, Число - ID сообщения на которое надо ответить - reply // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьТекстовоеСообщение(Знач Токен , Знач IDЧата , Знач Текст , Знач Клавиатура = "" , Знач Разметка = "Markdown" , Знач IDВходящего = 0) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка); Строка_ = "Строка"; Текст = РаскодироватьСтроку(Текст, СпособКодированияСтроки.URLВКодировкеURL); Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("reply_markup" , Клавиатура , "Коллекция" , Параметры); OPI_Инструменты.ДобавитьПоле("reply_to_message_id", IDВходящего, "Число" , Параметры); ДобавитьИдентификаторЧата(IDЧата, Параметры); URL = "api.telegram.org/bot" + Токен + "/sendMessage"; Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры); Возврат Ответ; КонецФункции // Отправить картинку // Отправляет картинку в чат или канал // // Примечание: // Метод в документации API: [sendPhoto](@core.telegram.org/bots/api#sendphoto) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Картинка - ДвоичныеДанные, Строка - Файл картинки - picture // Клавиатура - Строка, Структура Из КлючИЗначение - Клавиатура. См. СформироватьКлавиатуруПоМассивуКнопок - keyboard // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьКартинку(Знач Токен , Знач IDЧата , Знач Текст , Знач Картинка , Знач Клавиатура = "" , Знач Разметка = "Markdown") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура, Разметка); КонецФункции // Отправить видео // Отправляет видео в чат или канал // // Примечание: // Метод в документации API: [sendVideo](@core.telegram.org/bots/api#sendvideo) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Видео - ДвоичныеДанные, Строка - Файл видео - video // Клавиатура - Строка, Структура Из КлючИЗначение - Клавиатура. См. СформироватьКлавиатуруПоМассивуКнопок - keyboard // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьВидео(Знач Токен , Знач IDЧата , Знач Текст , Знач Видео , Знач Клавиатура = "" , Знач Разметка = "Markdown") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура, Разметка); КонецФункции // Отправить аудио // Отправляет аудиофайл в чат или канал // // Примечание: // Метод в документации API: [sendAudio](@core.telegram.org/bots/api#sendaudio) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Аудио - ДвоичныеДанные, Строка - Файл аудио - audio // Клавиатура - Строка, Структура Из КлючИЗначение - Клавиатура. См. СформироватьКлавиатуруПоМассивуКнопок - keyboard // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьАудио(Знач Токен , Знач IDЧата , Знач Текст , Знач Аудио , Знач Клавиатура = "" , Знач Разметка = "Markdown") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура, Разметка); КонецФункции // Отправить документ // Отправляет документ в чат или канал // // Примечание: // Метод в документации API: [sendDocument](@core.telegram.org/bots/api#senddocument) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Документ - ДвоичныеДанные, Строка - Файл документа - doc // Клавиатура - Строка, Структура Из КлючИЗначение - Клавиатура. См. СформироватьКлавиатуруПоМассивуКнопок - keyboard // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // ИмяФайла - Строка - Отображаемое имя файла c расширением, если необходимо - filename // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьДокумент(Знач Токен , Знач IDЧата , Знач Текст , Знач Документ , Знач Клавиатура = "" , Знач Разметка = "Markdown" , Знач ИмяФайла = "") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура, Разметка, ИмяФайла); КонецФункции // Отправить гифку // Отправляет гифку в чат или канал // // Примечание: // Метод в документации API: [sendAnimation](@core.telegram.org/bots/api#sendanimation) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Гифка - ДвоичныеДанные, Строка - Файл гифки - gif // Клавиатура - Строка, Структура Из КлючИЗначение - Клавиатура. См. СформироватьКлавиатуруПоМассивуКнопок - keyboard // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьГифку(Знач Токен , Знач IDЧата , Знач Текст , Знач Гифка , Знач Клавиатура = "" , Знач Разметка = "Markdown") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура, Разметка); КонецФункции // Отправить группу медиафайлов // Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video // // Примечание: // Метод в документации API: [sendMediaGroup](@core.telegram.org/bots/api#sendmediagroup) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // СоответствиеФайлов - Соответствие из КлючИЗначение - Коллекция файлов: Ключ > Файл, Значение > Тип медиа - media // Клавиатура - Строка - Клавиатура. См. СформироватьКлавиатуруПоМассивуКнопок - keyboard // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьМедиагруппу(Знач Токен , Знач IDЧата , Знач Текст , Знач СоответствиеФайлов , Знач Клавиатура = "" , Знач Разметка = "Markdown") Экспорт // СоответствиеФайлов // Ключ - Файл, Значение - Тип // Типы: audio, document, photo, video // Нельзя замешивать разные типы! Строка_ = "Строка"; OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов); OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка); URL = "api.telegram.org/bot" + Токен + "/sendMediaGroup"; Медиа = Новый Массив; Параметры = Новый Структура; ДобавитьИдентификаторЧата(IDЧата, Параметры); ПреобразоватьФайлыВМедиа(СоответствиеФайлов, Текст, Медиа); OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("caption" , Текст , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("media" , Медиа , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "Коллекция" , Параметры); Ответ = OPI_ЗапросыHTTP.PostMultipart(URL, Параметры, СоответствиеФайлов, "mixed"); Возврат Ответ; КонецФункции // Отправить местоположение // Отправляет местоположение по географической широте и долготе в чат или канал // // Примечание: // Метод в документации API: [sendLocation](@core.telegram.org/bots/api#sendlocation) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата или IDЧата*IDТемы - chat // Широта - Строка, Число - Географическая широта - lat // Долгота - Строка, Число - Географическая долгота - long // Клавиатура - Строка, Структура Из КлючИЗначение - Клавиатура. См. СформироватьКлавиатуруПоМассивуКнопок - keyboard // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт Строка_ = "Строка"; OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); URL = "api.telegram.org/bot" + Токен + "/sendLocation"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("latitude" , Широта , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("longitude" , Долгота , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура , "Коллекция", Параметры); ДобавитьИдентификаторЧата(IDЧата, Параметры); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Отправить контакт // Отправляет контакт с именем и номером телефона // // Примечание: // Метод в документации API: [sendContact](@core.telegram.org/bots/api#sendcontact) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата или IDЧата*IDТемы - chat // Имя - Строка - Имя контакта - name // Фамилия - Строка - Фамилия контакта - surname // Телефон - Строка - Телефон контакта - phone // Клавиатура - Строка, Структура Из КлючИЗначение - Клавиатура. См. СформироватьКлавиатуруПоМассивуКнопок - keyboard // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт Строка_ = "Строка"; OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); URL = "api.telegram.org/bot" + Токен + "/sendContact"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown", Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("first_name" , Имя , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("last_name" , Фамилия , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("phone_number", Телефон , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "Коллекция", Параметры); ДобавитьИдентификаторЧата(IDЧата, Параметры); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Отправить опрос // Отправляет опрос с вариантами ответа // // Примечание: // Метод в документации API: [sendPoll](@core.telegram.org/bots/api#sendpoll) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата или IDЧата*IDТемы - chat // Вопрос - Строка - Вопрос опроса - question // МассивОтветов - Массив из Строка - Массив вариантов ответа - options // Анонимный - Булево - Флаг анонимности опроса - anonymous // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов); OPI_ПреобразованиеТипов.ПолучитьБулево(Анонимный); URL = "api.telegram.org/bot" + Токен + "/sendPoll"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка" , Параметры); OPI_Инструменты.ДобавитьПоле("question" , Вопрос , "Строка" , Параметры); OPI_Инструменты.ДобавитьПоле("options" , МассивОтветов, "Коллекция", Параметры); Параметры.Вставить("is_anonymous", ?(Анонимный, 1, 0)); ДобавитьИдентификаторЧата(IDЧата, Параметры); Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры); Возврат Ответ; КонецФункции // Переслать сообщение // Пересылает сообщение между чатами или в рамках одного чата // // Примечание: // Метод в документации API: [forwardMessage](@core.telegram.org/bots/api#forwardmessage) // // Параметры: // Токен - Строка - Токен бота - token // IDОригинала - Строка, Число - ID оригинального сообщения - message // ОткудаID - Строка, Число - ID чата оригинального сообщения - from // КудаID - Строка, Число - ID целевого чата или IDЧата*IDТемы - to // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОригинала); OPI_ПреобразованиеТипов.ПолучитьСтроку(ОткудаID); OPI_ПреобразованиеТипов.ПолучитьСтроку(КудаID); URL = "api.telegram.org/bot" + Токен + "/forwardMessage"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("from_chat_id", ОткудаID , "Число", Параметры); OPI_Инструменты.ДобавитьПоле("message_id" , IDОригинала, "Число", Параметры); ДобавитьИдентификаторЧата(КудаID, Параметры); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Удалить сообщение // Удаляет указанное сообщение из чата или канала // // Примечание: // Метод в документации API: [deleteMessage](@core.telegram.org/bots/api#deletemessage) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID целевого чата - chat // IDСообщения - Строка, Число - ID удаляемого сообщения - message // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция УдалитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/deleteMessage"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, "Число", Параметры); OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Число", Параметры); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Заменить клавиатуру сообщения // Заменяет клавиатуру сообщения на новую // // Примечание: // Метод в документации API: [editMessageReplyMarkup](@core.telegram.org/bots/api#editmessagereplymarkup) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID целевого чата - chat // IDСообщения - Строка, Число - ID удаляемого сообщения - message // Клавиатура - Строка, Структура Из КлючИЗначение - Клавиатура. См. СформироватьКлавиатуруПоМассивуКнопок - keyboard // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ЗаменитьКлавиатуруСообщения(Знач Токен, Знач IDЧата, Знач IDСообщения, Знач Клавиатура) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("message_id" , IDСообщения, "Число" , Параметры); OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура , "Коллекция", Параметры); ДобавитьИдентификаторЧата(IDЧата, Параметры); URL = "api.telegram.org/bot" + Токен + "/editMessageReplyMarkup"; Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры); Возврат Ответ; КонецФункции // Заменить текст сообщения // Заменяет текст сообщения на новый // // Примечание: // Метод в документации API: [editMessageText](@core.telegram.org/bots/api#editmessagetext) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID целевого чата - chat // IDСообщения - Строка, Число - ID удаляемого сообщения - message // Текст - Строка - Новый текст сообщения - text // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ЗаменитьТекстСообщения(Знач Токен , Знач IDЧата , Знач IDСообщения , Знач Текст , Знач Разметка = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка); Строка_ = "Строка"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, "Число", Параметры); OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_, Параметры); OPI_Инструменты.ДобавитьПоле("parse_mode", Разметка , Строка_, Параметры); ДобавитьИдентификаторЧата(IDЧата, Параметры); URL = "api.telegram.org/bot" + Токен + "/editMessageText"; Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры); Возврат Ответ; КонецФункции // Заменить описание сообщения // Заменяет текст в сообщении с вложениями // // Примечание: // Метод в документации API: [editMessageCaption](@core.telegram.org/bots/api#editmessagecaption) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID целевого чата - chat // IDСообщения - Строка, Число - ID удаляемого сообщения - message // Описание - Строка - Новое описание сообщения - caption // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ЗаменитьОписаниеСообщения(Знач Токен , Знач IDЧата , Знач IDСообщения , Знач Описание , Знач Разметка = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); OPI_Инструменты.ЗаменитьСпецСимволы(Описание, Разметка); Строка_ = "Строка"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, "Число", Параметры); OPI_Инструменты.ДобавитьПоле("caption" , Описание , Строка_, Параметры); OPI_Инструменты.ДобавитьПоле("parse_mode", Разметка , Строка_, Параметры); ДобавитьИдентификаторЧата(IDЧата, Параметры); URL = "api.telegram.org/bot" + Токен + "/editMessageCaption"; Ответ = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры); Возврат Ответ; КонецФункции // Сформировать клавиатуру по массиву кнопок // Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели // // Примечание: // О клавиатурах в документации API: [InlineKeyboardMarkup](@core.telegram.org/bots/api#inlinekeyboardmarkup) // // Параметры: // МассивКнопок - Массив из Строка - Массив кнопок - buttons // ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели - under // ОднаПодОдной - Булево - Истина > кнопки выводятся в столбик, Ложь > в строку - column // // Возвращаемое значение: // Строка - JSON клавиатуры Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок , Знач ПодСообщением = Ложь , Знач ОднаПодОдной = Истина) Экспорт OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением); OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной); OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); Если ОднаПодОдной Тогда Строки = СоздатьВысокуюКлавиатуру(МассивКнопок); Иначе Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок); КонецЕсли; Если ПодСообщением Тогда СтруктураПараметра = Новый Структура("inline_keyboard,rows" , Строки, 1); Иначе СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина); КонецЕсли; СтруктураПараметра = OPI_Инструменты.JSONСтрокой(СтруктураПараметра, , Ложь, Ложь); Возврат СтруктураПараметра; КонецФункции #КонецОбласти #Область Администрирование // Бан // Банит пользователя в выбранном чате // // Примечание: // Метод в документации API: [banChatMember](@core.telegram.org/bots/api#banchatmember) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата или IDЧата*IDТемы - chat // IDПользователя - Строка, Число - ID целевого пользователя - user // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт Строка_ = "Строка"; OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/banChatMember"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры); OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Число", Параметры); OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, "Число", Параметры); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Разбан // Разбанивает забаненного ранее пользователя // // Примечание: // Метод в документации API: [unbanChatMember](@core.telegram.org/bots/api#unbanchatmember) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата или IDЧата*IDТемы - chat // IDПользователя - Строка, Число - ID целевого пользователя - user // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт Строка_ = "Строка"; OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/unbanChatMember"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Число" , Параметры); OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, "Число" , Параметры); OPI_Инструменты.ДобавитьПоле("only_if_banned", Ложь , "Булево", Параметры); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Создать ссылку-приглашение // Создает ссылку для вступления в закрытый чат // // Примечание: // Метод в документации API: [createChatInviteLink](@core.telegram.org/bots/api#createchatinvitelink) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата или IDЧата*IDТемы - chat // Заголовок - Строка - Заголовок приглашения - title // ДатаИстечения - Дата - Дата окончания жизни ссылки (безсрочно, если не указано) - expire // ЛимитПользователей - Число - Лимит пользователей (бесконечно, если не указано) - limit // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция СоздатьСсылкуПриглашение(Знач Токен , Знач IDЧата , Знач Заголовок = "" , Знач ДатаИстечения = "" , Знач ЛимитПользователей = 0) Экспорт Строка_ = "Строка"; OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Число" , Параметры); OPI_Инструменты.ДобавитьПоле("name" , Заголовок , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("member_limit" , ЛимитПользователей, "Число" , Параметры); OPI_Инструменты.ДобавитьПоле("expire_date" , ДатаИстечения , "Дата" , Параметры); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Закрепить сообщение // Закрепляет сообщение в шапке чата // // Примечание: // Метод в документации API: [pinChatMessage](@core.telegram.org/bots/api#pinchatmessage) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID целевого чата - chat // IDСообщения - Строка, Число - ID целевого сообщения - message // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт Строка_ = "Строка"; OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/pinChatMessage"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Число" , Параметры); OPI_Инструменты.ДобавитьПоле("message_id" , IDСообщения, "Число" , Параметры); OPI_Инструменты.ДобавитьПоле("disable_notification", Ложь , "Булево", Параметры); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Открепить сообщение // Открепляет сообщение в шапке чата // // Примечание: // Метод в документации API: [unpinChatMessage](@core.telegram.org/bots/api#unpinchatmessage) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата - chat // IDСообщения - Строка, Число - ID целевого сообщения - message // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт Строка_ = "Строка"; OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры); OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Число", Параметры); OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, "Число", Параметры); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Получить число участников // Получает общее число участников чата // // Примечание: // Метод в документации API: [getChatMemberCount](@core.telegram.org/bots/api#getchatmembercount) // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка, Число - ID целевого чата - chat // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка", Параметры); OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Число" , Параметры); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции #КонецОбласти #Область РаботаСТемамиФорума // Получить список иконок-аватаров // Получает соответствие ID Emoji для установки в качестве иконок тем форума // // Примечание: // Метод в документации API: [getForumTopicIconStickers](@core.telegram.org/bots/api#getforumtopiciconstickers) // // Параметры: // Токен - Строка - Токен - token // // Возвращаемое значение: // Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); Result = "result"; URL = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers"; Ответ = OPI_ЗапросыHTTP.Get(URL); Иконки = Ответ[Result]; Если Не ЗначениеЗаполнено(Иконки) Тогда Возврат Ответ; КонецЕсли; Коллекция = Новый Соответствие; Для Каждого Иконка Из Иконки Цикл Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]); КонецЦикла; Возврат Коллекция; КонецФункции // Создать тему форума // Создает новую тему в группе с включенным функционалом тем // // Примечание: // Метод в документации API: [createForumTopic](@core.telegram.org/bots/api#createforumtopic) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID чата создания темы - forum // Заголовок - Строка - Заголовок темы - title // IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки); КонецФункции // Изменить тему форума // Создает новую тему в группе с включенным функционалом тем // // Примечание: // Метод в документации API: [editForumTopic](@core.telegram.org/bots/api#editforumtopic) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID чата создания темы - forum // IDТемы - Строка, Число - ID темы - topic // Заголовок - Строка - Новый заголовок - title // IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ИзменитьТемуФорума(Знач Токен , Знач IDЧата , Знач IDТемы , Знач Заголовок = Неопределено , Знач IDИконки = Неопределено) Экспорт Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы); КонецФункции // Закрыть тему форума // Закрывает тему для новых сообщений // // Примечание: // Метод в документации API: [closeForumTopic](@core.telegram.org/bots/api#closeforumtopic) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID чата темы - forum // IDТемы - Строка, Число - ID темы - topic // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы); КонецФункции // Открыть тему форума // Повторно открывает ранее закрытую тему форума // // Примечание: // Метод в документации API: [reopenForumTopic](@core.telegram.org/bots/api#reopenforumtopic) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID чата темы - forum // IDТемы - Строка, Число - ID темы - topic // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы); КонецФункции // Удалить тему форума // Удаляет тему форума // // Примечание: // Метод в документации API: [deleteForumTopic](@core.telegram.org/bots/api#deleteforumtopic) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID чата темы - forum // IDТемы - Строка, Число - ID темы - topic // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы); КонецФункции // Скрыть главную тему форума // Скрывает главную тему форума // // Примечание: // Метод в документации API: [hideGeneralForumTopic](@core.telegram.org/bots/api#hidegeneralforumtopic) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID чата темы - forum // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина); КонецФункции // Показать главную тему форума // Показывает ранее скрытую главную тему форума // // Примечание: // Метод в документации API: [unhideGeneralForumTopic](@core.telegram.org/bots/api#unhidegeneralforumtopic) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID чата темы - forum // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь); КонецФункции // Изменить имя главной темы форума // Изменяет имя главной темы форума // // Примечание: // Метод в документации API: [editGeneralForumTopic](@core.telegram.org/bots/api#editgeneralforumtopic) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID чата темы - forum // Заголовок - Строка - Новое имя главной темы - title // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата , "Число" , Параметры); OPI_Инструменты.ДобавитьПоле("name" , Заголовок, "Строка", Параметры); Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции // Очистить список закрепленных сообщений темы // Очищает список закрепленных сообщений в теме форума // // Примечание: // Метод в документации API: [unpinAllForumTopicMessages](@core.telegram.org/bots/api#unpinallforumtopicmessages) // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка, Число - ID чата темы - forum // IDТемы - Строка, Число - ID темы. Главная, если не заполнено - topic // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы); Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры); OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры); Если ЗначениеЗаполнено(IDТемы) Тогда Метод = "/unpinAllForumTopicMessages"; Иначе Метод = "/unpinAllGeneralForumTopicMessages"; КонецЕсли; URL = "api.telegram.org/bot" + Токен + Метод; Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции #КонецОбласти #КонецОбласти #Область СлужебныеПроцедурыИФункции Функция ОтправитьФайл(Знач Токен , Знач IDЧата , Знач Текст , Знач Файл , Знач Вид , Знач Клавиатура , Знач Разметка , Знач ИмяФайла = "") OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид); OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка); Если Не ЗначениеЗаполнено(ИмяФайла) Тогда ИмяФайла = ПреобразоватьДанныеФайла(Файл, Вид, ""); Иначе OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); КонецЕсли; ИмяФайла = Вид + "|" + ИмяФайла; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры); OPI_Инструменты.ДобавитьПоле("caption" , Текст , "Строка" , Параметры); OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "Коллекция", Параметры); ДобавитьИдентификаторЧата(IDЧата, Параметры); СоответствиеФайлов = Новый Соответствие; СоответствиеФайлов.Вставить(ИмяФайла, Файл); Метод = ОпределитьМетодОтправки(Вид); URL = "api.telegram.org/bot" + Токен + Метод; Ответ = OPI_ЗапросыHTTP.PostMultipart(URL, Параметры, СоответствиеФайлов, "mixed"); Возврат Ответ; КонецФункции Функция УправлениеТемойФорума(Знач Токен , Знач IDЧата , Знач Заголовок = Неопределено , Знач IDИконки = Неопределено , Знач IDТемы = "") Строка_ = "Строка"; OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("name" , Заголовок, Строка_, Параметры); OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Число", Параметры); OPI_Инструменты.ДобавитьПоле("icon_custom_emoji_id", IDИконки , Строка_, Параметры); OPI_Инструменты.ДобавитьПоле("message_thread_id" , IDТемы , "Число", Параметры); Если ЗначениеЗаполнено(IDТемы) Тогда Метод = "/editForumTopic"; Иначе Метод = "/createForumTopic"; КонецЕсли; Ответ = OPI_ЗапросыHTTP.Get("api.telegram.org/bot" + Токен + Метод, Параметры); Возврат Ответ; КонецФункции Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач Статус, Знач IDТемы = "") OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); Если ЗначениеЗаполнено(IDТемы) Тогда Форум = "Forum"; Иначе Форум = "GeneralForum"; КонецЕсли; Метод = ОпределитьМетодУправленияФорумом(Статус, Форум); Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Число", Параметры); OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Число", Параметры); URL = "api.telegram.org/bot" + Токен + Метод; Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть) OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть); Если Скрыть Тогда Метод = "/hideGeneralForumTopic"; Иначе Метод = "/unhideGeneralForumTopic"; КонецЕсли; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата, "Строка", Параметры); URL = "api.telegram.org/bot" + Токен + Метод; Ответ = OPI_ЗапросыHTTP.Get(URL, Параметры); Возврат Ответ; КонецФункции Функция ОпределитьМетодУправленияФорумом(Знач Статус, Знач Форум) Открыть = 1; Закрыть = 2; Удалить = 3; Если Статус = Открыть Тогда Метод = "/reopen" + Форум + "Topic"; ИначеЕсли Статус = Закрыть Тогда Метод = "/close" + Форум + "Topic"; ИначеЕсли Статус = Удалить Тогда Метод = "/deleteForumTopic"; Иначе ВызватьИсключение "Некорректный статус управления форумом"; КонецЕсли; Возврат Метод; КонецФункции Функция СоздатьВысокуюКлавиатуру(Знач МассивКнопок) Строки = Новый Массив; Для Каждого Кнопка Из МассивКнопок Цикл Кнопки = Новый Массив; Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); Строки.Добавить(Кнопки); КонецЦикла; Возврат Строки; КонецФункции Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок) Строки = Новый Массив; Кнопки = Новый Массив; Для Каждого Кнопка Из МассивКнопок Цикл Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); КонецЦикла; Строки.Добавить(Кнопки); Возврат Строки; КонецФункции Функция ОпределитьМетодОтправки(Знач Вид) Если Вид = "photo" Тогда Метод = "/sendPhoto"; ИначеЕсли Вид = "video" Тогда Метод = "/sendVideo"; ИначеЕсли Вид = "audio" Тогда Метод = "/sendAudio"; ИначеЕсли Вид = "animation" Тогда Метод = "/sendAnimation"; Иначе Метод = "/sendDocument"; КонецЕсли; Возврат Метод; КонецФункции Функция ПреобразоватьДанныеФайла(Файл, Вид, Счетчик) ИмяФайла = ""; Если ТипЗнч(Файл) = Тип("Строка") И Вид = "document" Тогда ТекущийФайл = Новый Файл(Файл); ИмяФайла = ТекущийФайл.Имя; КонецЕсли; Если Не ЗначениеЗаполнено(ИмяФайла) Тогда ИмяФайла = Вид + Строка(Счетчик); Если Вид = "animation" Тогда ИмяФайла = ИмяФайла + ".gif"; КонецЕсли; КонецЕсли; OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); Возврат ИмяФайла; КонецФункции Процедура ПреобразоватьФайлыВМедиа(СоответствиеФайлов, Текст, Медиа) OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов); OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда // !OInt ВызватьИсключение("Не удалось получить информацию из json медиа!"); Возврат; КонецЕсли; ВременноеСоответствие = Новый Соответствие; Счетчик = 0; Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл ТекущиеДанные = ТекущийФайл.Ключ; ТипМедиа = ТекущийФайл.Значение; ИмяМедиа = ПреобразоватьДанныеФайла(ТекущиеДанные, ТипМедиа, Счетчик); ВременноеСоответствие.Вставить(ИмяМедиа + "|" + ИмяМедиа, ТекущиеДанные); СтруктураМедиа = Новый Структура; СтруктураМедиа.Вставить("type" , ТипМедиа); СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа); Если Счетчик = 0 Тогда СтруктураМедиа.Вставить("caption", Текст); КонецЕсли; Медиа.Добавить(СтруктураМедиа); Счетчик = Счетчик + 1; КонецЦикла; Медиа = OPI_Инструменты.JSONСтрокой(Медиа); СоответствиеФайлов = ВременноеСоответствие; КонецПроцедуры Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры) IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); МассивЧата = СтрРазделить(IDЧата, "*", Ложь); Если МассивЧата.Количество() > 1 Тогда IDЧата = МассивЧата[0]; IDТемы = МассивЧата[1]; OPI_ПреобразованиеТипов.ПолучитьЧисло(IDТемы); Параметры.Вставить("message_thread_id", IDТемы); КонецЕсли; OPI_ПреобразованиеТипов.ПолучитьЧисло(IDТемы); Параметры.Вставить("chat_id", IDЧата); КонецПроцедуры #КонецОбласти