// Библиотека: Telegram // Команда CLI: telegram // MIT License // Copyright (c) 2023 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 // Раскомментировать, если выполняется OneScript #Использовать "../../tools" #Область ПрограммныйИнтерфейс #Область ДанныеИНастройка // Получить информацию о боте // Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д. // // Параметры: // Токен - Строка - Токен бота - token // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ПолучитьИнформациюБота(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/getMe"; Ответ = OPI_Инструменты.Get(URL); Возврат Ответ; КонецФункции // Получить обновления // Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме // // Параметры: // Токен - Строка - Токен бота - token // Таймаут - Строка,Число - Время ожидания новых событий - timeout // Смещение - Строка,Число - Смещение в списке получаемых сообщений - offset // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ПолучитьОбновления(Знач Токен, Знач Таймаут = 0, Знач Смещение = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/getUpdates"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("timeout", Таймаут , "Строка", Параметры); OPI_Инструменты.ДобавитьПоле("offset" , Смещение, "Строка", Параметры); Ответ = OPI_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции // Установить Webhook // Устанавливает URL обработчика событий бота для работы в режиме Webhook // // Параметры: // Токен - Строка - Токен бота - token // URL - Строка - Адрес обработки запросов от Telegram (с https:) - url // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("url", URL, "Строка", Параметры); URL = "api.telegram.org/bot" + Токен + "/setWebHook"; Ответ = OPI_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции // Удалить Webhook // Удаляет URL обработчика событий бота для работы в режиме Webhook // // Параметры: // Токен - Строка - Токен бота - token // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция УдалитьWebhook(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/deleteWebHook"; Ответ = OPI_Инструменты.Get(URL); Возврат Ответ; КонецФункции #КонецОбласти #Область ОтправкаДанных // Отправить текстовое сообщение // Отправляет текстовое сообщение в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьТекстовоеСообщение(Знач Токен , Знач IDЧата , Знач Текст , Знач Клавиатура = "" , Знач Разметка = "Markdown") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка); Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры); OPI_Инструменты.ДобавитьПоле("text" , Текст , "Строка" , Параметры); OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); ДобавитьИдентификаторЧата(IDЧата, Параметры); URL = "api.telegram.org/bot" + Токен + "/sendMessage"; Ответ = OPI_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции // Отправить картинку // Отправляет картинку в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Картинка - ДвоичныеДанные,Строка - Файл картинки - picture // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьКартинку(Знач Токен , Знач IDЧата , Знач Текст , Знач Картинка , Знач Клавиатура = "" , Знач Разметка = "Markdown") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура, Разметка); КонецФункции // Отправить видео // Отправляет видео в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Видео - ДвоичныеДанные,Строка - Файл видео - video // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьВидео(Знач Токен , Знач IDЧата , Знач Текст , Знач Видео , Знач Клавиатура = "" , Знач Разметка = "Markdown") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура, Разметка); КонецФункции // Отправить аудио // Отправляет аудиофайл в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Аудио - ДвоичныеДанные,Строка - Файл аудио - audio // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьАудио(Знач Токен , Знач IDЧата , Знач Текст , Знач Аудио , Знач Клавиатура = "" , Знач Разметка = "Markdown") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура, Разметка); КонецФункции // Отправить документ // Отправляет документ в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Документ - ДвоичныеДанные,Строка - Файл документа - doc // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьДокумент(Знач Токен , Знач IDЧата , Знач Текст , Знач Документ , Знач Клавиатура = "" , Знач Разметка = "Markdown") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура, Разметка); КонецФункции // Отправить гифку // Отправляет гифку в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Гифка - ДвоичныеДанные,Строка - Файл гифки - gif // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json // Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьГифку(Знач Токен , Знач IDЧата , Знач Текст , Знач Гифка , Знач Клавиатура = "" , Знач Разметка = "Markdown") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура, Разметка); КонецФункции // Отправить группу медиафайлов // Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // СоответствиеФайлов - Соответствие из Строка - Коллекция файлов - media - JSON файлов или путь к .json // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json // Разметка - Строка - Вид обработки текста (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_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed"); Возврат Ответ; КонецФункции // Отправить местоположение // Отправляет местоположение по географической широте и долготе в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Широта - Строка,Число - Географическая широта - lat // Долгота - Строка,Число - Географическая долгота - long // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный 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_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции // Отправить контакт // Отправляет контакт с именем и номером телефона // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Имя - Строка - Имя контакта - name // Фамилия - Строка - Фамилия контакта - surname // Телефон - Строка - Телефон контакта - phone // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный 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_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции // Отправить опрос // Отправляет опрос с вариантами ответа // // Параметры: // Токен - Строка - Токен бота - 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_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции // Переслать сообщение // Пересылает сообщение между чатами или в рамках одного чата // // Параметры: // Токен - Строка - Токен бота - 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_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции #КонецОбласти #Область Администрирование // Бан // Банит пользователя в выбранном чате // // Параметры: // Токен - Строка - Токен бота - 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_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции // Разбан // Разбанивает забаненного ранее пользователя // // Параметры: // Токен - Строка - Токен бота - 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_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции // Создать ссылку-приглашение // Создает ссылку для вступления в закрытый чат // // Параметры: // Токен - Строка - Токен бота - 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_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции // Закрепить сообщение // Закрепляет сообщение в шапке чата // // Параметры: // Токен - Строка - Токен - 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_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции // Открепить сообщение // Открепляет сообщение в шапке чата // // Параметры: // Токен - Строка - Токен бота - 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_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции // Получить число участников // Получает общее число участников чата // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата - chat // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка", Параметры); OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Строка", Параметры); Ответ = OPI_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции #КонецОбласти #Область TelegramMiniApp // Обработать данные TMA и определить их достоверность !NOCLI // // Параметры: // СтрокаДанных - Строка - querry из Telegram.WebApp.initData // Токен - Строка - Токен бота // // Возвращаемое значение: // Соответствие из Строка - Обработанные данные с признаком достоверности Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(СтрокаДанных); СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL); СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных); Ключ = "WebAppData"; Хэш = ""; КлючДвоичные = ПолучитьДвоичныеДанныеИзСтроки(Ключ); Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен)); ТЗнач = Новый ТаблицаЗначений; ТЗнач.Колонки.Добавить("Ключ"); ТЗнач.Колонки.Добавить("Значение"); Для Каждого Данные Из СтруктураДанных Цикл НоваяСтрока = ТЗнач.Добавить(); НоваяСтрока.Ключ = Данные.Ключ; НоваяСтрока.Значение = Данные.Значение; КонецЦикла; ТЗнач.Сортировать("Ключ"); СоответствиеВозврата = Новый Соответствие; DCS = ""; Для Каждого СтрокаТЗ Из ТЗнач Цикл Если СтрокаТЗ.Ключ <> "hash" Тогда DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС; СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение); Иначе Хэш = СтрокаТЗ.Значение; КонецЕсли; КонецЦикла; DCS = Лев(DCS, СтрДлина(DCS) - 1); Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS)); Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись); Если Финал = вРег(Хэш) Тогда Ответ = Истина; Иначе Ответ = Ложь; КонецЕсли; СоответствиеВозврата.Вставить("passed", Ответ); Возврат СоответствиеВозврата; КонецФункции #КонецОбласти #Область РежимФорума // Получить список иконок-аватаров // Получает соответствие ID Emoji для установки в качестве иконок тем форума // // Параметры: // Токен - Строка - Токен - token // // Возвращаемое значение: // Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); Result = "result"; URL = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers"; Ответ = OPI_Инструменты.Get(URL); Иконки = Ответ[Result]; Если Не ЗначениеЗаполнено(Иконки) Тогда Возврат Ответ; КонецЕсли; Коллекция = Новый Соответствие; Для Каждого Иконка Из Иконки Цикл Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]); КонецЦикла; Возврат Коллекция; КонецФункции // Создать тему форума // Создает новую тему в группе с включенным функционалом тем // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка,Число - ID чата создания темы - forum // Заголовок - Строка - Заголовок темы - title // IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки); КонецФункции // Изменить тему форума // Создает новую тему в группе с включенным функционалом тем // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка,Число - ID чата создания темы - forum // IDТемы - Строка,Число - ID темы - topic // Заголовок - Строка - Новый заголовок - title // IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ИзменитьТемуФорума(Знач Токен , Знач IDЧата , Знач IDТемы , Знач Заголовок = Неопределено , Знач IDИконки = Неопределено) Экспорт Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы); КонецФункции // Закрыть тему форума // Закрывает тему для новых сообщений // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка,Число - ID чата темы - forum // IDТемы - Строка,Число - ID темы - topic // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы); КонецФункции // Открыть тему форума // Повторно открывает ранее закрытую тему форума // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка,Число - ID чата темы - forum // IDТемы - Строка,Число - ID темы - topic // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы); КонецФункции // Удалить тему форума // Удаляет тему форума // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка,Число - ID чата темы - forum // IDТемы - Строка,Число - ID темы - topic // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы); КонецФункции // Скрыть главную тему форума // Скрывает главную тему форума // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка,Число - ID чата темы - forum // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина); КонецФункции // Показать главную тему форума // Показывает ранее скрытую главную тему форума // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка,Число - ID чата темы - forum // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь); КонецФункции // Изменить имя главной темы форума // Изменяет имя главной темы форума // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка,Число - ID чата темы - forum // Заголовок - Строка - Новое имя главной темы - title // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic"; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата , "Строка", Параметры); OPI_Инструменты.ДобавитьПоле("name" , Заголовок, "Строка", Параметры); Ответ = OPI_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции // Очистить список закрепленных сообщений темы // Очищает список закрепленных сообщений в теме форума // // Параметры: // Токен - Строка - Токен - 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_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции #КонецОбласти #Область Прочее // Сформировать клавиатуру по массиву кнопок // Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели // // Параметры: // МассивКнопок - Массив из Строка - Массив кнопок - buttons // ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели - under // ОднаПодОдной - Булево - Истина > кнопки выводятся в столбик, Ложь > в строку - column // // Возвращаемое значение: // Строка - JSON клавиатуры Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок , Знач ПодСообщением = Ложь , Знач ОднаПодОдной = Истина) Экспорт OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением); OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной); OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); Если ОднаПодОдной Тогда Строки = СоздатьВысокуюКлавиатуру(МассивКнопок); Иначе Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок); КонецЕсли; Если ПодСообщением Тогда СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1); Иначе СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина); КонецЕсли; Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра); Возврат Клавиатура; КонецФункции #КонецОбласти #КонецОбласти #Область СлужебныеПроцедурыИФункции Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура, Знач Разметка) OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид); Расширение = ""; Метод = ""; ОпределитьМетодОтправки(Вид, Метод, Расширение); ПреобразоватьДанныеФайла(Файл, Расширение, Вид); OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка); Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры); OPI_Инструменты.ДобавитьПоле("caption" , Текст , "Строка" , Параметры); OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); ДобавитьИдентификаторЧата(IDЧата, Параметры); СтруктураФайлов = Новый Структура; СтруктураФайлов.Вставить(Вид + Расширение, Файл); URL = "api.telegram.org/bot" + Токен + Метод; Ответ = OPI_Инструменты.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_Инструменты.УдалитьПустыеПоляКоллекции(Параметры); Ответ = OPI_Инструменты.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_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть) OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть); Если Скрыть Тогда Метод = "/hideGeneralForumTopic"; Иначе Метод = "/unhideGeneralForumTopic"; КонецЕсли; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата, "Строка", Параметры); URL = "api.telegram.org/bot" + Токен + Метод; Ответ = OPI_Инструменты.Get(URL, Параметры); Возврат Ответ; КонецФункции Функция ОпределитьМетодУправленияФорумом(Знач Статус, Знач Форум) Открыть = 1; Закрыть = 2; Удалить = 3; Если Статус = Открыть Тогда Метод = "/reopen" + Форум + "Topic"; ИначеЕсли Статус = Закрыть Тогда Метод = "/close" + Форум + "Topic"; ИначеЕсли Статус = Удалить Тогда Метод = "/deleteForumTopic"; Иначе ВызватьИсключение "Некорректный статус управления форумом"; КонецЕсли; Возврат Метод; КонецФункции Функция СоздатьВысокуюКлавиатуру(Знач МассивКнопок) Строки = Новый Массив; Для Каждого Кнопка Из МассивКнопок Цикл Кнопки = Новый Массив; Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); Строки.Добавить(Кнопки); КонецЦикла; Возврат Строки; КонецФункции Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок) Строки = Новый Массив; Кнопки = Новый Массив; Для Каждого Кнопка Из МассивКнопок Цикл Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); КонецЦикла; Строки.Добавить(Кнопки); Возврат Строки; КонецФункции Процедура СформироватьМассивМедиа(Знач СоответствиеФайлов, Знач Текст, СтруктураФайлов, Медиа) Счетчик = 0; OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов); OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда ВызватьИсключение("Не удалось получить информацию из json медиа!"); Возврат; КонецЕсли; Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда Двоичные = ТекущийФайл.Ключ; OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Двоичные); ЭтотФайл = Новый Файл(ТекущийФайл.Ключ); ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик) + ?(ТекущийФайл.Значение = "document", ЭтотФайл.Расширение, ""); ПолноеИмяМедиа = СтрЗаменить(ИмяМедиа, ".", "___"); Иначе Двоичные = ТекущийФайл.Ключ; ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик); ПолноеИмяМедиа = ИмяМедиа; КонецЕсли; СтруктураФайлов.Вставить(ПолноеИмяМедиа, Двоичные); СтруктураМедиа = Новый Структура; СтруктураМедиа.Вставить("type" , ТекущийФайл.Значение); СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа); Если Счетчик = 0 Тогда СтруктураМедиа.Вставить("caption", Текст); КонецЕсли; Медиа.Добавить(СтруктураМедиа); Счетчик = Счетчик + 1; КонецЦикла; Медиа = OPI_Инструменты.JSONСтрокой(Медиа); КонецПроцедуры Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры) IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); МассивЧата = СтрРазделить(IDЧата, "*", Ложь); Если МассивЧата.Количество() > 1 Тогда IDЧата = МассивЧата[0]; IDТемы = МассивЧата[1]; Параметры.Вставить("message_thread_id", IDТемы); КонецЕсли; Параметры.Вставить("chat_id", IDЧата); КонецПроцедуры Процедура ОпределитьМетодОтправки(Знач Вид, Метод, Расширение) Если Вид = "photo" Тогда Метод = "/sendPhoto"; ИначеЕсли Вид = "video" Тогда Метод = "/sendVideo"; ИначеЕсли Вид = "audio" Тогда Метод = "/sendAudio"; ИначеЕсли Вид = "document" Тогда Метод = "/sendDocument"; ИначеЕсли Вид = "animation" Тогда Метод = "/sendAnimation"; Расширение = ".gif"; Иначе ВызватьИсключение "Некорректный вид отправки"; КонецЕсли; КонецПроцедуры Процедура ПреобразоватьДанныеФайла(Файл, Расширение, Вид) Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда ТекущийФайл = Новый Файл(Файл); Расширение = ?(Вид = "document", ТекущийФайл.Расширение, Расширение); OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); КонецЕсли; Расширение = СтрЗаменить(Расширение, ".", "___"); КонецПроцедуры #КонецОбласти