diff --git a/OPI/src/CommonModules/OPI_Telegram/Module.bsl b/OPI/src/CommonModules/OPI_Telegram/Module.bsl index e3d40dd852..d68fb1411e 100644 --- a/OPI/src/CommonModules/OPI_Telegram/Module.bsl +++ b/OPI/src/CommonModules/OPI_Telegram/Module.bsl @@ -37,7 +37,9 @@ // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ПолучитьИнформациюБота(Знач Токен) Экспорт - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getMe"); + URL = "api.telegram.org/bot" + Токен + "/getMe"; + Ответ = OPI_Инструменты.Get(URL); + Возврат Ответ; КонецФункции @@ -51,7 +53,8 @@ // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ПолучитьОбновления(Знач Токен) Экспорт - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getUpdates"); + URL = "api.telegram.org/bot" + Токен + "/getUpdates"; + Ответ = OPI_Инструменты.Get(URL); Возврат Ответ; КонецФункции @@ -69,7 +72,9 @@ Параметры_ = Новый Структура; Параметры_.Вставить("url", URL); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/setWebHook", Параметры_); + URL = "api.telegram.org/bot" + Токен + "/setWebHook"; + Ответ = OPI_Инструменты.Get(URL, Параметры_); + Возврат Ответ; КонецФункции @@ -83,7 +88,8 @@ // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция УдалитьWebhook(Знач Токен) Экспорт - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/deleteWebHook"); + URL = "api.telegram.org/bot" + Токен + "/deleteWebHook"; + Ответ = OPI_Инструменты.Get(URL); Возврат Ответ; КонецФункции @@ -201,15 +207,16 @@ Функция ОтправитьТекстовоеСообщение(Знач Токен, Знач IDЧата, Знач Текст, Знач Клавиатура = "") Экспорт OPI_Инструменты.ЗаменитьСпецСимволы(Текст); - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - + Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("text", Текст); - Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("parse_mode" , "Markdown"); + Параметры_.Вставить("text" , Текст); Параметры_.Вставить("reply_markup", Клавиатура); - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendMessage", Параметры_); + + ДобавитьИдентификаторЧата(IDЧата, Параметры_); + + URL = "api.telegram.org/bot" + Токен + "/sendMessage"; + Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; @@ -323,56 +330,26 @@ OPI_Инструменты.ЗаменитьСпецсимволы(Текст); + URL = "api.telegram.org/bot" + Токен + "/sendMediaGroup"; IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - СтруктураФайлов = Новый Структура; - Медиа = Новый Массив; - Счетчик = 0; + СтруктураФайлов = Новый Структура; + Медиа = Новый Массив; Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("caption", Текст); - Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("parse_mode" , "Markdown"); + Параметры_.Вставить("caption" , Текст); Параметры_.Вставить("reply_markup", Клавиатура); + + ДобавитьИдентификаторЧата(IDЧата, Параметры_); + СформироватьМассивМедиа(СоответствиеФайлов, Текст, СтруктураФайлов, Медиа); + + Параметры_.Вставить("media", Медиа); - Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл - - Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда - ДД = Новый ДвоичныеДанные(ТекущийФайл.Ключ); - ЭтотФайл = Новый Файл(ТекущийФайл.Ключ); - ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик) + ?(ТекущийФайл.Значение = "document", - ЭтотФайл.Расширение, ""); - ПолноеИмяМедиа = СтрЗаменить(ИмяМедиа, ".", "___"); - Иначе - ДД = ТекущийФайл.Ключ; - ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик); - ПолноеИмяМедиа = ИмяМедиа; - КонецЕсли; - - СтруктураФайлов.Вставить(ПолноеИмяМедиа, ДД); - - СтруктураМедиа = Новый Структура; - СтруктураМедиа.Вставить("type", ТекущийФайл.Значение); - СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа); - - Если Счетчик = 0 Тогда - СтруктураМедиа.Вставить("caption", Текст); - КонецЕсли; - - Медиа.Добавить(СтруктураМедиа); - - Счетчик = Счетчик + 1; - - КонецЦикла; - - Параметры_.Вставить("media", OPI_Инструменты.JSONСтрокой(Медиа)); - - Ответ = OPI_Инструменты.PostMultipart("api.telegram.org/bot" + Токен + "/sendMediaGroup", Параметры_, - СтруктураФайлов, "mixed"); + Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, СтруктураФайлов, "mixed"); Возврат Ответ; КонецФункции -// BSLLS:Typo-on // Отправить местоположение. // @@ -388,15 +365,17 @@ Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - + URL = "api.telegram.org/bot" + Токен + "/sendLocation"; + Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("chat_id", IDЧата); - Параметры_.Вставить("latitude", OPI_Инструменты.ЧислоВСтроку(Широта)); - Параметры_.Вставить("longitude", OPI_Инструменты.ЧислоВСтроку(Долгота)); + Параметры_.Вставить("parse_mode" , "Markdown"); + Параметры_.Вставить("latitude" , OPI_Инструменты.ЧислоВСтроку(Широта)); + Параметры_.Вставить("longitude" , OPI_Инструменты.ЧислоВСтроку(Долгота)); Параметры_.Вставить("reply_markup", Клавиатура); + + ДобавитьИдентификаторЧата(IDЧата, Параметры_); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendLocation", Параметры_); + Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; @@ -417,16 +396,18 @@ Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + URL = "api.telegram.org/bot" + Токен + "/sendContact"; Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("chat_id", IDЧата); - Параметры_.Вставить("first_name", Имя); - Параметры_.Вставить("last_name", Фамилия); + Параметры_.Вставить("parse_mode" , "Markdown"); + Параметры_.Вставить("first_name" , Имя); + Параметры_.Вставить("last_name" , Фамилия); Параметры_.Вставить("phone_number", Строка(Телефон)); Параметры_.Вставить("reply_markup", Клавиатура); + + ДобавитьИдентификаторЧата(IDЧата, Параметры_); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendContact", Параметры_); + Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; @@ -447,18 +428,20 @@ IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); Ответы = OPI_Инструменты.JSONСтрокой(МассивОтветов); + URL = "api.telegram.org/bot" + Токен + "/sendPoll"; Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("chat_id", IDЧата); - Параметры_.Вставить("question", Вопрос); - Параметры_.Вставить("options", Ответы); + Параметры_.Вставить("question" , Вопрос); + Параметры_.Вставить("options" , Ответы); Если Не Анонимный Тогда Параметры_.Вставить("is_anonymous", Ложь); - КонецЕсли; + КонецЕсли; + + ДобавитьИдентификаторЧата(IDЧата, Параметры_); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendPoll", Параметры_); + Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; @@ -476,16 +459,18 @@ // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт + URL = "api.telegram.org/bot" + Токен + "/forwardMessage"; IDОригинала = OPI_Инструменты.ЧислоВСтроку(IDОригинала); ОткудаID = OPI_Инструменты.ЧислоВСтроку(ОткудаID); КудаID = OPI_Инструменты.ЧислоВСтроку(КудаID); Параметры_ = Новый Структура; - Параметры_.Вставить("chat_id", КудаID); Параметры_.Вставить("from_chat_id", ОткудаID); - Параметры_.Вставить("message_id", IDОригинала); + Параметры_.Вставить("message_id" , IDОригинала); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/forwardMessage", Параметры_); + ДобавитьИдентификаторЧата(КудаID, Параметры_); + + Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; @@ -506,15 +491,16 @@ // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт + URL = "api.telegram.org/bot" + Токен + "/banChatMember"; IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); IDПользователя = OPI_Инструменты.ЧислоВСтроку(IDПользователя); Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("chat_id", IDЧата); - Параметры_.Вставить("user_id", IDПользователя); + Параметры_.Вставить("chat_id" , IDЧата); + Параметры_.Вставить("user_id" , IDПользователя); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/banChatMember", Параметры_); + Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; @@ -531,16 +517,17 @@ // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт + URL = "api.telegram.org/bot" + Токен + "/unbanChatMember"; IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); IDПользователя = OPI_Инструменты.ЧислоВСтроку(IDПользователя); Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("chat_id", IDЧата); - Параметры_.Вставить("user_id", IDПользователя); + Параметры_.Вставить("parse_mode" , "Markdown"); + Параметры_.Вставить("chat_id" , IDЧата); + Параметры_.Вставить("user_id" , IDПользователя); Параметры_.Вставить("only_if_banned", Истина); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/unbanChatMember", Параметры_); + Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; @@ -557,15 +544,19 @@ // // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram -Функция СоздатьСсылкуПриглашение(Знач Токен, Знач IDЧата, Знач Заголовок = "", Знач ДатаИстечения = "", - Знач ЛимитПользователей = 0) Экспорт +Функция СоздатьСсылкуПриглашение(Знач Токен + , Знач IDЧата + , Знач Заголовок = "" + , Знач ДатаИстечения = "" + , Знач ЛимитПользователей = 0) Экспорт - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink"; + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("chat_id", IDЧата); - Параметры_.Вставить("name", Заголовок); + Параметры_.Вставить("chat_id" , IDЧата); + Параметры_.Вставить("name" , Заголовок); Если ЗначениеЗаполнено(ДатаИстечения) Тогда Параметры_.Вставить("expire_date", Формат(ДатаИстечения - Дата(1970, 1, 1, 1, 0, 0), "ЧГ=0")); @@ -573,7 +564,7 @@ Параметры_.Вставить("member_limit", ЛимитПользователей); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/createChatInviteLink", Параметры_); + Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; @@ -590,16 +581,17 @@ // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт + URL = "api.telegram.org/bot" + Токен + "/pinChatMessage"; IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); IDСообщения = OPI_Инструменты.ЧислоВСтроку(IDСообщения); Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("chat_id", IDЧата); - Параметры_.Вставить("message_id", IDСообщения); + Параметры_.Вставить("parse_mode" , "Markdown"); + Параметры_.Вставить("chat_id" , IDЧата); + Параметры_.Вставить("message_id" , IDСообщения); Параметры_.Вставить("disable_notification", Истина); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/pinChatMessage", Параметры_); + Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; @@ -616,15 +608,16 @@ // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт + URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage"; IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); IDСообщения = OPI_Инструменты.ЧислоВСтроку(IDСообщения); Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("chat_id" , IDЧата); Параметры_.Вставить("message_id", IDСообщения); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/unpinChatMessage", Параметры_); + Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; @@ -640,13 +633,14 @@ // ДвоичныеДанные, Неопределено, Произвольный - Получить число участников Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount"; + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); Параметры_ = Новый Структура; Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("chat_id" , IDЧата); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getChatMemberCount", Параметры_); + Ответ = OPI_Инструменты.Get(URL, Параметры_); Возврат Ответ; @@ -720,6 +714,106 @@ #КонецОбласти +#Область РежимФорума + +// Получить список иконок аватаров. +// +// Параметры: +// Токен - Строка - Токен +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Список иконок аватаров +Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт + + Result = "result"; + URL = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers"; + Ответ = OPI_Инструменты.Get(URL); + Иконки = Ответ[Result]; + Коллекция = Новый Соответствие; + + Для Каждого Иконка Из Иконки Цикл + Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]); + КонецЦикла; + + Возврат Коллекция; + +КонецФункции + +// Создать тему форума. +// +// Параметры: +// Токен - Строка - Токен +// IDЧата - Строка,Число - ID чата создания темы +// Заголовок - Строка - Заголовок темы +// IDИконки - Строка - См.ПолучитьСписокИконокАватаров +// +// Возвращаемое значение: +// HTTPОтвет - Ответ сервера Telegram +Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт + Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки); +КонецФункции + +// Изменить тему форума. +// +// Параметры: +// Токен - Строка - Токен +// IDЧата - Строка,Число - ID чата темы +// IDТемы - Строка,Число - ID темы +// Заголовок - Строка - Новый заголовок +// IDИконки - Строка - См.ПолучитьСписокИконокАватаров +// +// Возвращаемое значение: +// HTTPОтвет - Ответ сервера Telegram +Функция ИзменитьТемуФорума(Знач Токен + , Знач IDЧата + , Знач IDТемы + , Знач Заголовок = Неопределено + , Знач IDИконки = Неопределено) Экспорт + + Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы); +КонецФункции + +// Закрыть тему форума. +// +// Параметры: +// Токен - Строка - Токен +// IDЧата - Строка,Число - ID чата темы +// IDТемы - Строка,Число - ID темы +// +// Возвращаемое значение: +// Неопределено, HTTPОтвет - Ответ сервера Telegram +Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт + Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, IDТемы, 2); +КонецФункции + +// Открыть тему форума. +// +// Параметры: +// Токен - Строка - Токен +// IDЧата - Строка,Число - ID чата темы +// IDТемы - Строка,Число - ID темы +// +// Возвращаемое значение: +// Неопределено, HTTPОтвет - Ответ сервера Telegram +Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт + Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, IDТемы, 1); +КонецФункции + +// Удалить тему форума. +// +// Параметры: +// Токен - Строка - Токен +// IDЧата - Строка,Число - ID чата темы +// IDТемы - Строка,Число - ID темы +// +// Возвращаемое значение: +// Неопределено, HTTPОтвет - Ответ сервера Telegram +Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт + Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, IDТемы, 3); +КонецФункции + +#КонецОбласти + #Область Прочее // Сформировать клавиатуру по массиву кнопок. @@ -783,25 +877,12 @@ Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура) + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); Расширение = ""; - - Если Вид = "photo" Тогда - Метод = "/sendPhoto"; - ИначеЕсли Вид = "video" Тогда - Метод = "/sendVideo"; - ИначеЕсли Вид = "audio" Тогда - Метод = "/sendAudio"; - ИначеЕсли Вид = "document" Тогда - Метод = "/sendDocument"; - ИначеЕсли Вид = "animation" Тогда - Метод = "/sendAnimation"; - Расширение = ".gif"; - Иначе - Возврат ""; - КонецЕсли; - + Метод = ""; + + ОпределитьМетодОтправки(Вид, Метод, Расширение); OPI_Инструменты.ЗаменитьСпецсимволы(Текст); - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда ТекущийФайл = Новый Файл(Файл); @@ -812,20 +893,152 @@ Расширение = СтрЗаменить(Расширение, ".", "___"); Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("caption", Текст); - Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("parse_mode" , "Markdown"); + Параметры_.Вставить("caption" , Текст); Параметры_.Вставить("reply_markup", Клавиатура); + + ДобавитьИдентификаторЧата(IDЧата, Параметры_); СтруктураФайлов = Новый Структура; СтруктураФайлов.Вставить(Вид + Расширение, Файл); - Ответ = OPI_Инструменты.PostMultipart("api.telegram.org/bot" + Токен + Метод, Параметры_, СтруктураФайлов, "mixed"); + URL = "api.telegram.org/bot" + Токен + Метод; + Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, СтруктураФайлов, "mixed"); Возврат Ответ; КонецФункции +Функция УправлениеТемойФорума(Знач Токен + , Знач IDЧата + , Знач Заголовок = Неопределено + , Знач IDИконки = Неопределено + , Знач IDТемы = "") + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + + Параметры_ = Новый Структура; + Параметры_.Вставить("name" , Заголовок); + Параметры_.Вставить("chat_id" , IDЧата); + Параметры_.Вставить("icon_custom_emoji_id", IDИконки); + + Если ЗначениеЗаполнено(IDТемы) Тогда + + IDТемы = OPI_Инструменты.ЧислоВСтроку(IDТемы); + Метод = "/editForumTopic"; + + Параметры_.Вставить("message_thread_id", IDТемы); + + Иначе + + Метод = "/createForumTopic"; + + КонецЕсли; + + OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры_); + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры_); + + Возврат Ответ; + +КонецФункции + +Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач IDТемы, Знач Статус) + + Если Статус = 1 Тогда + Метод = "/reopenForumTopic"; + ИначеЕсли Статус = 2 Тогда + Метод = "/closeForumTopic"; + ИначеЕсли Статус = 3 Тогда + Метод = "/deleteForumTopic"; + Иначе + Возврат Неопределено; + КонецЕсли; + + Параметры_ = Новый Структура; + Параметры_.Вставить("chat_id" , IDЧата); + Параметры_.Вставить("message_thread_id", IDТемы); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры_); + + Возврат Ответ; + +КонецФункции + +Процедура СформироватьМассивМедиа(Знач СоответствиеФайлов, Знач Текст, СтруктураФайлов, Медиа) + + Счетчик = 0; + + Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл + + Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда + ДД = Новый ДвоичныеДанные(ТекущийФайл.Ключ); + ЭтотФайл = Новый Файл(ТекущийФайл.Ключ); + ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик) + ?(ТекущийФайл.Значение = "document", + ЭтотФайл.Расширение, ""); + ПолноеИмяМедиа = СтрЗаменить(ИмяМедиа, ".", "___"); + Иначе + ДД = ТекущийФайл.Ключ; + ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик); + ПолноеИмяМедиа = ИмяМедиа; + КонецЕсли; + + СтруктураФайлов.Вставить(ПолноеИмяМедиа, ДД); + + СтруктураМедиа = Новый Структура; + СтруктураМедиа.Вставить("type", ТекущийФайл.Значение); + СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа); + + Если Счетчик = 0 Тогда + СтруктураМедиа.Вставить("caption", Текст); + КонецЕсли; + + Медиа.Добавить(СтруктураМедиа); + + Счетчик = Счетчик + 1; + + КонецЦикла; + + Медиа = OPI_Инструменты.JSONСтрокой(Медиа); + +КонецПроцедуры + +Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры) + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + МассивЧата = СтрРазделить(IDЧата, "*", Ложь); + + Если МассивЧата.Количество() > 1 Тогда + + IDЧата = МассивЧата[1]; + IDТемы = МассивЧата[2]; + + Параметры.Вставить("message_thread_id", IDТемы); + + КонецЕсли; + + Параметры.Вставить("chat_id", IDЧата); + +КонецПроцедуры + +Процедура ОпределитьМетодОтправки(Знач Вид, Метод, Расширение) + + Если Вид = "photo" Тогда + Метод = "/sendPhoto"; + ИначеЕсли Вид = "video" Тогда + Метод = "/sendVideo"; + ИначеЕсли Вид = "audio" Тогда + Метод = "/sendAudio"; + ИначеЕсли Вид = "document" Тогда + Метод = "/sendDocument"; + ИначеЕсли Вид = "animation" Тогда + Метод = "/sendAnimation"; + Расширение = ".gif"; + Иначе + ВызватьИсключение "Некорректный вид отправки"; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти // BSLLS:Typo-on \ No newline at end of file diff --git a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl index 6a73e0761a..b0c881bc45 100644 --- a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl +++ b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl @@ -225,8 +225,6 @@ Параметры = Новый Структура; КонецЕсли; - Переадресация = 300; - Ошибка = 400; ТипДанных = ?(JSON, "application/json", "application/x-www-form-urlencoded"); СтруктураURL = РазбитьURL(URL); Сервер = СтруктураURL["Сервер"]; @@ -237,10 +235,9 @@ УстановитьТелоЗапроса(Запрос, Параметры, JSON); - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; - - Если ЭтоПереадресация Тогда + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + + Если ЭтоПереадресация(Ответ) Тогда Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, JSON); Иначе ОбработатьОтвет(Ответ); @@ -256,19 +253,15 @@ Параметры = Новый Структура; КонецЕсли; - Переадресация = 300; - Ошибка = 400; СтруктураURL = РазбитьURL(URL); Сервер = СтруктураURL["Сервер"]; Адрес = СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры); Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки); - Соединение = СоздатьСоединение(Сервер); - - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - ЭтоПереадрисация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; + Соединение = СоздатьСоединение(Сервер); + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - Если ЭтоПереадрисация Тогда + Если ЭтоПереадресация(Ответ) Тогда Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки); Иначе ОбработатьОтвет(Ответ); @@ -304,7 +297,6 @@ Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); Соединение = СоздатьСоединение(Сервер); - ТелоЗапроса = Запрос.ПолучитьТелоКакПоток(); ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, "", "", Ложь); @@ -361,6 +353,17 @@ Возврат Новый HTTPСоединение(Сервер, 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL); КонецФункции +Функция ЭтоПереадресация(Знач Ответ) + + Переадресация = 300; + Ошибка = 400; + + ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; + + Возврат ЭтоПереадресация; + +КонецФункции + Процедура ОбработатьОтвет(Ответ) GZip = "gzip"; diff --git a/OPI/src/CommonModules/YAX_Тесты/Module.bsl b/OPI/src/CommonModules/YAX_Тесты/Module.bsl index 56e8353fbd..1646aaf7a2 100644 --- a/OPI/src/CommonModules/YAX_Тесты/Module.bsl +++ b/OPI/src/CommonModules/YAX_Тесты/Module.bsl @@ -25,14 +25,16 @@ .ДобавитьСерверныйТест("Телеграм_ПереслатьСообщение" , "Переслать сообщение") .ДобавитьСерверныйТест("Телеграм_БанРазбан" , "Бан/Разбан") .ДобавитьСерверныйТест("Телеграм_СоздатьСсылкуПриглашение" , "Создать ссылку-приглашение") - .ДобавитьСерверныйТест("Телеграм_ЗакрепитьОткрепитьСообщение" , "Закрепить/открепить сообщение") + .ДобавитьСерверныйТест("Телеграм_ЗакрепитьОткрепитьСообщение" , "Закрепить/Открепить сообщение") .ДобавитьСерверныйТест("Телеграм_ПолучитьЧислоУчастников" , "Получить число участников") + .ДобавитьСерверныйТест("Телеграм_ПолучитьСписокАватаровФорума", "Получить список аватаров форума") + .ДобавитьСерверныйТест("Телеграм_СоздатьУдалитьТемуФорума" , "Создать/Удалить тему форума") .ДобавитьТестовыйНабор("ВКонтакте") .ДобавитьСерверныйТест("ВК_СоздатьСсылкуТокена" , "Создать ссылку получения токена") .ДобавитьСерверныйТест("ВК_СоздатьУдалитьПост" , "Создать/Удалить пост") .ДобавитьСерверныйТест("ВК_СоздатьОпрос" , "Создать опрос") - .ДобавитьСерверныйТест("ВК_СохранитьУдалитьКартинку" , "Добавить/удалить картинку и альбом") + .ДобавитьСерверныйТест("ВК_СохранитьУдалитьКартинку" , "Добавить/Удалить картинку и альбом") .ДобавитьСерверныйТест("ВК_СоздатьИсторию" , "Создать историю") .ДобавитьСерверныйТест("ВК_МетодыОбсуждений" , "Действия с обсуждениями") .ДобавитьСерверныйТест("ВК_ЛайкРепостКоммент" , "Лайк/Репост/Комментарий") @@ -65,8 +67,8 @@ .ДобавитьСерверныйТест("ГК_ПолучитьТокен" , "Получить токен") .ДобавитьСерверныйТест("ГК_ОбновитьТокен" , "Обновить токен") .ДобавитьСерверныйТест("ГК_ПолучитьСписокКалендарей" , "Получить список календарей") - .ДобавитьСерверныйТест("ГК_СоздатьУдалитьКалендарь" , "Создать/удалить календарь") - .ДобавитьСерверныйТест("ГК_СоздатьУдалитьСобытие" , "Создать/удалить событие") + .ДобавитьСерверныйТест("ГК_СоздатьУдалитьКалендарь" , "Создать/Удалить календарь") + .ДобавитьСерверныйТест("ГК_СоздатьУдалитьСобытие" , "Создать/Удалить событие") .ДобавитьСерверныйТест("ГК_ПолучитьСписокСобытий" , "Получить список событий"); КонецПроцедуры @@ -533,6 +535,71 @@ КонецПроцедуры +Процедура Телеграм_ПолучитьСписокАватаровФорума() Экспорт + + Токен = ПолучитьПараметр("Телеграм_Токен"); + Результат = OPI_Telegram.ПолучитьСписокИконокАватаров(Токен); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип("Соответствие") + .Заполнено(); + +КонецПроцедуры + +Процедура Телеграм_СоздатьУдалитьТемуФорума() Экспорт + + Result = "result"; + Токен = ПолучитьПараметр("Телеграм_Токен"); + Чат = ПолучитьПараметр("Телеграм_Форум"); + Имя = "Тестовая тема"; + НовоеИмя = "Новый тестовый заголовок"; + Иконка = "5357419403325481346"; + + Результат = OPI_Telegram.СоздатьТемуФорума(Токен, Чат, Имя, Иконка); + Тема = Результат[Result]["message_thread_id"]; + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип("Соответствие") + .Заполнено() + .Свойство("ok").Равно(Истина) + .Свойство("result.name").Равно(Имя) + .Свойство("result.icon_custom_emoji_id").Равно(Иконка); + + Результат = OPI_Telegram.ИзменитьТемуФорума(Токен, Чат, Тема, НовоеИмя); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип("Соответствие") + .Заполнено() + .Свойство("ok").Равно(Истина) + .Свойство("result").Равно(Истина); + + Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат, Тема); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип("Соответствие") + .Заполнено() + .Свойство("ok").Равно(Истина) + .Свойство("result").Равно(Истина); + + Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат, Тема); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип("Соответствие") + .Заполнено() + .Свойство("ok").Равно(Истина) + .Свойство("result").Равно(Истина); + + Результат = OPI_Telegram.УдалитьТемуФорума(Токен, Чат, Тема); + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип("Соответствие") + .Заполнено() + .Свойство("ok").Равно(Истина) + .Свойство("result").Равно(Истина); + + +КонецПроцедуры + #КонецОбласти #Область ВК diff --git a/OPI/src/Configuration/Configuration.mdo b/OPI/src/Configuration/Configuration.mdo index 1aeaeb3495..d0eb5357f5 100644 --- a/OPI/src/Configuration/Configuration.mdo +++ b/OPI/src/Configuration/Configuration.mdo @@ -26,7 +26,7 @@ PersonalComputer Russian Bayselonarrend - 1.3.0 + 1.3.1 ru Открытый пакет интеграций - набор библиотек для интеграции с некоторыми популярными API для 1C:Enterprise. Он состоит из общих модулей, каждый из которых отвечает за свой API, а также нескольких модулей-инструментов, общих для всех.