// 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 // Раскомментировать, если выполняется OneScript #Использовать "../../tools" #Область ПрограммныйИнтерфейс #Область ДанныеИНастройка // Получить информацию о боте // Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д. // // Параметры: // Токен - Строка - Токен бота - token // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ПолучитьИнформациюБота(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/getMe"; Ответ = OPI_Инструменты.Get(URL); Возврат Ответ; КонецФункции // Получить обновления // Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме // // Параметры: // Токен - Строка - Токен бота - token // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ПолучитьОбновления(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/getUpdates"; Ответ = OPI_Инструменты.Get(URL); Возврат Ответ; КонецФункции // Установить Webhook // Устанавливает адрес обработчика событий бота для работы в режиме webhook. // // Параметры: // Токен - Строка - Токен бота - token // URL - Строка - Адрес обработки запросов от Telegram (с https:) - url // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); Параметры_ = Новый Структура; Параметры_.Вставить("url", URL); URL = "api.telegram.org/bot" + Токен + "/setWebHook"; Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции // Удалить Webhook // Удаляет адрес обработчика событий бота для работы в режиме webhook. // // Параметры: // Токен - Строка - Токен бота - token // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция УдалитьWebhook(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); URL = "api.telegram.org/bot" + Токен + "/deleteWebHook"; Ответ = OPI_Инструменты.Get(URL); Возврат Ответ; КонецФункции #КонецОбласти #Область ОтправкаДанных // Отправить текстовое сообщение // Отправляет текстовое сообщение в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьТекстовоеСообщение(Знач Токен, Знач IDЧата, Знач Текст, Знач Клавиатура = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура); OPI_Инструменты.ЗаменитьСпецСимволы(Текст); Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode" , "Markdown"); Параметры_.Вставить("text" , Текст); Параметры_.Вставить("reply_markup", Клавиатура); ДобавитьИдентификаторЧата(IDЧата, Параметры_); URL = "api.telegram.org/bot" + Токен + "/sendMessage"; Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции // Отправить картинку // Отправляет картинку в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Картинка - ДвоичныеДанные,Строка - Файл картинки - picture // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьКартинку(Знач Токен, Знач IDЧата, Знач Текст, Знач Картинка, Знач Клавиатура = "") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура); КонецФункции // Отправить видео // Отправляет видео в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Видео - ДвоичныеДанные,Строка - Файл видео - video // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьВидео(Знач Токен, Знач IDЧата, Знач Текст, Знач Видео, Знач Клавиатура = "") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура); КонецФункции // Отправить аудио // Отправляет аудиофайл в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Аудио - ДвоичныеДанные,Строка - Файл аудио - audio // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьАудио(Знач Токен, Знач IDЧата, Знач Текст, Знач Аудио, Знач Клавиатура = "") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура); КонецФункции // Отправить документ // Отправляет документ в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Документ - ДвоичныеДанные,Строка - Файл документа - doc // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьДокумент(Знач Токен, Знач IDЧата, Знач Текст, Знач Документ, Знач Клавиатура = "") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура); КонецФункции // Отправить гифку // Отправляет гифку в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // Гифка - ДвоичныеДанные,Строка - Файл гифки - gif // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьГифку(Знач Токен, Знач IDЧата, Знач Текст, Знач Гифка, Знач Клавиатура = "") Экспорт Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура); КонецФункции // Отправить группу медиафайлов // Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video // Структура данных медиагруппы // { // ""ПутьКФайлу"": ""ТипМедиа"", // ""ПутьКФайлу"": ""ТипМедиа"", // ... // } // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Текст - Строка - Текст сообщения - text // СоответствиеФайлов - Соответствие из Строка - Коллекция файлов - media - JSON - JSON файлов или путь к .json: // * Ключ - ДвоичныеДанные,Строка - Файл // * Значение - Строка - Тип файла: audio, document, photo, video // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьМедиагруппу(Знач Токен, Знач IDЧата, Знач Текст, Знач СоответствиеФайлов, Знач Клавиатура = "") Экспорт // СоответствиеФайлов // Ключ - Файл, Значение - Тип // Типы: audio, document, photo, video // Нельзя замешивать разные типы! OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура); OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов); OPI_Инструменты.ЗаменитьСпецсимволы(Текст); URL = "api.telegram.org/bot" + Токен + "/sendMediaGroup"; СтруктураФайлов = Новый Структура; Медиа = Новый Массив; Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode" , "Markdown"); Параметры_.Вставить("caption" , Текст); Параметры_.Вставить("reply_markup", Клавиатура); ДобавитьИдентификаторЧата(IDЧата, Параметры_); СформироватьМассивМедиа(СоответствиеФайлов, Текст, СтруктураФайлов, Медиа); Параметры_.Вставить("media", Медиа); Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, СтруктураФайлов, "mixed"); Возврат Ответ; КонецФункции // Отправить местоположение // Отправляет местоположение по географической широте и долготе в чат или канал // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Широта - Строка,Число - Географическая широта - lat // Долгота - Строка,Число - Географическая долгота - long // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(Широта); OPI_ПреобразованиеТипов.ПолучитьСтроку(Долгота); OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура); IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); URL = "api.telegram.org/bot" + Токен + "/sendLocation"; Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode" , "Markdown"); Параметры_.Вставить("latitude" , OPI_Инструменты.ЧислоВСтроку(Широта)); Параметры_.Вставить("longitude" , OPI_Инструменты.ЧислоВСтроку(Долгота)); Параметры_.Вставить("reply_markup", Клавиатура); ДобавитьИдентификаторЧата(IDЧата, Параметры_); Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции // Отправить контакт // Отправляет контакт с именем и номером телефона // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Имя - Строка - Имя контакта - name // Фамилия - Строка - Фамилия контакта - surname // Телефон - Строка - Телефон контакта - phone // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя); OPI_ПреобразованиеТипов.ПолучитьСтроку(Фамилия); OPI_ПреобразованиеТипов.ПолучитьСтроку(Телефон); OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура); URL = "api.telegram.org/bot" + Токен + "/sendContact"; Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode" , "Markdown"); Параметры_.Вставить("first_name" , Имя); Параметры_.Вставить("last_name" , Фамилия); Параметры_.Вставить("phone_number", Телефон); Параметры_.Вставить("reply_markup", Клавиатура); ДобавитьИдентификаторЧата(IDЧата, Параметры_); Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции // Отправить опрос // Отправляет опрос с вариантами ответа // Пример строки массива вариантов ответа // --options ""['Вар1','Вар2']"" // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Вопрос - Строка - Вопрос опроса - question // МассивОтветов - Массив из Строка - Массив вариантов ответа - options - Массив // Анонимный - Булево - Анонимность опроса - anonymous // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(Вопрос); OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивОтветов, Истина); OPI_ПреобразованиеТипов.ПолучитьБулево(Анонимный); URL = "api.telegram.org/bot" + Токен + "/sendPoll"; Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode", "Markdown"); Параметры_.Вставить("question" , Вопрос); Параметры_.Вставить("options" , МассивОтветов); Если Не Анонимный Тогда Параметры_.Вставить("is_anonymous", Ложь); КонецЕсли; ДобавитьИдентификаторЧата(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"; Параметры_ = Новый Структура; Параметры_.Вставить("from_chat_id", ОткудаID); Параметры_.Вставить("message_id" , IDОригинала); ДобавитьИдентификаторЧата(КудаID, Параметры_); Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции #КонецОбласти #Область Администрирование // Бан // Банит пользователя в выбранном чате // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // IDПользователя - Строка,Число - ID целевого пользователя - user // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя); URL = "api.telegram.org/bot" + Токен + "/banChatMember"; Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode", "Markdown"); Параметры_.Вставить("chat_id" , IDЧата); Параметры_.Вставить("user_id" , IDПользователя); Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции // Разбан // Разбанивает забаненного ранее пользователя // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // IDПользователя - Строка,Число - ID целевого пользователя - user // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя); URL = "api.telegram.org/bot" + Токен + "/unbanChatMember"; Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode" , "Markdown"); Параметры_.Вставить("chat_id" , IDЧата); Параметры_.Вставить("user_id" , IDПользователя); Параметры_.Вставить("only_if_banned", Ложь); Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции // Создать ссылку-приглашение // Создает ссылку для вступления в закрытый чат // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat // Заголовок - Строка - Заголовок приглашения - title // ДатаИстечения - Дата - Дата окончания жизни ссылки (безсрочно, если не указано) - expire // ЛимитПользователей - Число - Лимит пользователей (бесконечно, если не указано) - limit // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция СоздатьСсылкуПриглашение(Знач Токен , Знач IDЧата , Знач Заголовок = "" , Знач ДатаИстечения = "" , Знач ЛимитПользователей = 0) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); OPI_ПреобразованиеТипов.ПолучитьСтроку(ЛимитПользователей); OPI_ПреобразованиеТипов.ПолучитьДату(ДатаИстечения); URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink"; Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode", "Markdown"); Параметры_.Вставить("chat_id" , IDЧата); Параметры_.Вставить("name" , Заголовок); Если ЗначениеЗаполнено(ДатаИстечения) Тогда ДатаИстечения = OPI_Инструменты.UNIXTime(ДатаИстечения); Параметры_.Вставить("expire_date", ДатаИстечения); КонецЕсли; Параметры_.Вставить("member_limit", ЛимитПользователей); Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции // Закрепить сообщение // Закрепляет сообщение в шапке чата // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка,Число - ID целевого чата - chat // IDСообщения - Строка,Число - ID целевого сообщения - message // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСообщения); URL = "api.telegram.org/bot" + Токен + "/pinChatMessage"; Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode" , "Markdown"); Параметры_.Вставить("chat_id" , IDЧата); Параметры_.Вставить("message_id" , IDСообщения); Параметры_.Вставить("disable_notification", Истина); Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции // Открепить сообщение // Открепляет сообщение в шапке чата // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата - chat // IDСообщения - Строка,Число - ID целевого сообщения - message // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСообщения); URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage"; Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode", "Markdown"); Параметры_.Вставить("chat_id" , IDЧата); Параметры_.Вставить("message_id", IDСообщения); Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции // Получить число участников // Получает общее число участников чата // // Параметры: // Токен - Строка - Токен бота - token // IDЧата - Строка,Число - ID целевого чата - chat // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount"; Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode", "Markdown"); Параметры_.Вставить("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 // Заголовок - Строка - Новое имя главной темы - name // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); Параметры_ = Новый Структура; Параметры_.Вставить("chat_id", IDЧата); Параметры_.Вставить("name" , Заголовок); URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic"; Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции // Очистить список закрепленных сообщений темы // Очищает список закрепленных сообщений в теме форума // // Параметры: // Токен - Строка - Токен - token // IDЧата - Строка,Число - ID чата темы - forum // IDТемы - Строка,Число - ID темы. Главная, если не заполнено - topic // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы); Параметры_ = Новый Структура; Параметры_.Вставить("chat_id", IDЧата); Если ЗначениеЗаполнено(IDТемы) Тогда Метод = "/unpinAllForumTopicMessages"; Параметры_.Вставить("message_thread_id", IDТемы); Иначе Метод = "/unpinAllGeneralForumTopicMessages"; КонецЕсли; URL = "api.telegram.org/bot" + Токен + Метод; Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции #КонецОбласти #Область Прочее // Сформировать клавиатуру по массиву кнопок // Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели // Пример строки массива кнопок: // --buttons ""['Кнопка1','Кнопка2']"" // // Параметры: // МассивКнопок - Массив из Строка - Массив кнопок - buttons - Массив // ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели - under // ОднаПодОдной - Булево - Истина > кнопки выводятся в столбик, Ложь > в строку - column // // Возвращаемое значение: // Строка - JSON клавиатуры Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок , Знач ПодСообщением = Ложь , Знач ОднаПодОдной = Истина) Экспорт OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением); OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной); OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); Если ОднаПодОдной Тогда Строки = СоздатьВысокуюКлавиатуру(МассивКнопок); Иначе Строки = СоздатьДлиннуюКлваиатуру(МассивКнопок); КонецЕсли; Если ПодСообщением Тогда СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1); Иначе СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина); КонецЕсли; ЗаписьJSON = Новый ЗаписьJSON; ПЗJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, , , ЭкранированиеСимволовJSON.СимволыВнеASCII); ЗаписьJSON.УстановитьСтроку(ПЗJSON); ЗаписатьJSON(ЗаписьJSON, СтруктураПараметра); Возврат ЗаписьJSON.Закрыть(); КонецФункции #КонецОбласти #КонецОбласти #Область СлужебныеПроцедурыИФункции Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура) OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид); OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура); Расширение = ""; Метод = ""; ОпределитьМетодОтправки(Вид, Метод, Расширение); OPI_Инструменты.ЗаменитьСпецсимволы(Текст); Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда ТекущийФайл = Новый Файл(Файл); Расширение = ?(Вид = "document" Или Вид = "animation", ТекущийФайл.Расширение, ""); OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); КонецЕсли; Расширение = СтрЗаменить(Расширение, ".", "___"); Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode" , "Markdown"); Параметры_.Вставить("caption" , Текст); Параметры_.Вставить("reply_markup", Клавиатура); ДобавитьИдентификаторЧата(IDЧата, Параметры_); СтруктураФайлов = Новый Структура; СтруктураФайлов.Вставить(Вид + Расширение, Файл); URL = "api.telegram.org/bot" + Токен + Метод; Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, СтруктураФайлов, "mixed"); Возврат Ответ; КонецФункции Функция УправлениеТемойФорума(Знач Токен , Знач IDЧата , Знач Заголовок = Неопределено , Знач IDИконки = Неопределено , Знач IDТемы = "") OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы); Параметры_ = Новый Структура; Параметры_.Вставить("name" , Заголовок); Параметры_.Вставить("chat_id" , IDЧата); Параметры_.Вставить("icon_custom_emoji_id", IDИконки); Если ЗначениеЗаполнено(IDТемы) Тогда Метод = "/editForumTopic"; Параметры_.Вставить("message_thread_id", IDТемы); Иначе Метод = "/createForumTopic"; КонецЕсли; OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры_); Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры_); Возврат Ответ; КонецФункции Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач Статус, Знач IDТемы = "") OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы); Если ЗначениеЗаполнено(IDТемы) Тогда Форум = "Forum"; Иначе Форум = "GeneralForum"; КонецЕсли; IDТемы = OPI_Инструменты.ЧислоВСтроку(IDТемы); IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); Метод = ОпределитьМетодУправленияФорумом(Статус, Форум); Параметры_ = Новый Структура; Параметры_.Вставить("chat_id", IDЧата); Если ЗначениеЗаполнено(IDТемы) Тогда Параметры_.Вставить("message_thread_id", IDТемы); КонецЕсли; URL = "api.telegram.org/bot" + Токен + Метод; Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; КонецФункции Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть) OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть); Если Скрыть Тогда Метод = "/hideGeneralForumTopic"; Иначе Метод = "/unhideGeneralForumTopic"; КонецЕсли; Параметры_ = Новый Структура; Параметры_.Вставить("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_ПреобразованиеТипов.ПолучитьСтроку(Текст); Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда Двоичные = ТекущийФайл.Ключ; 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"; Иначе ВызватьИсключение "Некорректный вид отправки"; КонецЕсли; КонецПроцедуры #КонецОбласти