1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-16 11:38:11 +02:00
OpenIntegrations/OInt/core/Modules/OPI_Telegram.os
2024-03-23 20:00:54 +00:00

1113 lines
59 KiB
Plaintext

// 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
Функция ПолучитьИнформациюБота(Знач Токен) Экспорт
URL = "api.telegram.org/bot" + Токен + "/getMe";
Ответ = OPI_Инструменты.Get(URL);
Возврат Ответ;
КонецФункции
// Получить обновления
// Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме
//
// Параметры:
// Токен - Строка - Токен бота - token
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПолучитьОбновления(Знач Токен) Экспорт
URL = "api.telegram.org/bot" + Токен + "/getUpdates";
Ответ = OPI_Инструменты.Get(URL);
Возврат Ответ;
КонецФункции
// Установить Webhook
// Устанавливает адрес обработчика событий бота для работы в режиме webhook.
//
// Параметры:
// Токен - Строка - Токен бота - token
// URL - Строка - Адрес обработки запросов от Telegram (с https:) - url
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
Параметры_ = Новый Структура;
Параметры_.Вставить("url", URL);
URL = "api.telegram.org/bot" + Токен + "/setWebHook";
Ответ = OPI_Инструменты.Get(URL, Параметры_);
Возврат Ответ;
КонецФункции
// Удалить Webhook
// Удаляет адрес обработчика событий бота для работы в режиме webhook.
//
// Параметры:
// Токен - Строка - Токен бота - token
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция УдалитьWebhook(Знач Токен) Экспорт
URL = "api.telegram.org/bot" + Токен + "/deleteWebHook";
Ответ = OPI_Инструменты.Get(URL);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область ОтправкаДанных
// Отправить текстовое сообщение
// Отправляет текстовое сообщение в чат или канал
//
// Параметры:
// Токен - Строка - Токен бота - token
// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
// Текст - Строка - Текст сообщения - text
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьТекстовоеСообщение(Знач Токен, Знач IDЧата, Знач Текст, Знач Клавиатура = "") Экспорт
OPI_Инструменты.ЗаменитьСпецСимволы(Текст);
Параметры_ = Новый Структура;
Параметры_.Вставить("parse_mode" , "Markdown");
Параметры_.Вставить("text" , Текст);
Параметры_.Вставить("reply_markup", Клавиатура);
ДобавитьИдентификаторЧата(IDЧата, Параметры_);
URL = "api.telegram.org/bot" + Токен + "/sendMessage";
Ответ = OPI_Инструменты.Get(URL, Параметры_);
Возврат Ответ;
КонецФункции
// Отправить картинку
// Отправляет картинку в чат или канал
//
// Параметры:
// Токен - Строка - Токен бота - token
// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
// Текст - Строка - Текст сообщения - text
// Картинка - ДвоичныеДанные,Строка - Файл картинки - path
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьКартинку(Знач Токен, Знач IDЧата, Знач Текст, Знач Картинка, Знач Клавиатура = "") Экспорт
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура);
КонецФункции
// Отправить видео
// Отправляет видео в чат или канал
//
// Параметры:
// Токен - Строка - Токен бота - token
// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
// Текст - Строка - Текст сообщения - text
// Видео - ДвоичныеДанные,Строка - Файл видео - path
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьВидео(Знач Токен, Знач IDЧата, Знач Текст, Знач Видео, Знач Клавиатура = "") Экспорт
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура);
КонецФункции
// Отправить аудио
// Отправляет аудиофайл в чат или канал
//
// Параметры:
// Токен - Строка - Токен бота - token
// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
// Текст - Строка - Текст сообщения - text
// Аудио - ДвоичныеДанные,Строка - Файл аудио - path
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьАудио(Знач Токен, Знач IDЧата, Знач Текст, Знач Аудио, Знач Клавиатура = "") Экспорт
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура);
КонецФункции
// Отправить документ
// Отправляет документ в чат или канал
//
// Параметры:
// Токен - Строка - Токен бота - token
// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
// Текст - Строка - Текст сообщения - text
// Документ - ДвоичныеДанные,Строка - Файл документа - path
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьДокумент(Знач Токен, Знач IDЧата, Знач Текст, Знач Документ, Знач Клавиатура = "") Экспорт
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура);
КонецФункции
// Отправить гифку
// Отправляет гифку в чат или канал
//
// Параметры:
// Токен - Строка - Токен бота - token
// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
// Текст - Строка - Текст сообщения - text
// Гифка - ДвоичныеДанные,Строка - Файл гифки - path
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьГифку(Знач Токен, Знач IDЧата, Знач Текст, Знач Гифка, Знач Клавиатура = "") Экспорт
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура);
КонецФункции
// Отправить группу медиафайлов
// Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video
//
// Параметры:
// Токен - Строка - Токен бота - token
// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
// Текст - Строка - Текст сообщения - text
// СоответствиеФайлов - Соответствие из Строка - Коллекция файлов - path - JSON - JSON вида { "Путь": "Тип", ...}:
// * Ключ - ДвоичныеДанные,Строка - Файл
// * Значение - Строка - Тип файла: audio, document, photo, video
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьМедиагруппу(Знач Токен, Знач IDЧата, Знач Текст, Знач СоответствиеФайлов, Знач Клавиатура = "") Экспорт
// СоответствиеФайлов
// Ключ - Файл, Значение - Тип
// Типы: audio, document, photo, video
// Нельзя замешивать разные типы!
OPI_Инструменты.ЗаменитьСпецсимволы(Текст);
URL = "api.telegram.org/bot" + Токен + "/sendMediaGroup";
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
СтруктураФайлов = Новый Структура;
Медиа = Новый Массив;
Параметры_ = Новый Структура;
Параметры_.Вставить("parse_mode" , "Markdown");
Параметры_.Вставить("caption" , Текст);
Параметры_.Вставить("reply_markup", Клавиатура);
ДобавитьИдентификаторЧата(IDЧата, Параметры_);
СформироватьМассивМедиа(СоответствиеФайлов, Текст, СтруктураФайлов, Медиа);
Параметры_.Вставить("media", Медиа);
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, СтруктураФайлов, "mixed");
Возврат Ответ;
КонецФункции
// Отправить местоположение
// Отправляет местоположение по географической широте и долготе в чат или канал
//
// Параметры:
// Токен - Строка - Токен бота - token
// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
// Широта - Строка,Число - Географическая широта - lat
// Долгота - Строка,Число - Географическая долгота - long
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - Текст
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт
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Чата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
URL = "api.telegram.org/bot" + Токен + "/sendContact";
Параметры_ = Новый Структура;
Параметры_.Вставить("parse_mode" , "Markdown");
Параметры_.Вставить("first_name" , Имя);
Параметры_.Вставить("last_name" , Фамилия);
Параметры_.Вставить("phone_number", Строка(Телефон));
Параметры_.Вставить("reply_markup", Клавиатура);
ДобавитьИдентификаторЧата(IDЧата, Параметры_);
Ответ = OPI_Инструменты.Get(URL, Параметры_);
Возврат Ответ;
КонецФункции
// Отправить опрос
// Отправляет опрос с вариантами ответа
//
// Параметры:
// Токен - Строка - Токен бота - token
// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
// Вопрос - Строка - Вопрос опроса - question
// МассивОтветов - Массив из Строка - Массив вариантов ответа - options - Массив - Массив вида ["Вар1","Вар2",..]
// Анонимный - Булево - Анонимность опроса - anonymous
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
Ответы = OPI_Инструменты.JSONСтрокой(МассивОтветов);
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) Экспорт
URL = "api.telegram.org/bot" + Токен + "/forwardMessage";
IDОригинала = OPI_Инструменты.ЧислоВСтроку(IDОригинала);
ОткудаID = OPI_Инструменты.ЧислоВСтроку(ОткудаID);
КудаID = OPI_Инструменты.ЧислоВСтроку(КудаID);
Параметры_ = Новый Структура;
Параметры_.Вставить("from_chat_id", ОткудаID);
Параметры_.Вставить("message_id" , IDОригинала);
ДобавитьИдентификаторЧата(КудаID, Параметры_);
Ответ = OPI_Инструменты.Get(URL, Параметры_);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область Администрирование
// Бан
// Банит пользователя в выбранном чате
//
// Параметры:
// Токен - Строка - Токен бота - token
// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
// IDПользователя - Строка,Число - ID целевого пользователя - user
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт
URL = "api.telegram.org/bot" + Токен + "/banChatMember";
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
IDПользователя = OPI_Инструменты.ЧислоВСтроку(IDПользователя);
Параметры_ = Новый Структура;
Параметры_.Вставить("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Пользователя) Экспорт
URL = "api.telegram.org/bot" + Токен + "/unbanChatMember";
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
IDПользователя = OPI_Инструменты.ЧислоВСтроку(IDПользователя);
Параметры_ = Новый Структура;
Параметры_.Вставить("parse_mode" , "Markdown");
Параметры_.Вставить("chat_id" , IDЧата);
Параметры_.Вставить("user_id" , IDПользователя);
Параметры_.Вставить("only_if_banned", Ложь);
Ответ = OPI_Инструменты.Get(URL, Параметры_);
Возврат Ответ;
КонецФункции
// Создать ссылку-приглашение
// Создает ссылку для вступления в закрытый чат
//
// Параметры:
// Токен - Строка - Токен бота - token
// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
// Заголовок - Строка - Заголовок приглашения - name
// ДатаИстечения - Дата - Дата окончания жизни ссылки (безсрочно, если не указано) - expire
// ЛимитПользователей - Число - Лимит пользователей (бесконечно, если не указано) - limit
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция СоздатьСсылкуПриглашение(Знач Токен
, Знач IDЧата
, Знач Заголовок = ""
, Знач ДатаИстечения = ""
, Знач ЛимитПользователей = 0) Экспорт
URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink";
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
Параметры_ = Новый Структура;
Параметры_.Вставить("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Сообщения) Экспорт
URL = "api.telegram.org/bot" + Токен + "/pinChatMessage";
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
IDСообщения = OPI_Инструменты.ЧислоВСтроку(IDСообщения);
Параметры_ = Новый Структура;
Параметры_.Вставить("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Сообщения) Экспорт
URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage";
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
IDСообщения = OPI_Инструменты.ЧислоВСтроку(IDСообщения);
Параметры_ = Новый Структура;
Параметры_.Вставить("parse_mode", "Markdown");
Параметры_.Вставить("chat_id" , IDЧата);
Параметры_.Вставить("message_id", IDСообщения);
Ответ = OPI_Инструменты.Get(URL, Параметры_);
Возврат Ответ;
КонецФункции
// Получить число участников
// Получает общее число участников чата
//
// Параметры:
// Токен - Строка - Токен бота - token
// IDЧата - Строка,Число - ID целевого чата - chat
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт
URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount";
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
Параметры_ = Новый Структура;
Параметры_.Вставить("parse_mode", "Markdown");
Параметры_.Вставить("chat_id" , IDЧата);
Ответ = OPI_Инструменты.Get(URL, Параметры_);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область TelegramMiniApp
// Обработать данные TMA и определить их достоверность !NOCLI
//
// Параметры:
// СтрокаДанных - Строка - querry из Telegram.WebApp.initData
// Токен - Строка - Токен бота
//
// Возвращаемое значение:
// Соответствие из Строка - Обработанные данные с признаком достоверности
Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт
СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL);
СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных);
Ключ = "WebAppData";
Хэш = "";
КлючДвоичные = ПолучитьДвоичныеДанныеИзСтроки(Ключ);
Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен));
ТЗнач = Новый ТаблицаЗначений;
ТЗнач.Колонки.Добавить("Ключ");
ТЗнач.Колонки.Добавить("Значение");
Для Каждого Данные Из СтруктураДанных Цикл
НоваяСтрока = ТЗнач.Добавить();
НоваяСтрока.Ключ = Данные.Ключ;
НоваяСтрока.Значение = Данные.Значение;
КонецЦикла;
ТЗнач.Сортировать("Ключ");
СоответствиеВозврата = Новый Соответствие;
DCS = "";
Для Каждого СтрокаТЗ Из ТЗнач Цикл
Если СтрокаТЗ.Ключ <> "hash" Тогда
DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС;
СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение);
Иначе
Хэш = СтрокаТЗ.Значение;
КонецЕсли;
КонецЦикла;
DCS = Лев(DCS, СтрДлина(DCS) - 1);
Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS));
Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись);
Если Финал = вРег(Хэш) Тогда
Ответ = Истина;
Иначе
Ответ = Ложь;
КонецЕсли;
СоответствиеВозврата.Вставить("passed", Ответ);
Возврат СоответствиеВозврата;
КонецФункции
#КонецОбласти
#Область РежимФорума
// Получить список иконок-аватаров
// Получает соответствие ID Emoji для установки в качестве иконок тем форума
//
// Параметры:
// Токен - Строка - Токен - token
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji
Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт
Result = "result";
URL = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers";
Ответ = OPI_Инструменты.Get(URL);
Иконки = Ответ[Result];
Коллекция = Новый Соответствие;
Для Каждого Иконка Из Иконки Цикл
Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]);
КонецЦикла;
Возврат Коллекция;
КонецФункции
// Создать тему форума
// Создает новую тему в группе с включенным функционалом тем
//
// Параметры:
// Токен - Строка - Токен - token
// IDЧата - Строка,Число - ID чата создания темы - chat
// Заголовок - Строка - Заголовок темы - name
// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт
Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки);
КонецФункции
// Изменить тему форума
// Создает новую тему в группе с включенным функционалом тем
//
// Параметры:
// Токен - Строка - Токен - token
// IDЧата - Строка,Число - ID чата создания темы - chat
// IDТемы - Строка,Число - ID темы - topic
// Заголовок - Строка - Новый заголовок - name
// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ИзменитьТемуФорума(Знач Токен
, Знач IDЧата
, Знач IDТемы
, Знач Заголовок = Неопределено
, Знач IDИконки = Неопределено) Экспорт
Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы);
КонецФункции
// Закрыть тему форума
// Закрывает тему для новых сообщений
//
// Параметры:
// Токен - Строка - Токен - token
// IDЧата - Строка,Число - ID чата темы - chat
// IDТемы - Строка,Число - ID темы - topic
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы);
КонецФункции
// Открыть тему форума
// Повторно открывает ранее закрытую тему форума
//
// Параметры:
// Токен - Строка - Токен - token
// IDЧата - Строка,Число - ID чата темы - chat
// IDТемы - Строка,Число - ID темы - topic
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы);
КонецФункции
// Удалить тему форума
// Удаляет тему форума
//
// Параметры:
// Токен - Строка - Токен - token
// IDЧата - Строка,Число - ID чата темы - chat
// IDТемы - Строка,Число - ID темы - topic
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт
Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы);
КонецФункции
// Скрыть главную тему форума
// Скрывает главную тему форума
//
// Параметры:
// Токен - Строка - Токен - token
// IDЧата - Строка,Число - ID чата темы - chat
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт
Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина);
КонецФункции
// Показать главную тему форума
// Показывает ранее скрытую главную тему форума
//
// Параметры:
// Токен - Строка - Токен - token
// IDЧата - Строка,Число - ID чата темы - chat
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт
Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь);
КонецФункции
// Изменить имя главной темы форума
// Изменяет имя главной темы форума
//
// Параметры:
// Токен - Строка - Токен - token
// IDЧата - Строка,Число - ID чата темы - chat
// Заголовок - Строка - Новое имя главной темы - name
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
Параметры_ = Новый Структура;
Параметры_.Вставить("chat_id", IDЧата);
Параметры_.Вставить("name" , Заголовок);
URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic";
Ответ = OPI_Инструменты.Get(URL, Параметры_);
Возврат Ответ;
КонецФункции
// Очистить список закрепленных сообщений темы
// Очищает список закрепленных сообщений в теме форума
//
// Параметры:
// Токен - Строка - Токен - token
// IDЧата - Строка,Число - ID чата темы - chat
// IDТемы - Строка,Число - ID темы. Главная, если не заполнено - topic
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
IDТемы = OPI_Инструменты.ЧислоВСтроку(IDТемы);
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",..]
// ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели - under
// ОднаПодОдной - Булево - Истина > кнопки выводятся в столбик, Ложь > в строку - coloumn
//
// Возвращаемое значение:
// Строка - JSON клавиатуры
Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок
, Знач ПодСообщением = Ложь
, Знач ОднаПодОдной = Истина) Экспорт
Если ОднаПодОдной Тогда
Строки = СоздатьВысокуюКлавиатуру(МассивКнопок);
Иначе
Строки = СоздатьДлиннуюКлваиатуру(МассивКнопок);
КонецЕсли;
Если ПодСообщением Тогда
СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1);
Иначе
СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина);
КонецЕсли;
ЗаписьJSON = Новый ЗаписьJSON;
ПЗJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, , , ЭкранированиеСимволовJSON.СимволыВнеASCII);
ЗаписьJSON.УстановитьСтроку(ПЗJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураПараметра);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура)
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
Расширение = "";
Метод = "";
ОпределитьМетодОтправки(Вид, Метод, Расширение);
OPI_Инструменты.ЗаменитьСпецсимволы(Текст);
Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
ТекущийФайл = Новый Файл(Файл);
Расширение = ?(Вид = "document" Или Вид = "animation", ТекущийФайл.Расширение, "");
Файл = OPI_Инструменты.ПолучитьДвоичныеДанные(Файл);
КонецЕсли;
Расширение = СтрЗаменить(Расширение, ".", "___");
Параметры_ = Новый Структура;
Параметры_.Вставить("parse_mode" , "Markdown");
Параметры_.Вставить("caption" , Текст);
Параметры_.Вставить("reply_markup", Клавиатура);
ДобавитьИдентификаторЧата(IDЧата, Параметры_);
СтруктураФайлов = Новый Структура;
СтруктураФайлов.Вставить(Вид + Расширение, Файл);
URL = "api.telegram.org/bot" + Токен + Метод;
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, СтруктураФайлов, "mixed");
Возврат Ответ;
КонецФункции
Функция УправлениеТемойФорума(Знач Токен
, Знач IDЧата
, Знач Заголовок = Неопределено
, Знач IDИконки = Неопределено
, Знач IDТемы = "")
IDТемы = OPI_Инструменты.ЧислоВСтроку(IDТемы);
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Темы = "")
Если ЗначениеЗаполнено(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Чата, Знач Скрыть)
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
Если Скрыть Тогда
Метод = "/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_Инструменты.ПолучитьДвоичныеДанные(ТекущийФайл.Ключ);
ЭтотФайл = Новый Файл(ТекущийФайл.Ключ);
ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик) + ?(ТекущийФайл.Значение = "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";
Иначе
ВызватьИсключение "Некорректный вид отправки";
КонецЕсли;
КонецПроцедуры
#КонецОбласти