From e5971481c72eac3b57ba929256dbc4f3dc1e248f Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 7 Feb 2024 21:40:07 +0300 Subject: [PATCH] =?UTF-8?q?YAX:=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20Telegram=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OPI/src/CommonModules/OPI_Telegram/Module.bsl | 902 +++++++++--------- OPI/src/CommonModules/YAX_Тесты/Module.bsl | 168 +++- 2 files changed, 601 insertions(+), 469 deletions(-) diff --git a/OPI/src/CommonModules/OPI_Telegram/Module.bsl b/OPI/src/CommonModules/OPI_Telegram/Module.bsl index c5ba25f6ee..84996cd46b 100644 --- a/OPI/src/CommonModules/OPI_Telegram/Module.bsl +++ b/OPI/src/CommonModules/OPI_Telegram/Module.bsl @@ -21,7 +21,6 @@ // SOFTWARE. // https://github.com/Bayselonarrend/OpenIntegrations - #Область ПрограммныйИнтерфейс #Область ДанныеИНастройка @@ -34,9 +33,9 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ПолучитьИнформациюБота(Знач Токен) Экспорт - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getMe"); - Возврат Ответ; + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getMe"); + Возврат Ответ; КонецФункции @@ -48,9 +47,9 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ПолучитьОбновления(Знач Токен) Экспорт - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getUpdates"); - Возврат Ответ; + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getUpdates"); + Возврат Ответ; КонецФункции @@ -63,12 +62,12 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт - - Параметры_ = Новый Структура; - Параметры_.Вставить("url", URL); - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/setWebHook", Параметры_); - Возврат Ответ; + + Параметры_ = Новый Структура; + Параметры_.Вставить("url", URL); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/setWebHook", Параметры_); + Возврат Ответ; КонецФункции @@ -80,8 +79,8 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция УдалитьWebhook(Знач Токен) Экспорт - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/deleteWebHook"); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/deleteWebHook"); Возврат Ответ; КонецФункции @@ -104,83 +103,80 @@ Функция ОбработатьДанные(Знач Запрос) Экспорт // BSLLS:DuplicateStringLiteral-off - Message = "message"; - From = "from"; - Chat = "chat"; - Id_ = "id"; - Username = "username"; - MessageId = "message_id"; - - ЧтениеJSON = Новый ЧтениеJSON; - ЧтениеJSON.УстановитьСтроку(Запрос.ПолучитьТелоКакСтроку()); - - СтруктураПараметровВходная = ПрочитатьJSON(ЧтениеJSON); - СтруктураПараметровВыходная = Новый Структура; - - Если СтруктураПараметровВходная.Свойство(Message) Тогда - - СтруктураСообщения = СтруктураПараметровВходная[Message]; - СтруктураПользователя = СтруктураСообщения[From]; - СтруктураЧата = СтруктураСообщения[Chat]; - - СтруктураПараметровВыходная.Вставить("Вид" , "Сообщение"); - СтруктураПараметровВыходная.Вставить("Никнейм" , СтруктураПользователя[Username]); - СтруктураПараметровВыходная.Вставить("IDПользователя" , СтруктураПользователя[Id_]); - СтруктураПараметровВыходная.Вставить("IDСообщения" , СтруктураСообщения[MessageId]); - СтруктураПараметровВыходная.Вставить("IDЧата" , СтруктураЧата[Id_]); - СтруктураПараметровВыходная.Вставить("Сообщение" , СтруктураСообщения["text"]); - СтруктураПараметровВыходная.Вставить("Дата" - , Дата(1970, 1, 1, 1, 0, 0) + СтруктураСообщения["date"]); - - СтруктураПараметровВыходная.Вставить("БотОтключен" , Ложь); - - ИначеЕсли СтруктураПараметровВходная.Свойство("my_chat_member") Тогда - - СтруктураСообщения = СтруктураПараметровВходная["my_chat_member"]; - СтруктураПользователя = СтруктураСообщения[From]; - СтруктураЧата = СтруктураСообщения[Chat]; - - СтруктураПараметровВыходная.Вставить("Вид" , "Запуск/Остановка"); - СтруктураПараметровВыходная.Вставить("Никнейм" , СтруктураПользователя[Username]); - СтруктураПараметровВыходная.Вставить("IDПользователя" , СтруктураПользователя[Id_]); - СтруктураПараметровВыходная.Вставить("IDСообщения" , ""); - СтруктураПараметровВыходная.Вставить("IDЧата" , СтруктураЧата[Id_]); - СтруктураПараметровВыходная.Вставить("Сообщение" , СтруктураСообщения["new_chat_member"]["status"]); - СтруктураПараметровВыходная.Вставить("Дата" - , Дата(1970, 1, 1, 1, 0, 0) + СтруктураСообщения["date"]); - - СтруктураПараметровВыходная.Вставить("БотОтключен" - , ?(СтруктураСообщения["new_chat_member"]["status"] = "kicked", Истина, Ложь)); + Message = "message"; + From = "from"; + Chat = "chat"; + Id_ = "id"; + Username = "username"; + MessageId = "message_id"; - ИначеЕсли СтруктураПараметровВходная.Свойство("callback_query") Тогда - - СтруктураСообщения = СтруктураПараметровВходная["callback_query"]; - СтруктураПользователя = СтруктураСообщения[From]; + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(Запрос.ПолучитьТелоКакСтроку()); - СтруктураПараметровВыходная.Вставить("Вид" , "Кнопка под сообщением"); - СтруктураПараметровВыходная.Вставить("Никнейм" , СтруктураПользователя[Username]); - СтруктураПараметровВыходная.Вставить("IDПользователя" , СтруктураПользователя[Id_]); - СтруктураПараметровВыходная.Вставить("IDСообщения" , СтруктураСообщения[Message][MessageId]); - СтруктураПараметровВыходная.Вставить("IDЧата" , СтруктураСообщения[Message][Chat][Id_]); - СтруктураПараметровВыходная.Вставить("Сообщение" , СтруктураСообщения["data"]); - СтруктураПараметровВыходная.Вставить("БотОтключен" , Ложь); - СтруктураПараметровВыходная.Вставить("Дата" - , Дата(1970, 1, 1, 1, 0, 0) + СтруктураСообщения[Message]["date"]); - - Иначе - - СтруктураПараметровВыходная.Вставить("Вид" , ""); - СтруктураПараметровВыходная.Вставить("Никнейм" , ""); - СтруктураПараметровВыходная.Вставить("IDПользователя" , ""); - СтруктураПараметровВыходная.Вставить("IDСообщения" , ""); - СтруктураПараметровВыходная.Вставить("IDЧата" , ""); - СтруктураПараметровВыходная.Вставить("Сообщение" , ""); - СтруктураПараметровВыходная.Вставить("Дата" , ТекущаяДатаСеанса()); - СтруктураПараметровВыходная.Вставить("БотОтключен" , Ложь); - - КонецЕсли; - - Возврат СтруктураПараметровВыходная; + СтруктураПараметровВходная = ПрочитатьJSON(ЧтениеJSON); + СтруктураПараметровВыходная = Новый Структура; + + Если СтруктураПараметровВходная.Свойство(Message) Тогда + + СтруктураСообщения = СтруктураПараметровВходная[Message]; + СтруктураПользователя = СтруктураСообщения[From]; + СтруктураЧата = СтруктураСообщения[Chat]; + + СтруктураПараметровВыходная.Вставить("Вид", "Сообщение"); + СтруктураПараметровВыходная.Вставить("Никнейм", СтруктураПользователя[Username]); + СтруктураПараметровВыходная.Вставить("IDПользователя", СтруктураПользователя[Id_]); + СтруктураПараметровВыходная.Вставить("IDСообщения", СтруктураСообщения[MessageId]); + СтруктураПараметровВыходная.Вставить("IDЧата", СтруктураЧата[Id_]); + СтруктураПараметровВыходная.Вставить("Сообщение", СтруктураСообщения["text"]); + СтруктураПараметровВыходная.Вставить("Дата", Дата(1970, 1, 1, 1, 0, 0) + СтруктураСообщения["date"]); + + СтруктураПараметровВыходная.Вставить("БотОтключен", Ложь); + + ИначеЕсли СтруктураПараметровВходная.Свойство("my_chat_member") Тогда + + СтруктураСообщения = СтруктураПараметровВходная["my_chat_member"]; + СтруктураПользователя = СтруктураСообщения[From]; + СтруктураЧата = СтруктураСообщения[Chat]; + + СтруктураПараметровВыходная.Вставить("Вид", "Запуск/Остановка"); + СтруктураПараметровВыходная.Вставить("Никнейм", СтруктураПользователя[Username]); + СтруктураПараметровВыходная.Вставить("IDПользователя", СтруктураПользователя[Id_]); + СтруктураПараметровВыходная.Вставить("IDСообщения", ""); + СтруктураПараметровВыходная.Вставить("IDЧата", СтруктураЧата[Id_]); + СтруктураПараметровВыходная.Вставить("Сообщение", СтруктураСообщения["new_chat_member"]["status"]); + СтруктураПараметровВыходная.Вставить("Дата", Дата(1970, 1, 1, 1, 0, 0) + СтруктураСообщения["date"]); + + СтруктураПараметровВыходная.Вставить("БотОтключен", ?(СтруктураСообщения["new_chat_member"]["status"] + = "kicked", Истина, Ложь)); + + ИначеЕсли СтруктураПараметровВходная.Свойство("callback_query") Тогда + + СтруктураСообщения = СтруктураПараметровВходная["callback_query"]; + СтруктураПользователя = СтруктураСообщения[From]; + + СтруктураПараметровВыходная.Вставить("Вид", "Кнопка под сообщением"); + СтруктураПараметровВыходная.Вставить("Никнейм", СтруктураПользователя[Username]); + СтруктураПараметровВыходная.Вставить("IDПользователя", СтруктураПользователя[Id_]); + СтруктураПараметровВыходная.Вставить("IDСообщения", СтруктураСообщения[Message][MessageId]); + СтруктураПараметровВыходная.Вставить("IDЧата", СтруктураСообщения[Message][Chat][Id_]); + СтруктураПараметровВыходная.Вставить("Сообщение", СтруктураСообщения["data"]); + СтруктураПараметровВыходная.Вставить("БотОтключен", Ложь); + СтруктураПараметровВыходная.Вставить("Дата", Дата(1970, 1, 1, 1, 0, 0) + СтруктураСообщения[Message]["date"]); + + Иначе + + СтруктураПараметровВыходная.Вставить("Вид", ""); + СтруктураПараметровВыходная.Вставить("Никнейм", ""); + СтруктураПараметровВыходная.Вставить("IDПользователя", ""); + СтруктураПараметровВыходная.Вставить("IDСообщения", ""); + СтруктураПараметровВыходная.Вставить("IDЧата", ""); + СтруктураПараметровВыходная.Вставить("Сообщение", ""); + СтруктураПараметровВыходная.Вставить("Дата", ТекущаяДатаСеанса()); + СтруктураПараметровВыходная.Вставить("БотОтключен", Ложь); + + КонецЕсли; + + Возврат СтруктураПараметровВыходная; // BSLLS:DuplicateStringLiteral-on КонецФункции @@ -200,20 +196,20 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ОтправитьТекстовоеСообщение(Знач Токен, Знач IDЧата, Знач Текст, Знач Клавиатура = "") Экспорт - - OPI_Инструменты.ЗаменитьСпецСимволы(Текст); - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - - Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("text" , Текст); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("reply_markup" , Клавиатура); - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendMessage", Параметры_); - - Возврат Ответ; - + + OPI_Инструменты.ЗаменитьСпецСимволы(Текст); + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + + Параметры_ = Новый Структура; + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("text", Текст); + Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("reply_markup", Клавиатура); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendMessage", Параметры_); + + Возврат Ответ; + КонецФункции // Отправить картинку. @@ -228,9 +224,9 @@ // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет - Ответ сервера Telegram Функция ОтправитьКартинку(Знач Токен, Знач IDЧата, Знач Текст, Знач Картинка, Знач Клавиатура = "") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура); - + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура); + КонецФункции // Отправить видео. @@ -245,9 +241,9 @@ // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет - Ответ сервера Telegram Функция ОтправитьВидео(Знач Токен, Знач IDЧата, Знач Текст, Знач Видео, Знач Клавиатура = "") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура); - + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура); + КонецФункции // Отправить аудио. @@ -262,9 +258,9 @@ // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет - Ответ сервера Telegram Функция ОтправитьАудио(Знач Токен, Знач IDЧата, Знач Текст, Знач Аудио, Знач Клавиатура = "") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура); - + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура); + КонецФункции // Отправить документ. @@ -279,9 +275,9 @@ // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет - Ответ сервера Telegram Функция ОтправитьДокумент(Знач Токен, Знач IDЧата, Знач Текст, Знач Документ, Знач Клавиатура = "") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура); - + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура); + КонецФункции // Отправить гифку. @@ -296,9 +292,9 @@ // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет - Ответ сервера Telegram Функция ОтправитьГифку(Знач Токен, Знач IDЧата, Знач Текст, Знач Гифка, Знач Клавиатура = "") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура); - + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура); + КонецФункции // Отправить набор любых файлов. @@ -314,69 +310,63 @@ // // Возвращаемое значение: // Произвольный, HTTPОтвет - Ответ сервера Telegram -Функция ОтправитьМедиагруппу(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач СоответствиеФайлов - , Знач Клавиатура = "") Экспорт +Функция ОтправитьМедиагруппу(Знач Токен, Знач IDЧата, Знач Текст, Знач СоответствиеФайлов, Знач Клавиатура = "") Экспорт // СоответствиеФайлов // Ключ - Файл, Значение - Тип // Типы: audio, document, photo, video // Нельзя замешивать разные типы! - - OPI_Инструменты.ЗаменитьСпецсимволы(Текст); - - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - СтруктураФайлов = Новый Структура; - Медиа = Новый Массив; - Счетчик = 0; - - Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("caption" , Текст); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("reply_markup" , Клавиатура); - - Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл - - Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда - ДД = Новый ДвоичныеДанные(ТекущийФайл.Ключ); - ЭтотФайл = Новый Файл(ТекущийФайл.Ключ); - ИмяМедиа = ТекущийФайл.Значение - + Строка(Счетчик) - + ?(ТекущийФайл.Значение = "document", ЭтотФайл.Расширение, ""); - ПолноеИмяМедиа = СтрЗаменить(ИмяМедиа, ".", "___"); - Иначе - ДД = ТекущийФайл.Ключ; - ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик); - ПолноеИмяМедиа = ИмяМедиа; - КонецЕсли; - - СтруктураФайлов.Вставить(ПолноеИмяМедиа , ДД); - - СтруктураМедиа = Новый Структура; - СтруктураМедиа.Вставить("type" , ТекущийФайл.Значение); - СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа); - - Если Счетчик = 0 Тогда - СтруктураМедиа.Вставить("caption", Текст); - КонецЕсли; - - Медиа.Добавить(СтруктураМедиа); - - Счетчик = Счетчик + 1; - - КонецЦикла; - - Параметры_.Вставить("media", OPI_Инструменты.JSONСтрокой(Медиа)); - - Ответ = OPI_Инструменты.PostMultipart("api.telegram.org/bot" - + Токен - + "/sendMediaGroup", Параметры_, СтруктураФайлов, "mixed"); - Возврат Ответ; - + OPI_Инструменты.ЗаменитьСпецсимволы(Текст); + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + СтруктураФайлов = Новый Структура; + Медиа = Новый Массив; + Счетчик = 0; + + Параметры_ = Новый Структура; + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("caption", Текст); + Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("reply_markup", Клавиатура); + + Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл + + Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда + ДД = Новый ДвоичныеДанные(ТекущийФайл.Ключ); + ЭтотФайл = Новый Файл(ТекущийФайл.Ключ); + ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик) + ?(ТекущийФайл.Значение = "document", + ЭтотФайл.Расширение, ""); + ПолноеИмяМедиа = СтрЗаменить(ИмяМедиа, ".", "___"); + Иначе + ДД = ТекущийФайл.Ключ; + ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик); + ПолноеИмяМедиа = ИмяМедиа; + КонецЕсли; + + СтруктураФайлов.Вставить(ПолноеИмяМедиа, ДД); + + СтруктураМедиа = Новый Структура; + СтруктураМедиа.Вставить("type", ТекущийФайл.Значение); + СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа); + + Если Счетчик = 0 Тогда + СтруктураМедиа.Вставить("caption", Текст); + КонецЕсли; + + Медиа.Добавить(СтруктураМедиа); + + Счетчик = Счетчик + 1; + + КонецЦикла; + + Параметры_.Вставить("media", OPI_Инструменты.JSONСтрокой(Медиа)); + + Ответ = OPI_Инструменты.PostMultipart("api.telegram.org/bot" + Токен + "/sendMediaGroup", Параметры_, + СтруктураФайлов, "mixed"); + + Возврат Ответ; + КонецФункции // Отправить местоположение. @@ -391,20 +381,20 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт - - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - - Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("latitude" , OPI_Инструменты.ЧислоВСтроку(Широта)); - Параметры_.Вставить("longitude" , OPI_Инструменты.ЧислоВСтроку(Долгота)); - Параметры_.Вставить("reply_markup" , Клавиатура); - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendLocation", Параметры_); - - Возврат Ответ; - + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + + Параметры_ = Новый Структура; + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("latitude", OPI_Инструменты.ЧислоВСтроку(Широта)); + Параметры_.Вставить("longitude", OPI_Инструменты.ЧислоВСтроку(Долгота)); + Параметры_.Вставить("reply_markup", Клавиатура); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendLocation", Параметры_); + + Возврат Ответ; + КонецФункции // Отправить контакт. @@ -420,21 +410,21 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт - - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - - Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("first_name" , Имя); - Параметры_.Вставить("last_name" , Фамилия); - Параметры_.Вставить("phone_number" , Строка(Телефон)); - Параметры_.Вставить("reply_markup" , Клавиатура); - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendContact", Параметры_); - - Возврат Ответ; - + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + + Параметры_ = Новый Структура; + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("first_name", Имя); + Параметры_.Вставить("last_name", Фамилия); + Параметры_.Вставить("phone_number", Строка(Телефон)); + Параметры_.Вставить("reply_markup", Клавиатура); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendContact", Параметры_); + + Возврат Ответ; + КонецФункции // Отправить опрос. @@ -449,24 +439,24 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт - - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - Ответы = OPI_Инструменты.JSONСтрокой(МассивОтветов); - - Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("question" , Вопрос); - Параметры_.Вставить("options" , Ответы); - - Если Не Анонимный Тогда - Параметры_.Вставить("is_anonymous", Ложь); - КонецЕсли; - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendPoll", Параметры_); - - Возврат Ответ; - + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + Ответы = OPI_Инструменты.JSONСтрокой(МассивОтветов); + + Параметры_ = Новый Структура; + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("question", Вопрос); + Параметры_.Вставить("options", Ответы); + + Если Не Анонимный Тогда + Параметры_.Вставить("is_anonymous", Ложь); + КонецЕсли; + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendPoll", Параметры_); + + Возврат Ответ; + КонецФункции // Переслать сообщение. @@ -480,19 +470,19 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт - - IDОригинала = OPI_Инструменты.ЧислоВСтроку(IDОригинала); - ОткудаID = OPI_Инструменты.ЧислоВСтроку(ОткудаID); - КудаID = OPI_Инструменты.ЧислоВСтроку(КудаID); - - Параметры_ = Новый Структура; - Параметры_.Вставить("chat_id" , КудаID); - Параметры_.Вставить("from_chat_id" , ОткудаID); - Параметры_.Вставить("message_id" , IDОригинала); - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/forwardMessage", Параметры_); - - Возврат Ответ; + + IDОригинала = OPI_Инструменты.ЧислоВСтроку(IDОригинала); + ОткудаID = OPI_Инструменты.ЧислоВСтроку(ОткудаID); + КудаID = OPI_Инструменты.ЧислоВСтроку(КудаID); + + Параметры_ = Новый Структура; + Параметры_.Вставить("chat_id", КудаID); + Параметры_.Вставить("from_chat_id", ОткудаID); + Параметры_.Вставить("message_id", IDОригинала); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/forwardMessage", Параметры_); + + Возврат Ответ; КонецФункции @@ -510,19 +500,19 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт - - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - IDПользователя = OPI_Инструменты.ЧислоВСтроку(IDПользователя); - - Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("user_id" , IDПользователя); - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/banChatMember", Параметры_); - - Возврат Ответ; - + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + IDПользователя = OPI_Инструменты.ЧислоВСтроку(IDПользователя); + + Параметры_ = Новый Структура; + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("user_id", IDПользователя); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/banChatMember", Параметры_); + + Возврат Ответ; + КонецФункции // Разбан. @@ -535,20 +525,20 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт - - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - IDПользователя = OPI_Инструменты.ЧислоВСтроку(IDПользователя); - - Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("user_id" , IDПользователя); - Параметры_.Вставить("only_if_banned" , Истина); - - Ответ = OPI_Инструменты.Get("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("api.telegram.org/bot" + Токен + "/unbanChatMember", Параметры_); + + Возврат Ответ; + КонецФункции // Создать ссылку приглашение. @@ -562,28 +552,25 @@ // // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram -Функция СоздатьСсылкуПриглашение(Знач Токен - , Знач IDЧата - , Знач Заголовок = "" - , Знач ДатаИстечения = "" - , Знач ЛимитПользователей = 0) Экспорт - - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - - Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("name" , Заголовок); - - Если ЗначениеЗаполнено(ДатаИстечения) Тогда - Параметры_.Вставить("expire_date", Формат(ДатаИстечения - Дата(1970, 1, 1, 1, 0, 0), "ЧГ=0")); - КонецЕсли; - - Параметры_.Вставить("member_limit", ЛимитПользователей); - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/createChatInviteLink", Параметры_); - - Возврат Ответ; +Функция СоздатьСсылкуПриглашение(Знач Токен, Знач IDЧата, Знач Заголовок = "", Знач ДатаИстечения = "", + Знач ЛимитПользователей = 0) Экспорт + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + + Параметры_ = Новый Структура; + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("name", Заголовок); + + Если ЗначениеЗаполнено(ДатаИстечения) Тогда + Параметры_.Вставить("expire_date", Формат(ДатаИстечения - Дата(1970, 1, 1, 1, 0, 0), "ЧГ=0")); + КонецЕсли; + + Параметры_.Вставить("member_limit", ЛимитПользователей); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/createChatInviteLink", Параметры_); + + Возврат Ответ; КонецФункции @@ -597,20 +584,20 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт - - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - IDСообщения = OPI_Инструменты.ЧислоВСтроку(IDСообщения); - - Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("message_id" , IDСообщения); - Параметры_.Вставить("disable_notification" , Истина); - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/pinChatMessage", Параметры_); - - Возврат Ответ; - + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + IDСообщения = OPI_Инструменты.ЧислоВСтроку(IDСообщения); + + Параметры_ = Новый Структура; + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("message_id", IDСообщения); + Параметры_.Вставить("disable_notification", Истина); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/pinChatMessage", Параметры_); + + Возврат Ответ; + КонецФункции // Открепить сообщение. @@ -623,19 +610,19 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт - - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - IDСообщения = OPI_Инструменты.ЧислоВСтроку(IDСообщения); - - Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("message_id" , IDСообщения); - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/unpinChatMessage", Параметры_); - - Возврат Ответ; - + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + IDСообщения = OPI_Инструменты.ЧислоВСтроку(IDСообщения); + + Параметры_ = Новый Структура; + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("message_id", IDСообщения); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/unpinChatMessage", Параметры_); + + Возврат Ответ; + КонецФункции // Получить число участников. @@ -647,17 +634,17 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Получить число участников Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт - - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - - Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode", "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getChatMemberCount", Параметры_); - - Возврат Ответ; - + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + + Параметры_ = Новый Структура; + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("chat_id", IDЧата); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getChatMemberCount", Параметры_); + + Возврат Ответ; + КонецФункции #КонецОбласти @@ -672,59 +659,58 @@ // // Возвращаемое значение: // Соответствие из Строка - Обработанные данные с признаком достоверности -Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт - - СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL); - СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных); - Ключ = "WebAppData"; - Хэш = ""; - - Результат = OPI_Криптография.HMACSHA256(ПолучитьДвоичныеДанныеИзСтроки(Ключ) - , ПолучитьДвоичныеДанныеИзСтроки(Токен)); - - ТЗнач = Новый ТаблицаЗначений; - ТЗнач.Колонки.Добавить("Ключ"); - ТЗнач.Колонки.Добавить("Значение"); - - Для Каждого Данные Из СтруктураДанных Цикл - - НоваяСтрока = ТЗнач.Добавить(); - НоваяСтрока.Ключ = Данные.Ключ; - НоваяСтрока.Значение = Данные.Значение; - - КонецЦикла; - - ТЗнач.Сортировать("Ключ"); - - СоответствиеВозврата = Новый Соответствие; - DCS = ""; - - Для Каждого СтрокаТЗ Из ТЗнач Цикл - - Если СтрокаТЗ.Ключ <> "hash" Тогда - DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС; - СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение); - Иначе - Хэш = СтрокаТЗ.Значение; - КонецЕсли; - - КонецЦикла; - - DCS = Лев(DCS, СтрДлина(DCS) - 1); - Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS)); - - Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись); - - Если Финал = вРег(Хэш) Тогда - Ответ = Истина; - Иначе - Ответ = Ложь; - КонецЕсли; - - СоответствиеВозврата.Вставить("passed", Ответ); - - Возврат СоответствиеВозврата; - +Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт + + СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL); + СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных); + Ключ = "WebAppData"; + Хэш = ""; + + Результат = OPI_Криптография.HMACSHA256(ПолучитьДвоичныеДанныеИзСтроки(Ключ), ПолучитьДвоичныеДанныеИзСтроки(Токен)); + + ТЗнач = Новый ТаблицаЗначений; + ТЗнач.Колонки.Добавить("Ключ"); + ТЗнач.Колонки.Добавить("Значение"); + + Для Каждого Данные Из СтруктураДанных Цикл + + НоваяСтрока = ТЗнач.Добавить(); + НоваяСтрока.Ключ = Данные.Ключ; + НоваяСтрока.Значение = Данные.Значение; + + КонецЦикла; + + ТЗнач.Сортировать("Ключ"); + + СоответствиеВозврата = Новый Соответствие; + DCS = ""; + + Для Каждого СтрокаТЗ Из ТЗнач Цикл + + Если СтрокаТЗ.Ключ <> "hash" Тогда + DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС; + СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение); + Иначе + Хэш = СтрокаТЗ.Значение; + КонецЕсли; + + КонецЦикла; + + DCS = Лев(DCS, СтрДлина(DCS) - 1); + Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS)); + + Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись); + + Если Финал = вРег(Хэш) Тогда + Ответ = Истина; + Иначе + Ответ = Ложь; + КонецЕсли; + + СоответствиеВозврата.Вставить("passed", Ответ); + + Возврат СоответствиеВозврата; + КонецФункции #КонецОбласти @@ -740,48 +726,46 @@ // // Возвращаемое значение: // Строка - JSON клавиатуры -Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок - , Знач ПодСообщением = Ложь - , Знач ОднаПодОдной = Истина) Экспорт - - Если ОднаПодОдной Тогда - - Строки = Новый Массив; - - Для Каждого Кнопка Из МассивКнопок Цикл - Кнопки = Новый Массив; - Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); - Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); - Строки.Добавить(Кнопки); - КонецЦикла; - - Иначе - - Строки = Новый Массив; - Кнопки = Новый Массив; - - Для Каждого Кнопка Из МассивКнопок Цикл - Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); - Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); - КонецЦикла; - - Строки.Добавить(Кнопки); - КонецЕсли; - - Если ПодСообщением Тогда - СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1); - Иначе - СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина); - КонецЕсли; - - ЗаписьJSON = Новый ЗаписьJSON; - ПЗJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, , , ЭкранированиеСимволовJSON.СимволыВнеASCII); - ЗаписьJSON.УстановитьСтроку(ПЗJSON); - - ЗаписатьJSON(ЗаписьJSON, СтруктураПараметра); - - Возврат ЗаписьJSON.Закрыть(); - +Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок, Знач ПодСообщением = Ложь, Знач ОднаПодОдной = Истина) Экспорт + + Если ОднаПодОдной Тогда + + Строки = Новый Массив; + + Для Каждого Кнопка Из МассивКнопок Цикл + Кнопки = Новый Массив; + Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); + Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); + Строки.Добавить(Кнопки); + КонецЦикла; + + Иначе + + Строки = Новый Массив; + Кнопки = Новый Массив; + + Для Каждого Кнопка Из МассивКнопок Цикл + Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); + Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); + КонецЦикла; + + Строки.Добавить(Кнопки); + КонецЕсли; + + Если ПодСообщением Тогда + СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1); + Иначе + СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина); + КонецЕсли; + + ЗаписьJSON = Новый ЗаписьJSON; + ПЗJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, , , ЭкранированиеСимволовJSON.СимволыВнеASCII); + ЗаписьJSON.УстановитьСтроку(ПЗJSON); + + ЗаписатьJSON(ЗаписьJSON, СтруктураПараметра); + + Возврат ЗаписьJSON.Закрыть(); + КонецФункции #КонецОбласти @@ -791,50 +775,48 @@ #Область СлужебныеПроцедурыИФункции Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура) - + Расширение = ""; - Если Вид = "photo" Тогда - Метод = "/sendPhoto"; - ИначеЕсли Вид = "video" Тогда - Метод = "/sendVideo"; - ИначеЕсли Вид = "audio" Тогда - Метод = "/sendAudio"; - ИначеЕсли Вид = "document" Тогда - Метод = "/sendDocument"; - ИначеЕсли Вид = "animation" Тогда - Метод = "/sendAnimation"; + Если Вид = "photo" Тогда + Метод = "/sendPhoto"; + ИначеЕсли Вид = "video" Тогда + Метод = "/sendVideo"; + ИначеЕсли Вид = "audio" Тогда + Метод = "/sendAudio"; + ИначеЕсли Вид = "document" Тогда + Метод = "/sendDocument"; + ИначеЕсли Вид = "animation" Тогда + Метод = "/sendAnimation"; Расширение = ".gif"; - Иначе - Возврат ""; - КонецЕсли; - - OPI_Инструменты.ЗаменитьСпецсимволы(Текст); - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - - Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда - ТекущийФайл = Новый Файл(Файл); - Расширение = ?(Вид = "document" Или Вид = "animation", ТекущийФайл.Расширение, ""); - Файл = Новый ДвоичныеДанные(Файл); - КонецЕсли; - - Расширение = СтрЗаменить(Расширение, ".", "___"); - - Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("caption" , Текст); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("reply_markup" , Клавиатура); - - СтруктураФайлов = Новый Структура; - СтруктураФайлов.Вставить(Вид + Расширение, Файл); - - Ответ = OPI_Инструменты.PostMultipart("api.telegram.org/bot" - + Токен - + Метод, Параметры_, СтруктураФайлов, "mixed"); - - Возврат Ответ; - + Иначе + Возврат ""; + КонецЕсли; + + OPI_Инструменты.ЗаменитьСпецсимволы(Текст); + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + + Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда + ТекущийФайл = Новый Файл(Файл); + Расширение = ?(Вид = "document" Или Вид = "animation", ТекущийФайл.Расширение, ""); + Файл = Новый ДвоичныеДанные(Файл); + КонецЕсли; + + Расширение = СтрЗаменить(Расширение, ".", "___"); + + Параметры_ = Новый Структура; + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("caption", Текст); + Параметры_.Вставить("chat_id", IDЧата); + Параметры_.Вставить("reply_markup", Клавиатура); + + СтруктураФайлов = Новый Структура; + СтруктураФайлов.Вставить(Вид + Расширение, Файл); + + Ответ = OPI_Инструменты.PostMultipart("api.telegram.org/bot" + Токен + Метод, Параметры_, СтруктураФайлов, "mixed"); + + Возврат Ответ; + КонецФункции -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/OPI/src/CommonModules/YAX_Тесты/Module.bsl b/OPI/src/CommonModules/YAX_Тесты/Module.bsl index 592f2f006b..f523645d7f 100644 --- a/OPI/src/CommonModules/YAX_Тесты/Module.bsl +++ b/OPI/src/CommonModules/YAX_Тесты/Module.bsl @@ -16,7 +16,12 @@ .ДобавитьСерверныйТест("Телеграм_ОтправитьВидео" , "Отправить видео") .ДобавитьСерверныйТест("Телеграм_ОтправитьАудио" , "Отправить аудио") .ДобавитьСерверныйТест("Телеграм_ОтправитьДокумент" , "Отправить документ") - .ДобавитьСерверныйТест("Телеграм_ОтправитьГифку" , "Отправить гифку"); + .ДобавитьСерверныйТест("Телеграм_ОтправитьГифку" , "Отправить гифку") + .ДобавитьСерверныйТест("Телеграм_ОтправитьМедиагруппу" , "Отправить медиагруппу") + .ДобавитьСерверныйТест("Телеграм_ОтправитьМестоположение" , "Отправить местоположение") + .ДобавитьСерверныйТест("Телеграм_ОтправитьКонтакт" , "Отправить контакт") + .ДобавитьСерверныйТест("Телеграм_ОтправитьОпрос" , "Отправить опрос") + .ДобавитьСерверныйТест("Телеграм_ПереслатьСообщение" , "Переслать сообщение"); КонецПроцедуры @@ -93,7 +98,10 @@ МассивРезультатов = Новый Массив; МассивРезультатов.Добавить(OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, Текст)); МассивРезультатов.Добавить(OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDКанала, Текст)); - + + IDСообщения = OPI_Инструменты.ЧислоВСтроку(МассивРезультатов[1]["result"]["message_id"]); + ЗаписатьПараметр("Телеграм_IDСообщенияКанала", IDСообщения); + Для Каждого Результат Из МассивРезультатов Цикл ЮТест.ОжидаетЧто(Результат) @@ -143,19 +151,18 @@ IDЧата = ПолучитьПараметр("Телеграм_Чат"); IDКанала = ПолучитьПараметр("Телеграм_Канал"); Текст = "Сообщение из автоматического теста"; - Картинка = ПолучитьДвоичные("Видео"); + Видео = ПолучитьДвоичные("Видео"); ИВФ = ПолучитьИмяВременногоФайла("mp4"); - Картинка.Записать(ИВФ); + Видео.Записать(ИВФ); МассивРезультатов = Новый Массив; - МассивРезультатов.Добавить(OPI_Telegram.ОтправитьВидео(Токен, IDЧата , Текст, Картинка)); - МассивРезультатов.Добавить(OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, Картинка)); + МассивРезультатов.Добавить(OPI_Telegram.ОтправитьВидео(Токен, IDЧата , Текст, Видео)); + МассивРезультатов.Добавить(OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, Видео)); МассивРезультатов.Добавить(OPI_Telegram.ОтправитьВидео(Токен, IDЧата , Текст, ИВФ)); МассивРезультатов.Добавить(OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ИВФ)); Для Каждого Результат Из МассивРезультатов Цикл - //@skip-warning ЮТест.ОжидаетЧто(Результат) .ИмеетТип("Соответствие") .Заполнено() @@ -263,6 +270,143 @@ КонецПроцедуры +Процедура Телеграм_ОтправитьМедиагруппу() Экспорт + + Токен = ПолучитьПараметр("Телеграм_Токен"); + IDЧата = ПолучитьПараметр("Телеграм_Чат"); + IDКанала = ПолучитьПараметр("Телеграм_Канал"); + Текст = "Сообщение из автоматического теста"; + + Картинка = ПолучитьДвоичные("Картинка"); + ИВФ_Картинка = ПолучитьИмяВременногоФайла("png"); + Картинка.Записать(ИВФ_Картинка); + + Видео = ПолучитьДвоичные("Видео"); + ИВФ_Видео = ПолучитьИмяВременногоФайла("mp4"); + Видео.Записать(ИВФ_Видео); + + МедиагруппаЧат = Новый Соответствие; + МедиагруппаЧат.Вставить(Картинка , "photo"); + МедиагруппаЧат.Вставить(ИВФ_Видео, "video"); + + МедиагруппаКанал = Новый Соответствие; + МедиагруппаКанал.Вставить(ИВФ_Картинка, "photo"); + МедиагруппаКанал.Вставить(Видео , "video"); + + МассивРезультатов = Новый Массив; + МассивРезультатов.Добавить(OPI_Telegram.ОтправитьМедиагруппу(Токен, IDЧата, Текст, МедиагруппаЧат)); + МассивРезультатов.Добавить(OPI_Telegram.ОтправитьМедиагруппу(Токен, IDКанала, Текст, МедиагруппаКанал)); + + Для Каждого Результат Из МассивРезультатов Цикл + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип("Соответствие") + .Заполнено() + .Свойство("ok").Равно(Истина) + .Свойство("result").ИмеетТип("Массив").ИмеетДлину(2) + + КонецЦикла; + + УдалитьФайлы(ИВФ_Картинка); + УдалитьФайлы(ИВФ_Видео); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьМестоположение() Экспорт + + Токен = ПолучитьПараметр("Телеграм_Токен"); + IDЧата = ПолучитьПараметр("Телеграм_Чат"); + IDКанала = ПолучитьПараметр("Телеграм_Канал"); + Ширина = "48.87373649724122"; + Долгота = "48.87373649724122"; + + МассивРезультатов = Новый Массив; + МассивРезультатов.Добавить(OPI_Telegram.ОтправитьМестоположение(Токен, IDЧата , Ширина, Долгота)); + МассивРезультатов.Добавить(OPI_Telegram.ОтправитьМестоположение(Токен, IDКанала, Ширина, Долгота)); + + Для Каждого Результат Из МассивРезультатов Цикл + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип("Соответствие") + .Заполнено() + .Свойство("ok").Равно(Истина) + .Свойство("result.location").ИмеетТип("Соответствие").Заполнено(); + + КонецЦикла; + +КонецПроцедуры + +Процедура Телеграм_ОтправитьКонтакт() Экспорт + + Токен = ПолучитьПараметр("Телеграм_Токен"); + IDЧата = ПолучитьПараметр("Телеграм_Чат"); + IDКанала = ПолучитьПараметр("Телеграм_Канал"); + Имя = "Петр"; + Фамилия = "Петров"; + Телефон = "88005553535"; + + МассивРезультатов = Новый Массив; + МассивРезультатов.Добавить(OPI_Telegram.ОтправитьКонтакт(Токен, IDЧата , Имя, Фамилия, Телефон)); + МассивРезультатов.Добавить(OPI_Telegram.ОтправитьКонтакт(Токен, IDКанала, Имя, Фамилия, Телефон)); + + Для Каждого Результат Из МассивРезультатов Цикл + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип("Соответствие") + .Заполнено() + .Свойство("ok").Равно(Истина) + .Свойство("result.contact").ИмеетТип("Соответствие").Заполнено() + .Свойство("result.contact.first_name").Равно(Имя); + + КонецЦикла; + +КонецПроцедуры + +Процедура Телеграм_ОтправитьОпрос() Экспорт + + Токен = ПолучитьПараметр("Телеграм_Токен"); + IDЧата = ПолучитьПараметр("Телеграм_Чат"); + IDКанала = ПолучитьПараметр("Телеграм_Канал"); + + Вопрос = "Какой ваш любимый цвет?"; + + МассивОтветов = Новый Массив; + МассивОтветов.Добавить("Красный"); + МассивОтветов.Добавить("Желтый"); + МассивОтветов.Добавить("Зеленый"); + + МассивРезультатов = Новый Массив; + МассивРезультатов.Добавить(OPI_Telegram.ОтправитьОпрос(Токен, IDЧата , Вопрос, МассивОтветов, Ложь)); + МассивРезультатов.Добавить(OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, МассивОтветов, Истина)); + + Для Каждого Результат Из МассивРезультатов Цикл + + ЮТест.ОжидаетЧто(Результат) + .ИмеетТип("Соответствие") + .Заполнено() + .Свойство("ok").Равно(Истина) + .Свойство("result.poll").ИмеетТип("Соответствие").Заполнено() + .Свойство("result.poll.question").Равно(Вопрос); + + КонецЦикла; + +КонецПроцедуры + +Процедура Телеграм_ПереслатьСообщение() Экспорт + + Токен = ПолучитьПараметр("Телеграм_Токен"); + IDЧата = ПолучитьПараметр("Телеграм_Чат"); + IDКанала = ПолучитьПараметр("Телеграм_Канал"); + IDСообщения = ПолучитьПараметр("Телеграм_IDСообщенияКанала"); + + ЮТест.ОжидаетЧто(OPI_Telegram.ПереслатьСообщение(Токен, IDСообщения, IDКанала, IDЧата)) + .ИмеетТип("Соответствие") + .Заполнено() + .Свойство("ok").Равно(Истина) + .Свойство("result.forward_origin.message_id").Равно(Число(IDСообщения)); + +КонецПроцедуры + #КонецОбласти #КонецОбласти @@ -308,8 +452,14 @@ ИмяРеквизита = "Значение"; ЭлементСпр = Справочники[ИмяСправочника].НайтиПоНаименованию(Параметр); - ОбъектСпр = ЭлементСпр.ПолучитьОбъект(); - + + Если ЗначениеЗаполнено(ЭлементСпр) Тогда + ОбъектСпр = ЭлементСпр.ПолучитьОбъект(); + Иначе + ОбъектСпр = Справочники[ИмяСправочника].СоздатьЭлемент(); + ОбъектСпр.Наименование = Параметр; + КонецЕсли; + ОбъектСпр[ИмяРеквизита] = Значение; ОбъектСпр.Записать();