diff --git a/ru/OInt/core/Modules/OPI_Airtable.os b/ru/OInt/core/Modules/OPI_Airtable.os index 30abde603a..5562675c6e 100644 --- a/ru/OInt/core/Modules/OPI_Airtable.os +++ b/ru/OInt/core/Modules/OPI_Airtable.os @@ -1,681 +1,681 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Airtable.os -// Библиотека: Airtable -// Команда CLI: airtable - -// 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:IncorrectLineBreak-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область РаботаСБазами - -// Получить список баз -// Получает список доступных баз -// -// Параметры: -// Токен - Строка - Токен - token -// Отступ - Строка - Идентификатор следующей страницы списка баз из перыдудщего запроса - offset -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ПолучитьСписокБаз(Знач Токен, Знач Отступ = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Отступ); - - URL = "https://api.airtable.com/v0/meta/bases"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - Параметры = Новый Структура; - - OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить таблицы базы -// Получает схему таблиц базы -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы - base -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ПолучитьТаблицыБазы(Знач Токен, Знач База) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - - URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать базу -// Создает новую базу данных -// -// Параметры: -// Токен - Строка - Токен - token -// РабочееПространство - Строка - Идентификатор рабочего пространства - ws -// Наименование - Строка - Наименование новой базы - title -// КоллекцияТаблиц - Соответствие Из КлючИЗначение - Описание таблиц: Ключ > имя, Значение > массив полей - tablesdata -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция СоздатьБазу(Знач Токен, Знач РабочееПространство, Знач Наименование, Знач КоллекцияТаблиц) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(КоллекцияТаблиц); - - Если Не ТипЗнч(КоллекцияТаблиц) = Тип("Структура") - И Не ТипЗнч(КоллекцияТаблиц) = Тип("Соответствие") Тогда - - ВызватьИсключение "Ошибка в данных коллекции таблиц"; - - КонецЕсли; - - URL = "https://api.airtable.com/v0/meta/bases"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - МассивТаблиц = Новый Массив; - - Для Каждого Таблица Из КоллекцияТаблиц Цикл - - Описание = СформироватьОписаниеТаблицы(Таблица.Ключ, Таблица.Значение); - МассивТаблиц.Добавить(Описание); - - КонецЦикла; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("name" , Наименование , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("tables" , МассивТаблиц , "Массив", Параметры); - OPI_Инструменты.ДобавитьПоле("workspaceId", РабочееПространство, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСТаблицами - -// Создать таблицу -// Создает новую таблицу в базе -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы - base -// Наименование - Строка - Наименование новой таблицы - title -// МассивПолей - Массив Из Структура - Массив описаний полей - fieldsdata -// Описание - Строка - Описание таблицы - description -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция СоздатьТаблицу(Знач Токен, Знач База, Знач Наименование, Знач МассивПолей, Знач Описание = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - - URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - Параметры = СформироватьОписаниеТаблицы(Наименование, МассивПолей, Описание); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить таблицу -// Изменяет наименование и|или описание базы -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы - base -// Таблица - Строка - Идентификатор таблицы - table -// Наименование - Строка - Новое наименование - title -// Описание - Строка - Новое описание - description -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ИзменитьТаблицу(Знач Токен, Знач База, Знач Таблица, Знач Наименование = "", Знач Описание = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - - URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - Параметры = Новый Структура; - - OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры); - - Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСПолями - -// Создать поле -// Создет новое поле в таблице -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы - base -// Таблица - Строка - Идентификатор таблицы - table -// СтруктураПоля - Структура Из КлючИЗначение - Описание нового поля - fielddata -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция СоздатьПоле(Знач Токен, Знач База, Знач Таблица, Знач СтруктураПоля) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СтруктураПоля); - - Если Не ТипЗнч(СтруктураПоля) = Тип("Структура") - И Не ТипЗнч(СтруктураПоля) = Тип("Соответствие") Тогда - - ВызватьИсключение "Ошибка в данных описания поля"; - - КонецЕсли; - - URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица + "/fields"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Post(URL, СтруктураПоля, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить поле -// Изменяет имя и|или описание существующего поля таблицы -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы База - base -// Таблица - Строка - Идентификатор таблицы - table -// Поле - Строка - Идентификатор поля - field -// Наименование - Строка - Новое наименование - title -// Описание - Строка - Новое описание - description -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ИзменитьПоле(Знач Токен, Знач База, Знач Таблица, Знач Поле, Знач Наименование = "", Знач Описание = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле); - - URL = "https://api.airtable.com/v0/meta/bases/" - + База - + "/tables/" - + Таблица - + "/fields/" - + Поле; - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры); - - Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить поле (строковое) -// Получает описание поля строкового типа -// -// Параметры: -// Наименование - Строка - Наименование нового поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеСтроковое(Знач Наименование) Экспорт - Возврат ОписаниеПримитивногоПоля(Наименование, "richText"); -КонецФункции - -// Получить поле (числовое) -// Получает описание поля числового типа -// -// Параметры: -// Наименование - Строка - Наименование нового поля - title -// Точность - Число,Строка - Число знаков после запятой - precision -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеНомера(Знач Наименование, Знач Точность = 0) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьЧисло(Точность); - - СтруктураОпций = Новый Структура("precision", Точность); - Возврат ОписаниеПримитивногоПоля(Наименование, "number", СтруктураОпций); - -КонецФункции - -// Получить поле (файл) -// Получает описание поля файлового типа -// -// Параметры: -// Наименование - Строка - Наименование поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеВложения(Знач Наименование) Экспорт - Возврат ОписаниеПримитивногоПоля(Наименование, "multipleAttachments"); -КонецФункции - -// Получить поле (флажок) -// Получает описание поля типа булево -// -// Параметры: -// Наименование - Строка - Наименование поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеФлажка(Знач Наименование) Экспорт - - СтруктураОпций = Новый Структура("icon,color", "check", "yellowBright"); - Возврат ОписаниеПримитивногоПоля(Наименование, "checkbox", СтруктураОпций); - -КонецФункции - -// Получить поле (дата) -// Получает описание поля типа дата -// -// Параметры: -// Наименование - Строка - Наименование поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеДаты(Знач Наименование) Экспорт - - СтруктураФормата = Новый Структура("format,name", "YYYY-MM-DD", "iso"); - СтруктураОпций = Новый Структура("dateFormat", СтруктураФормата); - - Возврат ОписаниеПримитивногоПоля(Наименование, "date", СтруктураОпций); - -КонецФункции - -// Получить поле (email) -// Получает описание поля с электронной почтой -// -// Параметры: -// Наименование - Строка - Наименование поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеПочты(Знач Наименование) Экспорт - Возврат ОписаниеПримитивногоПоля(Наименование, "email"); -КонецФункции - -// Получить поле (телефон) -// Получает описание поля с номером телефона -// -// Параметры: -// Наименование - Строка - Наименование поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеТелефона(Знач Наименование) Экспорт - Возврат ОписаниеПримитивногоПоля(Наименование, "phoneNumber"); -КонецФункции - -// Получить поле (url) -// Получает описание поля с URL -// -// Параметры: -// Наименование - Строка - Наименование поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеСсылки(Знач Наименование) Экспорт - Возврат ОписаниеПримитивногоПоля(Наименование, "url"); -КонецФункции - -#КонецОбласти - -#Область РаботаСЗаписями - -// Получить список записей -// Получает список записей выбранной таблицы -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ПолучитьСписокЗаписей(Знач Токен, Знач База, Знач Таблица, Знач Отступ = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить запись -// Получает данные строки таблицы по идентификатору -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Запись - Строка - Идентификатор записи в таблице - record -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ПолучитьЗапись(Знач Токен, Знач База, Знач Таблица, Знач Запись) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать записи -// Создает одну или массив записей по описанию или массиву описаний значений полей -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Данные - Структура, Массив из Структура - Набор или массив наборов пар Ключ : Значение > Поле : Показатель - data -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция СоздатьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Данные) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); - - Параметры = Новый Структура(); - ДобавитьОписаниеДанных(Данные, Параметры); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить записи -// Удаляет одну или массив записей по идентификаторам -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Записи - Строка, Массив из Строка - Идентификатор или массив индентификаторов записей - records -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция УдалитьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Записи) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьМассив(Записи); - - СтрокаЗаписей = ""; - - Для Каждого Запись Из Записи Цикл - СтрокаЗаписей = СтрокаЗаписей - + ?(ЗначениеЗаполнено(СтрокаЗаписей), "&", "?") - + "records[]=" - + OPI_Инструменты.ЧислоВСтроку(Запись); - КонецЦикла; - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + СтрокаЗаписей; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСКомментариями - -// Получить комментарии -// Получает список комментариев к записи в таблице -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Запись - Строка - Идентификатор записи в таблице - record -// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ПолучитьКомментарии(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Отступ = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать комментарий -// Создает комментарий к записи в таблице -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Запись - Строка - Идентификатор записи в таблице - record -// Текст - Строка - Текст комментария - text -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция СоздатьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Текст) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить комментарий -// Изменяет текст существующего комментария -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Запись - Строка - Идентификатор записи в таблице - record -// Комментарий - Строка - Идентификатор комментария - comment -// Текст - Строка - Новый текст комментария - text -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ИзменитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий, Знач Текст) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры); - - Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить комментарий -// Удаляет комментарий к записи таблицы -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Запись - Строка - Идентификатор записи в таблице - record -// Комментарий - Строка - Идентификатор комментария - comment -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция УдалитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ПолучитьЗаголовокАвторизации(Знач Токен) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Authorization", "Bearer " + Токен); - - Возврат Заголовки; - -КонецФункции - -Функция СформироватьОписаниеТаблицы(Знач Наименование, Знач МассивПолей, Знач Описание = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПолей); - - ОписаниеТаблицы = Новый Структура("name,fields", Наименование, МассивПолей); - - OPI_Инструменты.ДобавитьПоле("description", Описание, "Строка", ОписаниеТаблицы); - - Возврат ОписаниеТаблицы; - -КонецФункции - -Функция ОписаниеПримитивногоПоля(Знач Наименование, Знач Тип, Знач Опции = "") - - СтруктураПоля = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка" , СтруктураПоля); - OPI_Инструменты.ДобавитьПоле("type" , Тип , "Строка" , СтруктураПоля); - OPI_Инструменты.ДобавитьПоле("options", Опции , "Коллекция", СтруктураПоля); - - Возврат СтруктураПоля; - -КонецФункции - -Процедура ДобавитьОписаниеДанных(Знач Данные, Параметры) - - Если ТипЗнч(Данные) = Тип("Массив") Тогда - - МассивОтправки = Новый Массив; - - Для Каждого ОписаниеЗаписи Из Данные Цикл - МассивОтправки.Добавить(Новый Структура("fields", ОписаниеЗаписи)); - КонецЦикла; - - OPI_Инструменты.ДобавитьПоле("records", МассивОтправки, "Массив", Параметры); - - Иначе - - OPI_Инструменты.ДобавитьПоле("fields", Данные, "Коллекция", Параметры); - - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Airtable.os +// Библиотека: Airtable +// Команда CLI: airtable + +// 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:IncorrectLineBreak-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область РаботаСБазами + +// Получить список баз +// Получает список доступных баз +// +// Параметры: +// Токен - Строка - Токен - token +// Отступ - Строка - Идентификатор следующей страницы списка баз из перыдудщего запроса - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьСписокБаз(Знач Токен, Знач Отступ = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Отступ); + + URL = "https://api.airtable.com/v0/meta/bases"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Параметры = Новый Структура; + + OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить таблицы базы +// Получает схему таблиц базы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы - base +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьТаблицыБазы(Знач Токен, Знач База) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + + URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать базу +// Создает новую базу данных +// +// Параметры: +// Токен - Строка - Токен - token +// РабочееПространство - Строка - Идентификатор рабочего пространства - ws +// Наименование - Строка - Наименование новой базы - title +// КоллекцияТаблиц - Соответствие Из КлючИЗначение - Описание таблиц: Ключ > имя, Значение > массив полей - tablesdata +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьБазу(Знач Токен, Знач РабочееПространство, Знач Наименование, Знач КоллекцияТаблиц) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(КоллекцияТаблиц); + + Если Не ТипЗнч(КоллекцияТаблиц) = Тип("Структура") + И Не ТипЗнч(КоллекцияТаблиц) = Тип("Соответствие") Тогда + + ВызватьИсключение "Ошибка в данных коллекции таблиц"; + + КонецЕсли; + + URL = "https://api.airtable.com/v0/meta/bases"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + МассивТаблиц = Новый Массив; + + Для Каждого Таблица Из КоллекцияТаблиц Цикл + + Описание = СформироватьОписаниеТаблицы(Таблица.Ключ, Таблица.Значение); + МассивТаблиц.Добавить(Описание); + + КонецЦикла; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("name" , Наименование , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("tables" , МассивТаблиц , "Массив", Параметры); + OPI_Инструменты.ДобавитьПоле("workspaceId", РабочееПространство, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСТаблицами + +// Создать таблицу +// Создает новую таблицу в базе +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы - base +// Наименование - Строка - Наименование новой таблицы - title +// МассивПолей - Массив Из Структура - Массив описаний полей - fieldsdata +// Описание - Строка - Описание таблицы - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьТаблицу(Знач Токен, Знач База, Знач Наименование, Знач МассивПолей, Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + + URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Параметры = СформироватьОписаниеТаблицы(Наименование, МассивПолей, Описание); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить таблицу +// Изменяет наименование и|или описание базы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы - base +// Таблица - Строка - Идентификатор таблицы - table +// Наименование - Строка - Новое наименование - title +// Описание - Строка - Новое описание - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ИзменитьТаблицу(Знач Токен, Знач База, Знач Таблица, Знач Наименование = "", Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + + URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Параметры = Новый Структура; + + OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры); + + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСПолями + +// Создать поле +// Создет новое поле в таблице +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы - base +// Таблица - Строка - Идентификатор таблицы - table +// СтруктураПоля - Структура Из КлючИЗначение - Описание нового поля - fielddata +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьПоле(Знач Токен, Знач База, Знач Таблица, Знач СтруктураПоля) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СтруктураПоля); + + Если Не ТипЗнч(СтруктураПоля) = Тип("Структура") + И Не ТипЗнч(СтруктураПоля) = Тип("Соответствие") Тогда + + ВызватьИсключение "Ошибка в данных описания поля"; + + КонецЕсли; + + URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица + "/fields"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Post(URL, СтруктураПоля, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить поле +// Изменяет имя и|или описание существующего поля таблицы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы База - base +// Таблица - Строка - Идентификатор таблицы - table +// Поле - Строка - Идентификатор поля - field +// Наименование - Строка - Новое наименование - title +// Описание - Строка - Новое описание - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ИзменитьПоле(Знач Токен, Знач База, Знач Таблица, Знач Поле, Знач Наименование = "", Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле); + + URL = "https://api.airtable.com/v0/meta/bases/" + + База + + "/tables/" + + Таблица + + "/fields/" + + Поле; + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры); + + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить поле (строковое) +// Получает описание поля строкового типа +// +// Параметры: +// Наименование - Строка - Наименование нового поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеСтроковое(Знач Наименование) Экспорт + Возврат ОписаниеПримитивногоПоля(Наименование, "richText"); +КонецФункции + +// Получить поле (числовое) +// Получает описание поля числового типа +// +// Параметры: +// Наименование - Строка - Наименование нового поля - title +// Точность - Число,Строка - Число знаков после запятой - precision +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеНомера(Знач Наименование, Знач Точность = 0) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьЧисло(Точность); + + СтруктураОпций = Новый Структура("precision", Точность); + Возврат ОписаниеПримитивногоПоля(Наименование, "number", СтруктураОпций); + +КонецФункции + +// Получить поле (файл) +// Получает описание поля файлового типа +// +// Параметры: +// Наименование - Строка - Наименование поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеВложения(Знач Наименование) Экспорт + Возврат ОписаниеПримитивногоПоля(Наименование, "multipleAttachments"); +КонецФункции + +// Получить поле (флажок) +// Получает описание поля типа булево +// +// Параметры: +// Наименование - Строка - Наименование поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеФлажка(Знач Наименование) Экспорт + + СтруктураОпций = Новый Структура("icon,color", "check", "yellowBright"); + Возврат ОписаниеПримитивногоПоля(Наименование, "checkbox", СтруктураОпций); + +КонецФункции + +// Получить поле (дата) +// Получает описание поля типа дата +// +// Параметры: +// Наименование - Строка - Наименование поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеДаты(Знач Наименование) Экспорт + + СтруктураФормата = Новый Структура("format,name", "YYYY-MM-DD", "iso"); + СтруктураОпций = Новый Структура("dateFormat", СтруктураФормата); + + Возврат ОписаниеПримитивногоПоля(Наименование, "date", СтруктураОпций); + +КонецФункции + +// Получить поле (email) +// Получает описание поля с электронной почтой +// +// Параметры: +// Наименование - Строка - Наименование поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеПочты(Знач Наименование) Экспорт + Возврат ОписаниеПримитивногоПоля(Наименование, "email"); +КонецФункции + +// Получить поле (телефон) +// Получает описание поля с номером телефона +// +// Параметры: +// Наименование - Строка - Наименование поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеТелефона(Знач Наименование) Экспорт + Возврат ОписаниеПримитивногоПоля(Наименование, "phoneNumber"); +КонецФункции + +// Получить поле (url) +// Получает описание поля с URL +// +// Параметры: +// Наименование - Строка - Наименование поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеСсылки(Знач Наименование) Экспорт + Возврат ОписаниеПримитивногоПоля(Наименование, "url"); +КонецФункции + +#КонецОбласти + +#Область РаботаСЗаписями + +// Получить список записей +// Получает список записей выбранной таблицы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьСписокЗаписей(Знач Токен, Знач База, Знач Таблица, Знач Отступ = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить запись +// Получает данные строки таблицы по идентификатору +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Запись - Строка - Идентификатор записи в таблице - record +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьЗапись(Знач Токен, Знач База, Знач Таблица, Знач Запись) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать записи +// Создает одну или массив записей по описанию или массиву описаний значений полей +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Данные - Структура, Массив из Структура - Набор или массив наборов пар Ключ : Значение > Поле : Показатель - data +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Данные) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); + + Параметры = Новый Структура(); + ДобавитьОписаниеДанных(Данные, Параметры); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить записи +// Удаляет одну или массив записей по идентификаторам +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Записи - Строка, Массив из Строка - Идентификатор или массив индентификаторов записей - records +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция УдалитьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Записи) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьМассив(Записи); + + СтрокаЗаписей = ""; + + Для Каждого Запись Из Записи Цикл + СтрокаЗаписей = СтрокаЗаписей + + ?(ЗначениеЗаполнено(СтрокаЗаписей), "&", "?") + + "records[]=" + + OPI_Инструменты.ЧислоВСтроку(Запись); + КонецЦикла; + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + СтрокаЗаписей; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСКомментариями + +// Получить комментарии +// Получает список комментариев к записи в таблице +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Запись - Строка - Идентификатор записи в таблице - record +// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьКомментарии(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Отступ = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать комментарий +// Создает комментарий к записи в таблице +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Запись - Строка - Идентификатор записи в таблице - record +// Текст - Строка - Текст комментария - text +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Текст) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить комментарий +// Изменяет текст существующего комментария +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Запись - Строка - Идентификатор записи в таблице - record +// Комментарий - Строка - Идентификатор комментария - comment +// Текст - Строка - Новый текст комментария - text +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ИзменитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий, Знач Текст) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры); + + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить комментарий +// Удаляет комментарий к записи таблицы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Запись - Строка - Идентификатор записи в таблице - record +// Комментарий - Строка - Идентификатор комментария - comment +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция УдалитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьЗаголовокАвторизации(Знач Токен) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization", "Bearer " + Токен); + + Возврат Заголовки; + +КонецФункции + +Функция СформироватьОписаниеТаблицы(Знач Наименование, Знач МассивПолей, Знач Описание = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПолей); + + ОписаниеТаблицы = Новый Структура("name,fields", Наименование, МассивПолей); + + OPI_Инструменты.ДобавитьПоле("description", Описание, "Строка", ОписаниеТаблицы); + + Возврат ОписаниеТаблицы; + +КонецФункции + +Функция ОписаниеПримитивногоПоля(Знач Наименование, Знач Тип, Знач Опции = "") + + СтруктураПоля = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка" , СтруктураПоля); + OPI_Инструменты.ДобавитьПоле("type" , Тип , "Строка" , СтруктураПоля); + OPI_Инструменты.ДобавитьПоле("options", Опции , "Коллекция", СтруктураПоля); + + Возврат СтруктураПоля; + +КонецФункции + +Процедура ДобавитьОписаниеДанных(Знач Данные, Параметры) + + Если ТипЗнч(Данные) = Тип("Массив") Тогда + + МассивОтправки = Новый Массив; + + Для Каждого ОписаниеЗаписи Из Данные Цикл + МассивОтправки.Добавить(Новый Структура("fields", ОписаниеЗаписи)); + КонецЦикла; + + OPI_Инструменты.ДобавитьПоле("records", МассивОтправки, "Массив", Параметры); + + Иначе + + OPI_Инструменты.ДобавитьПоле("fields", Данные, "Коллекция", Параметры); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_Dropbox.os b/ru/OInt/core/Modules/OPI_Dropbox.os index 86abd31dc9..ec50f865c9 100644 --- a/ru/OInt/core/Modules/OPI_Dropbox.os +++ b/ru/OInt/core/Modules/OPI_Dropbox.os @@ -1,961 +1,961 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Dropbox.os -// Библиотека: Dropbox -// Команда CLI: dropbox - -// 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:IncorrectLineBreak-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область АккаунтИАвторизация - -// Получить ссылку авторизации -// Генерирует ссылку авторизации для перехода в браузере -// -// Параметры: -// КлючПриложения - Строка - Ключ приложения - appkey -// -// Возвращаемое значение: -// Строка - URL для перехода в браузере -Функция ПолучитьСсылкуАвторизации(Знач КлючПриложения) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(КлючПриложения); - Возврат "https://www.dropbox.com/oauth2/authorize?client_id=" - + КлючПриложения - + "&response_type=code&token_access_type=offline"; - -КонецФункции - -// Получить токен -// Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации -// -// Параметры: -// КлючПриложения - Строка - Ключ приложения - appkey -// СекретПриложения - Строка - Секрет приложения - appsecret -// Код - Строка - Код со страницы авторизации - code -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач Код) Экспорт - - URL = "https://api.dropbox.com/oauth2/token"; - ТипДанных = "application/x-www-form-urlencoded; charset=utf-8"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("code" , Код , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("grant_type", "authorization_code", "Строка", Параметры); - - СтруктураURL = OPI_Инструменты.РазбитьURL(URL); - Сервер = СтруктураURL["Сервер"]; - Адрес = СтруктураURL["Адрес"]; - - Запрос = OPI_Инструменты.СоздатьЗапрос(Адрес, , ТипДанных); - Соединение = OPI_Инструменты.СоздатьСоединение(Сервер, КлючПриложения, СекретПриложения); - - СтрокаПараметров = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); - - Запрос.УстановитьТелоИзСтроки(Данные); - - Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос); - OPI_Инструменты.ОбработатьОтвет(Ответ); - - Возврат Ответ; - -КонецФункции - -// Обновить токен -// Получает новый токен на основе рефреш токена -// -// Параметры: -// КлючПриложения - Строка - Ключ приложения - appkey -// СекретПриложения - Строка - Секрет приложения - appsecret -// РефрешТокен - Строка - Рефреш токен - refresh -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ОбновитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач РефрешТокен) Экспорт - - Строка_ = "Строка"; - URL = "https://api.dropbox.com/oauth2/token"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("refresh_token", РефрешТокен , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("grant_type" , "refresh_token" , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("client_id" , КлючПриложения , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("client_secret", СекретПриложения, Строка_, Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, , Ложь); - - Возврат Ответ; - -КонецФункции - -// Получить информацию об аккаунте -// Получает информацию об аккаунте -// -// Параметры: -// Токен - Строка - Токен - token -// Аккаунт - Строка - ID аккаунта. Текущий аккаунт токена, если не заполнено - account -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьИнформациюОбАккаунте(Знач Токен, Знач Аккаунт = "") Экспорт - - Если ЗначениеЗаполнено(Аккаунт) Тогда - Результат = ПолучитьАккаунт(Токен, Аккаунт); - Иначе - Результат = ПолучитьСвойАккаунт(Токен); - КонецЕсли; - - Возврат Результат; - -КонецФункции - -// Получить данные использования пространства -// Получает информацию о количестве использованного дискового пространства -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьДанныеИспользованияПространства(Знач Токен) Экспорт - - URL = "https://api.dropboxapi.com/2/users/get_space_usage"; - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.PostBinary(URL - , ПолучитьДвоичныеДанныеИзСтроки("null") - , Заголовки - , - , "text/plain; charset=dropbox-cors-hack"); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСФайламиИКаталогами - -// Получить информацию об объекте -// Получает информацию о файле или каталоге -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту - path -// Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Путь, Знач Подробно = Ложь) Экспорт - - URL = "https://api.dropboxapi.com/2/files/get_metadata"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно, "Булево", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список файлов папки -// Получает список первых файлов каталога или продолжает получение следующих при указании курсора -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к каталогу. Необязателен, если указан курсор - path -// Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail -// Курсор - Строка - Курсор из предыдущего запроса для получения следующего набора файлов - cursor -// -// Возвращаемое значение: -// HTTPОтвет - Получить список файлов папки -Функция ПолучитьСписокФайловПапки(Знач Токен, Знач Путь = "", Знач Подробно = Ложь, Знач Курсор = "") Экспорт - - Если Не ЗначениеЗаполнено(Курсор) Тогда - - URL = "https://api.dropboxapi.com/2/files/list_folder"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно , "Булево", Параметры); - - Иначе - - URL = "https://api.dropboxapi.com/2/files/list_folder/continue"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры); - - КонецЕсли; - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить превью -// Получает PDF или HTML превью объекта (только для токументов) -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту - path -// -// Возвращаемое значение: -// ДвоичныеДанные - превью документа -Функция ПолучитьПревью(Знач Токен, Знач Путь) Экспорт - - URL = "https://content.dropboxapi.com/2/files/get_preview"; - Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина); - - Возврат Ответ; - -КонецФункции - -// Загрузить файл -// Загружает файл на облачный диск -// -// Параметры: -// Токен - Строка - Токен - token -// Файл - Строка, ДвоичныеДанные - Данные файл для загрузки - file -// Путь - Строка - Путь сохранения на Dropbox - path -// Перезаписывать - Булево - Перезаписывать файл при конфликте путей - overwrite -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); - OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - - Режим = ?(Перезаписывать, "overwrite", "add"); - Размер = Файл.Размер(); - Граница = 100000000; - - Если Размер > Граница Тогда - Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим); - Иначе - Ответ = ЗагрузитьМалыйФайл(Токен, Файл, Путь, Режим); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -// Загрузить файл по URL -// Загружает файл на облачный диск, получая его по указанному URL -// -// Параметры: -// Токен - Строка - Токен - token -// URLФайла - Строка - URL источник файла - url -// Путь - Строка - Путь сохранения на Dropbox - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ЗагрузитьФайлПоURL(Знач Токен, Знач URLФайла, Знач Путь) Экспорт - - URL = "https://api.dropboxapi.com/2/files/save_url"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path", Путь , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("url" , URLФайла , "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить статус загрузки по URL -// Получает статус загрузки файла по URL -// -// Параметры: -// Токен - Строка - Токен - token -// IDРаботы - Строка - ID асинхронной работы из ответа ЗагрузитьФайлПоURL - job -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьСтатусЗагрузкиПоURL(Знач Токен, Знач IDРаботы) Экспорт - - URL = "https://api.dropboxapi.com/2/files/save_url/check_job_status"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить объект -// Удаляет объект с облачного диска -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту удаления - path -// БезВозвратно - Строка - Удалить объект без возможности востановления - permanently -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач Безвозвратно = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьБулево(Безвозвратно); - - Если Безвозвратно Тогда - URL = "https://api.dropboxapi.com/2/files/permanently_delete"; - Иначе - URL = "https://api.dropboxapi.com/2/files/delete_v2"; - КонецЕсли; - - Ответ = ОбработатьОбъект(Токен, URL, Путь); - - Возврат Ответ; - -КонецФункции - -// Копировать объект -// Копирует файл или каталог по выбранному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Откуда - Строка - Путь к объекту оригинала - form -// Куда - Строка - Целевой путь для нового объекта - to -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция КопироватьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт - - URL = "https://api.dropboxapi.com/2/files/copy_v2"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("to_path" , Куда , "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Переместить объект -// Перемещает объект по выбранному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Откуда - Строка - Путь к объекту оригинала - form -// Куда - Строка - Целевой путь для нового объекта - to -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПереместитьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт - - URL = "https://api.dropboxapi.com/2/files/move_v2"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("to_path" , Куда , "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать папку -// Создает пустой каталог по выбранному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Целевой путь создания каталога - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт - - URL = "https://api.dropboxapi.com/2/files/create_folder_v2"; - Ответ = ОбработатьОбъект(Токен, URL, Путь); - - Возврат Ответ; - -КонецФункции - -// Скачать файл -// Скачивает файл по указанному пути или ID -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь или ID файла - path -// -// Возвращаемое значение: -// ДвоичныеДанные - двоичные данные файла -Функция СкачатьФайл(Знач Токен, Знач Путь) Экспорт - - URL = "https://content.dropboxapi.com/2/files/download"; - Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина); - - Возврат Ответ; - -КонецФункции - -// Скачать папку -// Скачивает zip архив с содержимым указанного каталога -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь или ID каталога - path -// -// Возвращаемое значение: -// ДвоичныеДанные - двоичные данные zip архива с содержимым каталога -Функция СкачатьПапку(Знач Токен, Знач Путь) Экспорт - - URL = "https://content.dropboxapi.com/2/files/download_zip"; - Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина); - - Возврат Ответ; - -КонецФункции - -// Получить список версий объекта -// Получает список версий (ревизий) объекта -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту - path -// Количество - Строка, Число - Число последних версий объекта для отображения - amount -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьСписокВерсийОбъекта(Знач Токен, Знач Путь, Знач Количество = 10) Экспорт - - URL = "https://api.dropboxapi.com/2/files/list_revisions"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("limit", Количество, "Число" , Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Восстановить объект к версии -// Восстанавливает состояние объекта к необходимой версии (ревизии) -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту - path -// Версия - Строка - ID версии (ревизии) для востановления - rev -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ВосстановитьОбъектКВерсии(Знач Токен, Знач Путь, Знач Версия) Экспорт - - URL = "https://api.dropboxapi.com/2/files/restore"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path", Путь , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("rev" , Версия, "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСТегами - -// Получить список тегов -// Получает список тегов выбранных файлов -// -// Параметры: -// Токен - Строка - Токен - token -// Пути - Строка, Массив Из Строка - Путь или набору путей к файлам - paths -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьСписокТегов(Знач Токен, Знач Пути) Экспорт - - URL = "https://api.dropboxapi.com/2/files/tags/get"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("paths", Пути, "Массив", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Добавить тег -// Добавляет новый текстовый тег к файлу или каталогу -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту, для которого необходимо создать тег - path -// Тег - Строка - Текст тега - tag -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ДобавитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт - - Возврат ОбработатьТег(Токен, Путь, Тег); - -КонецФункции - -// Удалить тег -// Удаляет текстовый тег файла или каталога -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту, тег которого необходимо удалить - path -// Тег - Строка - Текст тега - tag -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция УдалитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт - - Возврат ОбработатьТег(Токен, Путь, Тег, Истина); - -КонецФункции - -#КонецОбласти - -#Область НастройкиСовместногоДоступа - -// Опубликовать папку -// Переводит каталог в режим публичного доступа -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к целевому каталогу - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ОпубликоватьПапку(Знач Токен, Знач Путь) Экспорт - - URL = "https://api.dropboxapi.com/2/sharing/share_folder"; - Ответ = ОбработатьОбъект(Токен, URL, Путь); - - Возврат Ответ; - -КонецФункции - -// Отменить публикацию папки -// Отменяет режим общего доступа для каталога -// -// Параметры: -// Токен - Строка - Токен - token -// IDПапки - Строка - ID публичного каталога (shared folder ID) - folder -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ОтменитьПубликациюПапки(Знач Токен, Знач IDПапки) Экспорт - - URL = "https://api.dropboxapi.com/2/sharing/unshare_folder"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки, "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Добавить пользователя к файлу -// Определяет доступ к файлу для стороннего пользователя -// -// Параметры: -// Токен - Строка - Токен - token -// IDФайла - Строка - ID файла, к которому предоставляется доступ - fileid -// АдресаПочты - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails -// ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ДобавитьПользователейКФайлу(Знач Токен, Знач IDФайла, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт - - Строка_ = "Строка"; - - OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); - OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр); - - Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда - IDФайла = "id:" + IDФайла; - КонецЕсли; - - URL = "https://api.dropboxapi.com/2/sharing/add_file_member"; - - МассивПользователей = Новый Массив; - - Для Каждого Адрес Из АдресаПочты Цикл - - ДанныеПользователя = Новый Соответствие; - OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя); - OPI_Инструменты.ДобавитьПоле("email", Адрес , Строка_, ДанныеПользователя); - - МассивПользователей.Добавить(ДанныеПользователя); - - КонецЦикла; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("file" , IDФайла , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("members", МассивПользователей , "Массив", Параметры); - - Режим = ?(ТолькоПросмотр, "viewer", "editor"); - - OPI_Инструменты.ДобавитьПоле("access_level", Режим , Строка_, Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Добавить пользователей к папке -// Предоставляет стороннии пользователям доступ к каталогу -// -// Параметры: -// Токен - Строка - Токен - token -// IDПапки - Строка - ID публичного каталога (shared folder ID) - folder -// АдресаПочты - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails -// ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly -// -// Возвращаемое значение: -// Неопределено - пустой ответ -Функция ДобавитьПользователейКПапке(Знач Токен, Знач IDПапки, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт - - Строка_ = "Строка"; - - OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты); - OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр); - Режим = ?(ТолькоПросмотр, "viewer", "editor"); - - URL = "https://api.dropboxapi.com/2/sharing/add_folder_member"; - - МассивПользователей = Новый Массив; - - Для Каждого Адрес Из АдресаПочты Цикл - - ДанныеПользователя = Новый Соответствие; - OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя); - OPI_Инструменты.ДобавитьПоле("email", Адрес , Строка_, ДанныеПользователя); - - СтруктураПользователя = Новый Структура("member,access_level", ДанныеПользователя, Режим); - - МассивПользователей.Добавить(СтруктураПользователя); - - КонецЦикла; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("members" , МассивПользователей , "Массив", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить статус асинхронного изменения -// Получает статус асинхронной работы по изменению доступов -// -// Параметры: -// Токен - Строка - Токен - token -// IDРаботы - Строка - ID асинхронной работы - job -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьСтатусАсинхронногоИзменения(Знач Токен, Знач IDРаботы) Экспорт - - URL = "https://api.dropboxapi.com/2/sharing/check_job_status"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Отменить публикацию файла -// Запрещает доступ к файлу для внешних пользователей -// -// Параметры: -// Токен - Строка - Токен - token -// IDФайла - Строка - ID файла, к которому предоставляется доступ - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ОтменитьПубликациюФайла(Знач Токен, Знач IDФайла) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); - - Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда - IDФайла = "id:" + IDФайла; - КонецЕсли; - - URL = "https://api.dropboxapi.com/2/sharing/unshare_file"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("file", IDФайла, "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ОбработатьОбъект(Знач Токен, Знач URL, Знач Путь, Знач ВЗаголовках = Ложь) - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Параметры); - - Если ВЗаголовках Тогда - Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); - Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); - Иначе - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ОбработатьТег(Знач Токен, Знач Путь, Знач Тег, Знач ЭтоУдаление = Ложь) - - Если ЭтоУдаление Тогда - URL = "https://api.dropboxapi.com/2/files/tags/remove"; - Иначе - URL = "https://api.dropboxapi.com/2/files/tags/add"; - КонецЕсли; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path" , Путь, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("tag_text" , Тег , "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -Функция ПолучитьЗаголовкиЗапроса(Знач Токен, Знач Параметры = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Authorization" , "Bearer " + Токен); - - Если ЗначениеЗаполнено(Параметры) Тогда - - JSON = OPI_Инструменты.JSONСтрокой(Параметры, "Нет"); - JSON = СтрЗаменить(JSON, Символы.ВК + Символы.ПС, ""); - - Заголовки.Вставить("Dropbox-API-Arg", JSON); - - КонецЕсли; - - Возврат Заголовки; - -КонецФункции - -Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим) - - URL = "https://content.dropboxapi.com/2/files/upload_session/append_v2"; - - РазмерЧасти = 100000000; - ТекущаяПозиция = 0; - ПрочитаноБайт = 0; - ОбщийРазмер = Файл.Размер(); - Сессия = ОткрытьСессию(Токен); - - Пока ПрочитаноБайт < ОбщийРазмер Цикл - - Отступ = ТекущаяПозиция; - Курсор = Новый Структура("offset,session_id", Отступ, Сессия); - - Параметры = Новый Структура("cursor", Курсор); - Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); - - ЧтениеДанных = Новый ЧтениеДанных(Файл); - ПрочитаноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция); - Результат = ЧтениеДанных.Прочитать(РазмерЧасти); - ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); - РазмерТекущих = ТекущиеДанные.Размер(); - СледующаяПозиция = ТекущаяПозиция + РазмерТекущих; - - Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда - Прервать; - КонецЕсли; - - Ответ = OPI_Инструменты.PostBinary(URL, ТекущиеДанные, Заголовки); - - ТекущаяПозиция = СледующаяПозиция; - - КБайт = 1024; - МБайт = КБайт * КБайт; - Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт)); - - ВыполнитьСборкуМусора(); - ОсвободитьОбъект(ТекущиеДанные); - - КонецЦикла; - - Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия); - - Возврат Ответ; - -КонецФункции - -Функция ЗагрузитьМалыйФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим) - - Булево_ = "Булево"; - Строка_ = "Строка"; - URL = "https://content.dropboxapi.com/2/files/upload"; - - Параметры = Новый Структура; - - OPI_Инструменты.ДобавитьПоле("autorename" , Ложь , Булево_, Параметры); - OPI_Инструменты.ДобавитьПоле("mode" , Режим, Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("mute" , Ложь , Булево_, Параметры); - OPI_Инструменты.ДобавитьПоле("path" , Путь , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("strict_conflict", Ложь , Булево_, Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); - - Ответ = OPI_Инструменты.PostBinary(URL, Файл, Заголовки); - - Возврат Ответ; - -КонецФункции - -Функция ОткрытьСессию(Знач Токен) - - SessionId = "session_id"; - URL = "https://content.dropboxapi.com/2/files/upload_session/start"; - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); - - Возврат Ответ[SessionId]; - -КонецФункции - -Функция ЗакрытьСессию(Знач Токен, Знач Путь, Знач Режим, Знач ОбщийРазмер, Знач Сессия) - - URL = "https://content.dropboxapi.com/2/files/upload_session/finish"; - - Коммит = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("mode", Режим, "Строка", Коммит); - OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Коммит); - - Курсор = Новый Структура("offset,session_id", ОбщийРазмер, Сессия); - - Параметры = Новый Структура("commit,cursor", Коммит, Курсор); - Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); - - Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); - - Возврат Ответ; - -КонецФункции - -Функция ПолучитьАккаунт(Знач Токен, Знач Аккаунт) - - URL = "https://api.dropboxapi.com/2/users/get_account"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("account_id", Аккаунт, "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -Функция ПолучитьСвойАккаунт(Знач Токен) - - URL = "https://api.dropboxapi.com/2/users/get_current_account"; - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.PostBinary(URL - , ПолучитьДвоичныеДанныеИзСтроки("null") - , Заголовки - , - , "text/plain; charset=dropbox-cors-hack"); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Dropbox.os +// Библиотека: Dropbox +// Команда CLI: dropbox + +// 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:IncorrectLineBreak-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область АккаунтИАвторизация + +// Получить ссылку авторизации +// Генерирует ссылку авторизации для перехода в браузере +// +// Параметры: +// КлючПриложения - Строка - Ключ приложения - appkey +// +// Возвращаемое значение: +// Строка - URL для перехода в браузере +Функция ПолучитьСсылкуАвторизации(Знач КлючПриложения) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(КлючПриложения); + Возврат "https://www.dropbox.com/oauth2/authorize?client_id=" + + КлючПриложения + + "&response_type=code&token_access_type=offline"; + +КонецФункции + +// Получить токен +// Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации +// +// Параметры: +// КлючПриложения - Строка - Ключ приложения - appkey +// СекретПриложения - Строка - Секрет приложения - appsecret +// Код - Строка - Код со страницы авторизации - code +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач Код) Экспорт + + URL = "https://api.dropbox.com/oauth2/token"; + ТипДанных = "application/x-www-form-urlencoded; charset=utf-8"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("code" , Код , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("grant_type", "authorization_code", "Строка", Параметры); + + СтруктураURL = OPI_Инструменты.РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"]; + + Запрос = OPI_Инструменты.СоздатьЗапрос(Адрес, , ТипДанных); + Соединение = OPI_Инструменты.СоздатьСоединение(Сервер, КлючПриложения, СекретПриложения); + + СтрокаПараметров = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); + + Запрос.УстановитьТелоИзСтроки(Данные); + + Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос); + OPI_Инструменты.ОбработатьОтвет(Ответ); + + Возврат Ответ; + +КонецФункции + +// Обновить токен +// Получает новый токен на основе рефреш токена +// +// Параметры: +// КлючПриложения - Строка - Ключ приложения - appkey +// СекретПриложения - Строка - Секрет приложения - appsecret +// РефрешТокен - Строка - Рефреш токен - refresh +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ОбновитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач РефрешТокен) Экспорт + + Строка_ = "Строка"; + URL = "https://api.dropbox.com/oauth2/token"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("refresh_token", РефрешТокен , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("grant_type" , "refresh_token" , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("client_id" , КлючПриложения , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("client_secret", СекретПриложения, Строка_, Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, , Ложь); + + Возврат Ответ; + +КонецФункции + +// Получить информацию об аккаунте +// Получает информацию об аккаунте +// +// Параметры: +// Токен - Строка - Токен - token +// Аккаунт - Строка - ID аккаунта. Текущий аккаунт токена, если не заполнено - account +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьИнформациюОбАккаунте(Знач Токен, Знач Аккаунт = "") Экспорт + + Если ЗначениеЗаполнено(Аккаунт) Тогда + Результат = ПолучитьАккаунт(Токен, Аккаунт); + Иначе + Результат = ПолучитьСвойАккаунт(Токен); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Получить данные использования пространства +// Получает информацию о количестве использованного дискового пространства +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьДанныеИспользованияПространства(Знач Токен) Экспорт + + URL = "https://api.dropboxapi.com/2/users/get_space_usage"; + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.PostBinary(URL + , ПолучитьДвоичныеДанныеИзСтроки("null") + , Заголовки + , + , "text/plain; charset=dropbox-cors-hack"); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСФайламиИКаталогами + +// Получить информацию об объекте +// Получает информацию о файле или каталоге +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту - path +// Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Путь, Знач Подробно = Ложь) Экспорт + + URL = "https://api.dropboxapi.com/2/files/get_metadata"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно, "Булево", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список файлов папки +// Получает список первых файлов каталога или продолжает получение следующих при указании курсора +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к каталогу. Необязателен, если указан курсор - path +// Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail +// Курсор - Строка - Курсор из предыдущего запроса для получения следующего набора файлов - cursor +// +// Возвращаемое значение: +// HTTPОтвет - Получить список файлов папки +Функция ПолучитьСписокФайловПапки(Знач Токен, Знач Путь = "", Знач Подробно = Ложь, Знач Курсор = "") Экспорт + + Если Не ЗначениеЗаполнено(Курсор) Тогда + + URL = "https://api.dropboxapi.com/2/files/list_folder"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно , "Булево", Параметры); + + Иначе + + URL = "https://api.dropboxapi.com/2/files/list_folder/continue"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры); + + КонецЕсли; + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить превью +// Получает PDF или HTML превью объекта (только для токументов) +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту - path +// +// Возвращаемое значение: +// ДвоичныеДанные - превью документа +Функция ПолучитьПревью(Знач Токен, Знач Путь) Экспорт + + URL = "https://content.dropboxapi.com/2/files/get_preview"; + Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина); + + Возврат Ответ; + +КонецФункции + +// Загрузить файл +// Загружает файл на облачный диск +// +// Параметры: +// Токен - Строка - Токен - token +// Файл - Строка, ДвоичныеДанные - Данные файл для загрузки - file +// Путь - Строка - Путь сохранения на Dropbox - path +// Перезаписывать - Булево - Перезаписывать файл при конфликте путей - overwrite +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + + Режим = ?(Перезаписывать, "overwrite", "add"); + Размер = Файл.Размер(); + Граница = 100000000; + + Если Размер > Граница Тогда + Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим); + Иначе + Ответ = ЗагрузитьМалыйФайл(Токен, Файл, Путь, Режим); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +// Загрузить файл по URL +// Загружает файл на облачный диск, получая его по указанному URL +// +// Параметры: +// Токен - Строка - Токен - token +// URLФайла - Строка - URL источник файла - url +// Путь - Строка - Путь сохранения на Dropbox - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ЗагрузитьФайлПоURL(Знач Токен, Знач URLФайла, Знач Путь) Экспорт + + URL = "https://api.dropboxapi.com/2/files/save_url"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path", Путь , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("url" , URLФайла , "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить статус загрузки по URL +// Получает статус загрузки файла по URL +// +// Параметры: +// Токен - Строка - Токен - token +// IDРаботы - Строка - ID асинхронной работы из ответа ЗагрузитьФайлПоURL - job +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьСтатусЗагрузкиПоURL(Знач Токен, Знач IDРаботы) Экспорт + + URL = "https://api.dropboxapi.com/2/files/save_url/check_job_status"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить объект +// Удаляет объект с облачного диска +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту удаления - path +// БезВозвратно - Строка - Удалить объект без возможности востановления - permanently +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач Безвозвратно = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьБулево(Безвозвратно); + + Если Безвозвратно Тогда + URL = "https://api.dropboxapi.com/2/files/permanently_delete"; + Иначе + URL = "https://api.dropboxapi.com/2/files/delete_v2"; + КонецЕсли; + + Ответ = ОбработатьОбъект(Токен, URL, Путь); + + Возврат Ответ; + +КонецФункции + +// Копировать объект +// Копирует файл или каталог по выбранному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Откуда - Строка - Путь к объекту оригинала - form +// Куда - Строка - Целевой путь для нового объекта - to +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция КопироватьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт + + URL = "https://api.dropboxapi.com/2/files/copy_v2"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("to_path" , Куда , "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Переместить объект +// Перемещает объект по выбранному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Откуда - Строка - Путь к объекту оригинала - form +// Куда - Строка - Целевой путь для нового объекта - to +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПереместитьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт + + URL = "https://api.dropboxapi.com/2/files/move_v2"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("to_path" , Куда , "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать папку +// Создает пустой каталог по выбранному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Целевой путь создания каталога - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт + + URL = "https://api.dropboxapi.com/2/files/create_folder_v2"; + Ответ = ОбработатьОбъект(Токен, URL, Путь); + + Возврат Ответ; + +КонецФункции + +// Скачать файл +// Скачивает файл по указанному пути или ID +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь или ID файла - path +// +// Возвращаемое значение: +// ДвоичныеДанные - двоичные данные файла +Функция СкачатьФайл(Знач Токен, Знач Путь) Экспорт + + URL = "https://content.dropboxapi.com/2/files/download"; + Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина); + + Возврат Ответ; + +КонецФункции + +// Скачать папку +// Скачивает zip архив с содержимым указанного каталога +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь или ID каталога - path +// +// Возвращаемое значение: +// ДвоичныеДанные - двоичные данные zip архива с содержимым каталога +Функция СкачатьПапку(Знач Токен, Знач Путь) Экспорт + + URL = "https://content.dropboxapi.com/2/files/download_zip"; + Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина); + + Возврат Ответ; + +КонецФункции + +// Получить список версий объекта +// Получает список версий (ревизий) объекта +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту - path +// Количество - Строка, Число - Число последних версий объекта для отображения - amount +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьСписокВерсийОбъекта(Знач Токен, Знач Путь, Знач Количество = 10) Экспорт + + URL = "https://api.dropboxapi.com/2/files/list_revisions"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("limit", Количество, "Число" , Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Восстановить объект к версии +// Восстанавливает состояние объекта к необходимой версии (ревизии) +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту - path +// Версия - Строка - ID версии (ревизии) для востановления - rev +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ВосстановитьОбъектКВерсии(Знач Токен, Знач Путь, Знач Версия) Экспорт + + URL = "https://api.dropboxapi.com/2/files/restore"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path", Путь , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("rev" , Версия, "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСТегами + +// Получить список тегов +// Получает список тегов выбранных файлов +// +// Параметры: +// Токен - Строка - Токен - token +// Пути - Строка, Массив Из Строка - Путь или набору путей к файлам - paths +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьСписокТегов(Знач Токен, Знач Пути) Экспорт + + URL = "https://api.dropboxapi.com/2/files/tags/get"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("paths", Пути, "Массив", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Добавить тег +// Добавляет новый текстовый тег к файлу или каталогу +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту, для которого необходимо создать тег - path +// Тег - Строка - Текст тега - tag +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ДобавитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт + + Возврат ОбработатьТег(Токен, Путь, Тег); + +КонецФункции + +// Удалить тег +// Удаляет текстовый тег файла или каталога +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту, тег которого необходимо удалить - path +// Тег - Строка - Текст тега - tag +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция УдалитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт + + Возврат ОбработатьТег(Токен, Путь, Тег, Истина); + +КонецФункции + +#КонецОбласти + +#Область НастройкиСовместногоДоступа + +// Опубликовать папку +// Переводит каталог в режим публичного доступа +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к целевому каталогу - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ОпубликоватьПапку(Знач Токен, Знач Путь) Экспорт + + URL = "https://api.dropboxapi.com/2/sharing/share_folder"; + Ответ = ОбработатьОбъект(Токен, URL, Путь); + + Возврат Ответ; + +КонецФункции + +// Отменить публикацию папки +// Отменяет режим общего доступа для каталога +// +// Параметры: +// Токен - Строка - Токен - token +// IDПапки - Строка - ID публичного каталога (shared folder ID) - folder +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ОтменитьПубликациюПапки(Знач Токен, Знач IDПапки) Экспорт + + URL = "https://api.dropboxapi.com/2/sharing/unshare_folder"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки, "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Добавить пользователя к файлу +// Определяет доступ к файлу для стороннего пользователя +// +// Параметры: +// Токен - Строка - Токен - token +// IDФайла - Строка - ID файла, к которому предоставляется доступ - fileid +// АдресаПочты - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails +// ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ДобавитьПользователейКФайлу(Знач Токен, Знач IDФайла, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт + + Строка_ = "Строка"; + + OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); + OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр); + + Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда + IDФайла = "id:" + IDФайла; + КонецЕсли; + + URL = "https://api.dropboxapi.com/2/sharing/add_file_member"; + + МассивПользователей = Новый Массив; + + Для Каждого Адрес Из АдресаПочты Цикл + + ДанныеПользователя = Новый Соответствие; + OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя); + OPI_Инструменты.ДобавитьПоле("email", Адрес , Строка_, ДанныеПользователя); + + МассивПользователей.Добавить(ДанныеПользователя); + + КонецЦикла; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("file" , IDФайла , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("members", МассивПользователей , "Массив", Параметры); + + Режим = ?(ТолькоПросмотр, "viewer", "editor"); + + OPI_Инструменты.ДобавитьПоле("access_level", Режим , Строка_, Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Добавить пользователей к папке +// Предоставляет стороннии пользователям доступ к каталогу +// +// Параметры: +// Токен - Строка - Токен - token +// IDПапки - Строка - ID публичного каталога (shared folder ID) - folder +// АдресаПочты - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails +// ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly +// +// Возвращаемое значение: +// Неопределено - пустой ответ +Функция ДобавитьПользователейКПапке(Знач Токен, Знач IDПапки, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт + + Строка_ = "Строка"; + + OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты); + OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр); + Режим = ?(ТолькоПросмотр, "viewer", "editor"); + + URL = "https://api.dropboxapi.com/2/sharing/add_folder_member"; + + МассивПользователей = Новый Массив; + + Для Каждого Адрес Из АдресаПочты Цикл + + ДанныеПользователя = Новый Соответствие; + OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя); + OPI_Инструменты.ДобавитьПоле("email", Адрес , Строка_, ДанныеПользователя); + + СтруктураПользователя = Новый Структура("member,access_level", ДанныеПользователя, Режим); + + МассивПользователей.Добавить(СтруктураПользователя); + + КонецЦикла; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("members" , МассивПользователей , "Массив", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить статус асинхронного изменения +// Получает статус асинхронной работы по изменению доступов +// +// Параметры: +// Токен - Строка - Токен - token +// IDРаботы - Строка - ID асинхронной работы - job +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьСтатусАсинхронногоИзменения(Знач Токен, Знач IDРаботы) Экспорт + + URL = "https://api.dropboxapi.com/2/sharing/check_job_status"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Отменить публикацию файла +// Запрещает доступ к файлу для внешних пользователей +// +// Параметры: +// Токен - Строка - Токен - token +// IDФайла - Строка - ID файла, к которому предоставляется доступ - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ОтменитьПубликациюФайла(Знач Токен, Знач IDФайла) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); + + Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда + IDФайла = "id:" + IDФайла; + КонецЕсли; + + URL = "https://api.dropboxapi.com/2/sharing/unshare_file"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("file", IDФайла, "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ОбработатьОбъект(Знач Токен, Знач URL, Знач Путь, Знач ВЗаголовках = Ложь) + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Параметры); + + Если ВЗаголовках Тогда + Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); + Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); + Иначе + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ОбработатьТег(Знач Токен, Знач Путь, Знач Тег, Знач ЭтоУдаление = Ложь) + + Если ЭтоУдаление Тогда + URL = "https://api.dropboxapi.com/2/files/tags/remove"; + Иначе + URL = "https://api.dropboxapi.com/2/files/tags/add"; + КонецЕсли; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path" , Путь, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("tag_text" , Тег , "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +Функция ПолучитьЗаголовкиЗапроса(Знач Токен, Знач Параметры = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization" , "Bearer " + Токен); + + Если ЗначениеЗаполнено(Параметры) Тогда + + JSON = OPI_Инструменты.JSONСтрокой(Параметры, "Нет"); + JSON = СтрЗаменить(JSON, Символы.ВК + Символы.ПС, ""); + + Заголовки.Вставить("Dropbox-API-Arg", JSON); + + КонецЕсли; + + Возврат Заголовки; + +КонецФункции + +Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим) + + URL = "https://content.dropboxapi.com/2/files/upload_session/append_v2"; + + РазмерЧасти = 100000000; + ТекущаяПозиция = 0; + ПрочитаноБайт = 0; + ОбщийРазмер = Файл.Размер(); + Сессия = ОткрытьСессию(Токен); + + Пока ПрочитаноБайт < ОбщийРазмер Цикл + + Отступ = ТекущаяПозиция; + Курсор = Новый Структура("offset,session_id", Отступ, Сессия); + + Параметры = Новый Структура("cursor", Курсор); + Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); + + ЧтениеДанных = Новый ЧтениеДанных(Файл); + ПрочитаноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция); + Результат = ЧтениеДанных.Прочитать(РазмерЧасти); + ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); + РазмерТекущих = ТекущиеДанные.Размер(); + СледующаяПозиция = ТекущаяПозиция + РазмерТекущих; + + Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда + Прервать; + КонецЕсли; + + Ответ = OPI_Инструменты.PostBinary(URL, ТекущиеДанные, Заголовки); + + ТекущаяПозиция = СледующаяПозиция; + + КБайт = 1024; + МБайт = КБайт * КБайт; + Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт)); + + ВыполнитьСборкуМусора(); + ОсвободитьОбъект(ТекущиеДанные); + + КонецЦикла; + + Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия); + + Возврат Ответ; + +КонецФункции + +Функция ЗагрузитьМалыйФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим) + + Булево_ = "Булево"; + Строка_ = "Строка"; + URL = "https://content.dropboxapi.com/2/files/upload"; + + Параметры = Новый Структура; + + OPI_Инструменты.ДобавитьПоле("autorename" , Ложь , Булево_, Параметры); + OPI_Инструменты.ДобавитьПоле("mode" , Режим, Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("mute" , Ложь , Булево_, Параметры); + OPI_Инструменты.ДобавитьПоле("path" , Путь , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("strict_conflict", Ложь , Булево_, Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); + + Ответ = OPI_Инструменты.PostBinary(URL, Файл, Заголовки); + + Возврат Ответ; + +КонецФункции + +Функция ОткрытьСессию(Знач Токен) + + SessionId = "session_id"; + URL = "https://content.dropboxapi.com/2/files/upload_session/start"; + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); + + Возврат Ответ[SessionId]; + +КонецФункции + +Функция ЗакрытьСессию(Знач Токен, Знач Путь, Знач Режим, Знач ОбщийРазмер, Знач Сессия) + + URL = "https://content.dropboxapi.com/2/files/upload_session/finish"; + + Коммит = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("mode", Режим, "Строка", Коммит); + OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Коммит); + + Курсор = Новый Структура("offset,session_id", ОбщийРазмер, Сессия); + + Параметры = Новый Структура("commit,cursor", Коммит, Курсор); + Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); + + Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); + + Возврат Ответ; + +КонецФункции + +Функция ПолучитьАккаунт(Знач Токен, Знач Аккаунт) + + URL = "https://api.dropboxapi.com/2/users/get_account"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("account_id", Аккаунт, "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +Функция ПолучитьСвойАккаунт(Знач Токен) + + URL = "https://api.dropboxapi.com/2/users/get_current_account"; + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.PostBinary(URL + , ПолучитьДвоичныеДанныеИзСтроки("null") + , Заголовки + , + , "text/plain; charset=dropbox-cors-hack"); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_GoogleCalendar.os b/ru/OInt/core/Modules/OPI_GoogleCalendar.os index 39655aaeb8..639c88a94b 100644 --- a/ru/OInt/core/Modules/OPI_GoogleCalendar.os +++ b/ru/OInt/core/Modules/OPI_GoogleCalendar.os @@ -1,631 +1,631 @@ -// Расположение OS: ./OInt/core/Modules/OPI_GoogleCalendar.os -// Библиотека: Google Calendar -// Команда CLI: gcalendar - -// 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:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область РаботаСМетаданнымиКалендарей - -// Создать календарь -// Создает пустой календарь -// -// Параметры: -// Токен - Строка - Токен - token -// Наименование - Строка - Наименование создаваемого календаря - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars"; - - Параметры = Новый Структура; - Параметры.Вставить("summary" , Наименование); - Параметры.Вставить("timeZone", "Europe/Moscow"); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить календарь -// Получает информацию о календаре по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить календарь -// Изменяет свойства существуещего календаря -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// Наименование - Строка - Новое наименование - title -// Описание - Строка - Новое описание календаря - description -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ИзменитьМетаданныеКалендаря(Знач Токен - , Знач Календарь - , Знач Наименование = "" - , Знач Описание = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; - - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Наименование) Тогда - Параметры.Вставить("summary", Наименование); - КонецЕсли; - - Если ЗначениеЗаполнено(Описание) Тогда - Параметры.Вставить("description", Описание); - КонецЕсли; - - Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); - - Возврат Ответ; - -КонецФункции - -// Очистить основной календарь -// Очищает список событий основного календаря -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/primary/clear"; - Ответ = OPI_Инструменты.Post(URL, , Заголовки, Ложь); - - Возврат Ответ; - -КонецФункции - -// Удалить календарь -// Удаляет календарь по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСоСпискомКалендарей - -// Получить список календарей -// Получает массив календарей аккаунта -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Массив соответствий данных календарей -Функция ПолучитьСписокКалендарей(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - МассивКалендарей = Новый Массив; - - ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей); - - Возврат МассивКалендарей; - -КонецФункции - -// Добавить календарь в список -// Добавляет существующий календарь в список пользователя -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ДобавитьКалендарьВСписок(Знач Токен, Знач Календарь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList"; - - Параметры = Новый Структура; - Параметры.Вставить("id", Календарь); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить календарь списка -// Получает календарь из списка пользователя по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить календарь из списка -// Удаляет календарь из списка пользователя -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить календарь списка -// Изменяет свойства календаря из списка пользователей -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// ОсновнойЦвет - Строка - HEX основного цвета (#ffffff) - primary -// ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff) - secondary -// Скрытый - Булево - Скрытый календарь - hidden -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ИзменитьКалендарьСписка(Знач Токен - , Знач Календарь - , Знач ОсновнойЦвет - , Знач ДополнительныйЦвет - , Знач Скрытый = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ОсновнойЦвет); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ДополнительныйЦвет); - OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытый); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true"; - - Параметры = Новый Соответствие; - Параметры.Вставить("hidden" , Скрытый); - Параметры.Вставить("foregroundColor", ОсновнойЦвет); - Параметры.Вставить("backgroundColor", ДополнительныйЦвет); - - Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаССобытиями - -// Получить описание события !NOCLI -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Пустой макет события -Функция ПолучитьОписаниеСобытия() Экспорт - - ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); - Час = 3600; - Событие = Новый Соответствие; - - Событие.Вставить("Описание" , ""); // Описание события - Событие.Вставить("Заголовок" , "Новое событие"); // Заголовок события - Событие.Вставить("МестоПроведения" , ""); // Строка описание места проведения - Событие.Вставить("ДатаНачала" , ТекущаяДата); // Дата начала события - Событие.Вставить("ДатаОкончания" , ТекущаяДата + Час); // Дата окончания события - Событие.Вставить("МассивURLФайловВложений", Новый Соответствие); // Ключ - название, Значение - URL к файлу - Событие.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам - - Возврат Событие; - -КонецФункции - -// Получить список событий -// Получает список всех событий календаря -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Массив соответствий событий -Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - МассивСобытий = Новый Массив; - - ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий); - - Возврат МассивСобытий; - -КонецФункции - -// Получить событие -// Получает событие по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// Событие - Строка - ID события - event -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" - + Календарь - + "/events/" - + Событие; - - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать событие -// Создает новое событие -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события - props -// -// Возвращаемое значение: -// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google -Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт - Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия); -КонецФункции - -// Переместить событие -// Перемещает событие в другой календарь -// -// Параметры: -// Токен - Строка - Токен - token -// КалендарьИсточник - Строка - ID календаря источника - from -// КалендарьПриемник - Строка - ID календаря приемника - to -// Событие - Строка - ID события календаря источника - event -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьИсточник); - OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьПриемник); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" - + КалендарьИсточник - + "/events/" - + Событие - + "/move?destination=" - + КалендарьПриемник; - - Ответ = OPI_Инструменты.Post(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить событие -// Изменяет существующее событие -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// ОписаниеСобытия - Строка - Новое описание события - props -// Событие - Строка - ID события - event -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт - Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие); -КонецФункции - -// Удалить событие -// Удаляет событие по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// Событие - Строка - ID события - event -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" - + Календарь - + "/events/" - + Событие; - - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ПреобразоватьДату(Знач Дата) - - OPI_ПреобразованиеТипов.ПолучитьДату(Дата); - - СтруктураДаты = Новый Структура; - - Если Не ТипЗнч(Дата) = Тип("Дата") Тогда - Возврат Неопределено; - КонецЕсли; - - Если Дата = НачалоДня(Дата) Тогда - ФорматДаты = "ДФ=yyyy-MM-dd"; - Поле = "date"; - Иначе - ФорматДаты = "ДФ=yyyy-MM-ddTHH:mm:ssZ"; - Поле = "dateTime"; - КонецЕсли; - - Дата = Формат(Дата, ФорматДаты); - СтруктураДаты.Вставить(Поле , Дата); - СтруктураДаты.Вставить("timeZone", "Europe/Moscow"); - - Возврат СтруктураДаты; - -КонецФункции - -Функция ПреобразоватьВложения(Знач Вложения) - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Вложения); - - МассивВложений = Новый Массив; - - Если ТипЗнч(Вложения) = Тип("Соответствие") Или ТипЗнч(Вложения) = Тип("Структура") Тогда - - Для Каждого Вложение Из Вложения Цикл - - ТекущеВложение = Новый Структура; - ТекущеВложение.Вставить("title" , Вложение.Ключ); - ТекущеВложение.Вставить("fileUrl", Вложение.Значение); - - МассивВложений.Добавить(ТекущеВложение); - - КонецЦикла; - - КонецЕсли; - - Если МассивВложений.Количество() > 0 Тогда - Возврат МассивВложений; - Иначе - Возврат Неопределено; - КонецЕсли; - -КонецФункции - -Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеСобытия); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - Существующее = ЗначениеЗаполнено(Событие); - URL = "https://www.googleapis.com/calendar/v3/calendars/" - + Календарь - + "/events" - + ?(Существующее, "/" + Событие, ""); - - Дата0 = ОписаниеСобытия["ДатаНачала"]; - Дата1 = ОписаниеСобытия["ДатаОкончания"]; - Вложения = ОписаниеСобытия["МассивURLФайловВложений"]; - Вложения = ПреобразоватьВложения(Вложения); - Уведомления = ?(ОписаниеСобытия["ОтправлятьУведомления"] = Неопределено - , Ложь - , ОписаниеСобытия["ОтправлятьУведомления"]); - - Параметры = Новый Структура; - Параметры.Вставить("summary" , ОписаниеСобытия["Заголовок"]); - Параметры.Вставить("description", ОписаниеСобытия["Описание"]); - Параметры.Вставить("location" , ОписаниеСобытия["МестоПроведения"]); - Параметры.Вставить("start" , ПреобразоватьДату(Дата0)); - Параметры.Вставить("end" , ПреобразоватьДату(Дата1)); - Параметры.Вставить("attachments", Вложения); - - ПараметрыURL = Новый Структура; - ПараметрыURL.Вставить("sendUpdates" , ?(Уведомления, "all", "none")); - ПараметрыURL.Вставить("supportsAttachments" , ?(ЗначениеЗаполнено(Вложения), "true", "false")); - - URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); - - OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры); - - Если Существующее Тогда - Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); - Иначе - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки, Истина); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "") - - Items = "items"; - NPT = "nextPageToken"; - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Страница) Тогда - Параметры.Вставить("pageToken", Страница); - КонецЕсли; - - Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList" - , Параметры - , Заголовки); - - Календари = Результат[Items]; - Страница = Результат[NPT]; - - Для Каждого Календарь Из Календари Цикл - МассивКалендарей.Добавить(Календарь); - КонецЦикла; - - Если Календари.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда - ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей, Страница); - КонецЕсли; - -КонецПроцедуры - -Процедура ПолучитьСписокСобытийРекурсивно(Знач Заголовки, Знач Календарь, МассивСобытий, Страница = "") - - Items = "items"; - NPT = "nextPageToken"; - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Страница) Тогда - Параметры.Вставить("pageToken", Страница); - КонецЕсли; - - Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events" - , Параметры - , Заголовки); - - События = Результат[Items]; - Страница = Результат[NPT]; - - Для Каждого Событие Из События Цикл - МассивСобытий.Добавить(Событие); - КонецЦикла; - - Если События.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда - ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_GoogleCalendar.os +// Библиотека: Google Calendar +// Команда CLI: gcalendar + +// 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:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область РаботаСМетаданнымиКалендарей + +// Создать календарь +// Создает пустой календарь +// +// Параметры: +// Токен - Строка - Токен - token +// Наименование - Строка - Наименование создаваемого календаря - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars"; + + Параметры = Новый Структура; + Параметры.Вставить("summary" , Наименование); + Параметры.Вставить("timeZone", "Europe/Moscow"); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить календарь +// Получает информацию о календаре по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить календарь +// Изменяет свойства существуещего календаря +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// Наименование - Строка - Новое наименование - title +// Описание - Строка - Новое описание календаря - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ИзменитьМетаданныеКалендаря(Знач Токен + , Знач Календарь + , Знач Наименование = "" + , Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Наименование) Тогда + Параметры.Вставить("summary", Наименование); + КонецЕсли; + + Если ЗначениеЗаполнено(Описание) Тогда + Параметры.Вставить("description", Описание); + КонецЕсли; + + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); + + Возврат Ответ; + +КонецФункции + +// Очистить основной календарь +// Очищает список событий основного календаря +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/primary/clear"; + Ответ = OPI_Инструменты.Post(URL, , Заголовки, Ложь); + + Возврат Ответ; + +КонецФункции + +// Удалить календарь +// Удаляет календарь по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСоСпискомКалендарей + +// Получить список календарей +// Получает массив календарей аккаунта +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Массив соответствий данных календарей +Функция ПолучитьСписокКалендарей(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + МассивКалендарей = Новый Массив; + + ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей); + + Возврат МассивКалендарей; + +КонецФункции + +// Добавить календарь в список +// Добавляет существующий календарь в список пользователя +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ДобавитьКалендарьВСписок(Знач Токен, Знач Календарь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList"; + + Параметры = Новый Структура; + Параметры.Вставить("id", Календарь); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить календарь списка +// Получает календарь из списка пользователя по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить календарь из списка +// Удаляет календарь из списка пользователя +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить календарь списка +// Изменяет свойства календаря из списка пользователей +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// ОсновнойЦвет - Строка - HEX основного цвета (#ffffff) - primary +// ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff) - secondary +// Скрытый - Булево - Скрытый календарь - hidden +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ИзменитьКалендарьСписка(Знач Токен + , Знач Календарь + , Знач ОсновнойЦвет + , Знач ДополнительныйЦвет + , Знач Скрытый = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ОсновнойЦвет); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ДополнительныйЦвет); + OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытый); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true"; + + Параметры = Новый Соответствие; + Параметры.Вставить("hidden" , Скрытый); + Параметры.Вставить("foregroundColor", ОсновнойЦвет); + Параметры.Вставить("backgroundColor", ДополнительныйЦвет); + + Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаССобытиями + +// Получить описание события !NOCLI +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Пустой макет события +Функция ПолучитьОписаниеСобытия() Экспорт + + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + Час = 3600; + Событие = Новый Соответствие; + + Событие.Вставить("Описание" , ""); // Описание события + Событие.Вставить("Заголовок" , "Новое событие"); // Заголовок события + Событие.Вставить("МестоПроведения" , ""); // Строка описание места проведения + Событие.Вставить("ДатаНачала" , ТекущаяДата); // Дата начала события + Событие.Вставить("ДатаОкончания" , ТекущаяДата + Час); // Дата окончания события + Событие.Вставить("МассивURLФайловВложений", Новый Соответствие); // Ключ - название, Значение - URL к файлу + Событие.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам + + Возврат Событие; + +КонецФункции + +// Получить список событий +// Получает список всех событий календаря +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Массив соответствий событий +Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + МассивСобытий = Новый Массив; + + ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий); + + Возврат МассивСобытий; + +КонецФункции + +// Получить событие +// Получает событие по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// Событие - Строка - ID события - event +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + Календарь + + "/events/" + + Событие; + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать событие +// Создает новое событие +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события - props +// +// Возвращаемое значение: +// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google +Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт + Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия); +КонецФункции + +// Переместить событие +// Перемещает событие в другой календарь +// +// Параметры: +// Токен - Строка - Токен - token +// КалендарьИсточник - Строка - ID календаря источника - from +// КалендарьПриемник - Строка - ID календаря приемника - to +// Событие - Строка - ID события календаря источника - event +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьИсточник); + OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьПриемник); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + КалендарьИсточник + + "/events/" + + Событие + + "/move?destination=" + + КалендарьПриемник; + + Ответ = OPI_Инструменты.Post(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить событие +// Изменяет существующее событие +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// ОписаниеСобытия - Строка - Новое описание события - props +// Событие - Строка - ID события - event +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт + Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие); +КонецФункции + +// Удалить событие +// Удаляет событие по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// Событие - Строка - ID события - event +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + Календарь + + "/events/" + + Событие; + + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПреобразоватьДату(Знач Дата) + + OPI_ПреобразованиеТипов.ПолучитьДату(Дата); + + СтруктураДаты = Новый Структура; + + Если Не ТипЗнч(Дата) = Тип("Дата") Тогда + Возврат Неопределено; + КонецЕсли; + + Если Дата = НачалоДня(Дата) Тогда + ФорматДаты = "ДФ=yyyy-MM-dd"; + Поле = "date"; + Иначе + ФорматДаты = "ДФ=yyyy-MM-ddTHH:mm:ssZ"; + Поле = "dateTime"; + КонецЕсли; + + Дата = Формат(Дата, ФорматДаты); + СтруктураДаты.Вставить(Поле , Дата); + СтруктураДаты.Вставить("timeZone", "Europe/Moscow"); + + Возврат СтруктураДаты; + +КонецФункции + +Функция ПреобразоватьВложения(Знач Вложения) + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Вложения); + + МассивВложений = Новый Массив; + + Если ТипЗнч(Вложения) = Тип("Соответствие") Или ТипЗнч(Вложения) = Тип("Структура") Тогда + + Для Каждого Вложение Из Вложения Цикл + + ТекущеВложение = Новый Структура; + ТекущеВложение.Вставить("title" , Вложение.Ключ); + ТекущеВложение.Вставить("fileUrl", Вложение.Значение); + + МассивВложений.Добавить(ТекущеВложение); + + КонецЦикла; + + КонецЕсли; + + Если МассивВложений.Количество() > 0 Тогда + Возврат МассивВложений; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеСобытия); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + Существующее = ЗначениеЗаполнено(Событие); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + Календарь + + "/events" + + ?(Существующее, "/" + Событие, ""); + + Дата0 = ОписаниеСобытия["ДатаНачала"]; + Дата1 = ОписаниеСобытия["ДатаОкончания"]; + Вложения = ОписаниеСобытия["МассивURLФайловВложений"]; + Вложения = ПреобразоватьВложения(Вложения); + Уведомления = ?(ОписаниеСобытия["ОтправлятьУведомления"] = Неопределено + , Ложь + , ОписаниеСобытия["ОтправлятьУведомления"]); + + Параметры = Новый Структура; + Параметры.Вставить("summary" , ОписаниеСобытия["Заголовок"]); + Параметры.Вставить("description", ОписаниеСобытия["Описание"]); + Параметры.Вставить("location" , ОписаниеСобытия["МестоПроведения"]); + Параметры.Вставить("start" , ПреобразоватьДату(Дата0)); + Параметры.Вставить("end" , ПреобразоватьДату(Дата1)); + Параметры.Вставить("attachments", Вложения); + + ПараметрыURL = Новый Структура; + ПараметрыURL.Вставить("sendUpdates" , ?(Уведомления, "all", "none")); + ПараметрыURL.Вставить("supportsAttachments" , ?(ЗначениеЗаполнено(Вложения), "true", "false")); + + URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); + + OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры); + + Если Существующее Тогда + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); + Иначе + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки, Истина); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "") + + Items = "items"; + NPT = "nextPageToken"; + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Страница) Тогда + Параметры.Вставить("pageToken", Страница); + КонецЕсли; + + Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList" + , Параметры + , Заголовки); + + Календари = Результат[Items]; + Страница = Результат[NPT]; + + Для Каждого Календарь Из Календари Цикл + МассивКалендарей.Добавить(Календарь); + КонецЦикла; + + Если Календари.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда + ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей, Страница); + КонецЕсли; + +КонецПроцедуры + +Процедура ПолучитьСписокСобытийРекурсивно(Знач Заголовки, Знач Календарь, МассивСобытий, Страница = "") + + Items = "items"; + NPT = "nextPageToken"; + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Страница) Тогда + Параметры.Вставить("pageToken", Страница); + КонецЕсли; + + Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events" + , Параметры + , Заголовки); + + События = Результат[Items]; + Страница = Результат[NPT]; + + Для Каждого Событие Из События Цикл + МассивСобытий.Добавить(Событие); + КонецЦикла; + + Если События.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда + ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_GoogleDrive.os b/ru/OInt/core/Modules/OPI_GoogleDrive.os index d8a49c4833..57c5b0babf 100644 --- a/ru/OInt/core/Modules/OPI_GoogleDrive.os +++ b/ru/OInt/core/Modules/OPI_GoogleDrive.os @@ -1,719 +1,719 @@ -// Расположение OS: ./OInt/core/Modules/OPI_GoogleDrive.os -// Библиотека: Google Drive -// Команда CLI: gdrive - -// 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:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область РаботаСФайламиИКаталогами - -// Получить информацию об объекте -// Получает информацию о папке или файле по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор файла или каталога - object -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Идентификатор) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; - - Параметры = Новый Структура; - Параметры.Вставить("fields", "*"); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список каталогов -// Получает список каталогов диска -// -// Параметры: -// Токен - Строка - Токен - token -// ИмяСодержит - Строка - Отбор по имени - querry -// Подробно - Булево - Добавляет список файлов к полям каталога - depth -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Массив соответствий каталогов -Функция ПолучитьСписокКаталогов(Знач Токен, Знач ИмяСодержит = "", Знач Подробно = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит); - OPI_ПреобразованиеТипов.ПолучитьБулево(Подробно); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - МассивОбъектов = Новый Массив; - Отбор = Новый Массив; - - Отбор.Добавить("mimeType = 'application/vnd.google-apps.folder'"); - - Если ЗначениеЗаполнено(ИмяСодержит) Тогда - Отбор.Добавить("name contains '" + ИмяСодержит + "'"); - КонецЕсли; - - ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор); - - Если Подробно Тогда - РазложитьОбъектыПодробно(Токен, МассивОбъектов); - КонецЕсли; - - Возврат МассивОбъектов; - -КонецФункции - -// Получить список файлов -// Получает список файлов -// -// Параметры: -// Токен - Строка - Токен - token -// ИмяСодержит - Строка - Отбор по имени - querry -// Каталог - Строка - Отбор по ID каталога родителя - catalog -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Массив соответствий файлов -Функция ПолучитьСписокФайлов(Знач Токен, Знач ИмяСодержит = "", Знач Каталог = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Каталог); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - МассивОбъектов = Новый Массив; - Отбор = Новый Массив; - - Отбор.Добавить("mimeType != 'application/vnd.google-apps.folder'"); - - Если ЗначениеЗаполнено(ИмяСодержит) Тогда - Отбор.Добавить("name contains '" + ИмяСодержит + "'"); - КонецЕсли; - - Если ЗначениеЗаполнено(Каталог) Тогда - Отбор.Добавить("'" + Каталог + "' in parents"); - КонецЕсли; - - ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, , Отбор); - - Возврат МассивОбъектов; - -КонецФункции - -// Загрузить файл -// Загружает файл на диск -// -// Параметры: -// Токен - Строка - Токен - token -// Файл - ДвоичныеДанные,Строка - Загружаемый файл - file -// Описание - Соответствие Из КлючИЗначение - См. ПолучитьОписаниеФайла - props - JSON описания или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Описание) Экспорт - Возврат УправлениеФайлом(Токен, Файл, Описание); -КонецФункции - -// Создать папку -// Создает пустой каталог на диске -// -// Параметры: -// Токен - Строка - Токен - token -// Имя - Строка - Имя папки - title -// Родитель - Строка - Родитель - catalog -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция СоздатьПапку(Знач Токен, Знач Имя, Знач Родитель = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); - - Описание = Новый Соответствие; - Описание.Вставить("MIME" , "application/vnd.google-apps.folder"); - Описание.Вставить("Имя" , Имя); - Описание.Вставить("Описание", ""); - Описание.Вставить("Родитель", ?(ЗначениеЗаполнено(Родитель), Родитель, "root")); - - Возврат УправлениеФайлом(Токен, , Описание); - -КонецФункции - -// Скачать файл -// Получает файл по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор файла - object -// ПутьСохранения - Строка - Путь сохранения файла - out -// -// Возвращаемое значение: -// ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения -Функция СкачатьФайл(Знач Токен, Знач Идентификатор, Знач ПутьСохранения = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; - - Параметры = Новый Соответствие; - Параметры.Вставить("alt", "media"); - - Ответ = OPI_Инструменты.Get(URL, Параметры , Заголовки, ПутьСохранения); - - Возврат Ответ; - -КонецФункции - -// Скоприровать объект -// Копирует файл или каталог -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор объекта - object -// НовоеИмя - Строка - Новое имя объекта - title -// НовыйРодитель - Строка - Новый каталог размещения - catalog -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция СкопироватьОбъект(Знач Токен, Знач Идентификатор, Знач НовоеИмя = "", Знач НовыйРодитель = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - OPI_ПреобразованиеТипов.ПолучитьСтроку(НовыйРодитель); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/copy"; - - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(НовоеИмя) Тогда - Параметры.Вставить("name", НовоеИмя); - КонецЕсли; - - Если ЗначениеЗаполнено(НовыйРодитель) Тогда - - МассивРодителей = Новый Массив; - МассивРодителей.Добавить(НовыйРодитель); - Параметры.Вставить("parents", МассивРодителей); - - КонецЕсли; - - Ответ = OPI_Инструменты.Post(URL, Параметры , Заголовки, Истина); - - Возврат Ответ; - -КонецФункции - -// Обновить файл -// Обновляет двоичные данные файла -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор обновляемого объекта - object -// Файл - ДвоичныеДанные,Строка - Файл источник обновления - file -// НовоеИмя - Строка - Новое имя файла (если необходимо) - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ОбновитьФайл(Знач Токен, Знач Идентификатор, Знач Файл, Знач НовоеИмя = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя); - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); - - Если ЗначениеЗаполнено(НовоеИмя) Тогда - Описание = Новый Соответствие; - Описание.Вставить("Имя", НовоеИмя); - Иначе - Описание = ""; - КонецЕсли; - - Возврат УправлениеФайлом(Токен, Файл, Описание, Идентификатор); - -КонецФункции - -// Удалить объект -// Удаляет файл или каталог по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор объекта для удаления - object -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция УдалитьОбъект(Знач Токен, Знач Идентификатор) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить описание файла !NOCLI -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Описание файла -Функция ПолучитьОписаниеФайла() Экспорт - - Описание = Новый Соответствие; - Описание.Вставить("MIME" , "image/jpeg"); // MIME-тип загружаемого файла - Описание.Вставить("Имя" , "Новый файл.jpg"); // Имя файла с расширением - Описание.Вставить("Описание" , "Это новый файл"); // Описание файла - Описание.Вставить("Родитель" , "root"); // ID каталога загрузки или "root" для загрузки в корень - - Возврат Описание; - -КонецФункции - -#КонецОбласти - -#Область РаботаСКомментариями - -// Создать комментарий -// Создает комментарий к файлу или каталогу -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор объекта, для которого необходим комментарий - object -// Комментарий - Строка - Текст комментария - text -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция СоздатьКомментарий(Знач Токен, Знач Идентификатор, Знач Комментарий) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/comments?fields=*"; - - Параметры = Новый Структура; - Параметры.Вставить("content", Комментарий); - - Ответ = OPI_Инструменты.POST(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить комментарий -// Получает комментарий по ID -// -// Параметры: -// Токен - Строка - Токен - token -// ИДОбъекта - Строка - Идентификатор файла или каталога размещения комментария - object -// ИДКомментария - Строка - Идентификатор комментария - comment -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария; - - Параметры = Новый Структура; - Параметры.Вставить("fields", "*"); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список комментариев -// Получает список всех комментариев объекта -// -// Параметры: -// Токен - Строка - Токен - token -// ИДОбъекта - Строка - Идентификатор объекта - object -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьСписокКомментариев(Знач Токен, Знач ИДОбъекта) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments"; - - Параметры = Новый Структура; - Параметры.Вставить("fields", "*"); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить комментарий -// Удаляет комментарий по ID -// -// Параметры: -// Токен - Строка - Токен - token -// ИДОбъекта - Строка - Идентификатор файла или каталога размещения комментария - object -// ИДКомментария - Строка - Идентификатор комментария - comment -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция УдалитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария; - - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ПолучитьСписокОбъектовРекурсивно(Знач Заголовки, МассивОбъектов, Подробно = Ложь, Отбор = "", Страница = "") - - URL = "https://www.googleapis.com/drive/v3/files"; - Files = "files"; - NPT = "nextPageToken"; - Параметры = Новый Структура; - Параметры.Вставить("fields", "*"); - - Если ЗначениеЗаполнено(Страница) Тогда - Параметры.Вставить("pageToken", Страница); - КонецЕсли; - - Если ЗначениеЗаполнено(Отбор) И ТипЗнч(Отбор) = Тип("Массив") Тогда - ОтборСтрока = СтрСоединить(Отбор, " and "); - Параметры.Вставить("q", ОтборСтрока); - КонецЕсли; - - Результат = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Объекты = Результат[Files]; - Страница = Результат[NPT]; - - Для Каждого ТекущийОбъект Из Объекты Цикл - МассивОбъектов.Добавить(ТекущийОбъект); - КонецЦикла; - - Если Объекты.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда - ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор, Страница); - КонецЕсли; - -КонецПроцедуры - -Процедура РазложитьОбъектыПодробно(Знач Токен, МассивОбъектов) - - Для Каждого ТекущийОбъект Из МассивОбъектов Цикл - - МассивФайлов = Новый Массив; - ТекущийИД = ТекущийОбъект["id"]; - - Результат = ПолучитьСписокФайлов(Токен, , ТекущийИД); - - Для Каждого Файл Из Результат Цикл - МассивФайлов.Добавить(Файл); - КонецЦикла; - - ТекущийОбъект.Вставить("files", МассивФайлов); - - КонецЦикла; - -КонецПроцедуры - -Процедура СформироватьПараметрыЗагрузкиФайла(Описание) - - СформированноеОписание = Новый Соответствие; - OPI_Инструменты.УдалитьПустыеПоляКоллекции(Описание); - - СоответствиеПолей = Новый Соответствие; - СоответствиеПолей.Вставить("MIME" , "mimeType"); - СоответствиеПолей.Вставить("Имя" , "name"); - СоответствиеПолей.Вставить("Описание" , "description"); - СоответствиеПолей.Вставить("Родитель" , "parents"); - СоответствиеПолей.Вставить("Расширение", "fileExtension"); - - Для Каждого Элемент Из Описание Цикл - - Если Элемент.Ключ = "Родитель" Тогда - - ТекущееЗначение = Новый Массив; - ТекущееЗначение.Добавить(Элемент.Значение); - - Иначе - - ТекущееЗначение = Элемент.Значение; - - КонецЕсли; - - ИмяПоля = СоответствиеПолей.Получить(Элемент.Ключ); - СформированноеОписание.Вставить(ИмяПоля, ТекущееЗначение); - - КонецЦикла; - - Описание = СформированноеОписание; - -КонецПроцедуры - -Функция УправлениеФайлом(Знач Токен, Знач Файл = "", Знач Описание = "", Знач Идентификатор = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - - Если ЗначениеЗаполнено(Описание) Тогда - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Описание); - КонецЕсли; - - MimeType = "mimeType"; - - Если ЗначениеЗаполнено(Идентификатор) Тогда - MIME = ПолучитьИнформациюОбОбъекте(Токен, Идентификатор)[MimeType]; - Иначе - MIME = Описание["MIME"]; - КонецЕсли; - - Если Не ЗначениеЗаполнено(Описание) Тогда - Описание = Новый Соответствие; - КонецЕсли; - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - СформироватьПараметрыЗагрузкиФайла(Описание); - ОписаниеJSON = OPI_Инструменты.JSONСтрокой(Описание); - - СоответствиеФайла = Новый Соответствие; - - Если ЗначениеЗаполнено(Файл) Тогда - - РазмерЧасти = 268435457; - Размер = OPI_Инструменты.ПреобразоватьДанныеСПолучениемРазмера(Файл, РазмерЧасти); - - СоответствиеФайла.Вставить(Файл, MIME); - - Если Размер < РазмерЧасти И ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда - Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор); - Иначе - Ответ = ЗагрузитьБольшойФайл(Описание, СоответствиеФайла, Заголовки, Идентификатор); - КонецЕсли; - - Иначе - Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ЗагрузитьМалыйФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "") - - URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"; - - Если ЗначениеЗаполнено(Идентификатор) Тогда - URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор); - Ответ = OPI_Инструменты.PatchMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки); - Иначе - Ответ = OPI_Инструменты.PostMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ЗагрузитьБольшойФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "") - - Для Каждого Файл Из СоответствиеФайла Цикл - Двоичные = Файл.Ключ; - Прервать; - КонецЦикла; - - URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable"; - - Если ЗначениеЗаполнено(Идентификатор) Тогда - URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор); - Ответ = OPI_Инструменты.Patch(URL, Описание, Заголовки, Истина, Истина); - Иначе - Ответ = OPI_Инструменты.Post(URL, Описание, Заголовки, Истина, Истина); - КонецЕсли; - - АдресЗагрузки = Ответ.Заголовки["Location"]; - - Если Не ЗначениеЗаполнено(АдресЗагрузки) Тогда - OPI_Инструменты.ОбработатьОтвет(Ответ); - Возврат Ответ; - КонецЕсли; - - ОтветЗагрузки = ЗагрузитьФайлЧастями(Двоичные, АдресЗагрузки); - Ответ = ?(ЗначениеЗаполнено(ОтветЗагрузки), ОтветЗагрузки, Ответ); - - OPI_Инструменты.ОбработатьОтвет(Ответ); - Возврат Ответ; - -КонецФункции - -Функция ЗагрузитьФайлЧастями(Знач Двоичные, Знач АдресЗагрузки) - - Ответ = ""; - РазмерЧасти = 268435456; - ПрочитаноБайт = 0; - ТекущаяПозиция = 0; - ОбщийРазмер = Двоичные.Размер(); - СтрОбщийРазмер = OPI_Инструменты.ЧислоВСтроку(ОбщийРазмер); - ЧтениеДанных = Новый ЧтениеДанных(Двоичные); - ИсходныйПоток = ЧтениеДанных.ИсходныйПоток(); - - Пока ПрочитаноБайт < ОбщийРазмер Цикл - - ПрочитаноБайт = ИсходныйПоток.ТекущаяПозиция(); - Результат = ЧтениеДанных.Прочитать(РазмерЧасти); - ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); - РазмерТекущих = ТекущиеДанные.Размер(); - СледующаяПозиция = ТекущаяПозиция + РазмерТекущих - 1; - - Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда - Прервать; - КонецЕсли; - - ЗаголовокПотока = "bytes " - + OPI_Инструменты.ЧислоВСтроку(ТекущаяПозиция) - + "-" - + OPI_Инструменты.ЧислоВСтроку(СледующаяПозиция) - + "/" - + СтрОбщийРазмер; - - ДопЗаголовки = Новый Соответствие; - ДопЗаголовки.Вставить("Content-Length", OPI_Инструменты.ЧислоВСтроку(РазмерТекущих)); - ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока); - ДопЗаголовки.Вставить("Content-Type" , "application/octet-stream"); - - Ответ = OPI_Инструменты.Put(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина); - - РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция); - - Если ЗначениеЗаполнено(РезультатПроверки) Тогда - Возврат РезультатПроверки; - КонецЕсли; - - КБайт = 1024; - МБайт = КБайт * КБайт; - Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт)); - - ВыполнитьСборкуМусора(); - ОсвободитьОбъект(ТекущиеДанные); - - КонецЦикла; - - Возврат Ответ; - -КонецФункции - -Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция) - - НачалоКодовОшибок = 400; - КонецКодовПадений = 600; - НачалоКодовУспеха = 200; - КонецКодовУспеха = 300; - Перенаправление = 308; - - Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда - - ЗаголовокПотока = "bytes */" + СтрОбщийРазмер; - ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока); - - ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина); - - Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда - - OPI_Инструменты.ОбработатьОтвет(ОтветПроверки); - Возврат ОтветПроверки; - - ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда - - ЗагруженныеДанные = Ответ.Заголовки["Range"]; - - Иначе - - OPI_Инструменты.ОбработатьОтвет(Ответ); - Возврат Ответ; - - КонецЕсли; - - Иначе - ЗагруженныеДанные = Ответ.Заголовки["Range"]; - КонецЕсли; - - Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда - OPI_Инструменты.ОбработатьОтвет(Ответ); - Возврат Ответ; - КонецЕсли; - - ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", ""); - МассивИнформации = СтрРазделить(ЗагруженныеДанные, "-", Ложь); - НеобходимоЧастей = 2; - - Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда - OPI_Инструменты.ОбработатьОтвет(Ответ); - Возврат Ответ; - КонецЕсли; - - ТекущаяПозиция = Число(МассивИнформации[1]) + 1; - - Возврат ""; - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_GoogleDrive.os +// Библиотека: Google Drive +// Команда CLI: gdrive + +// 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:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область РаботаСФайламиИКаталогами + +// Получить информацию об объекте +// Получает информацию о папке или файле по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор файла или каталога - object +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Идентификатор) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; + + Параметры = Новый Структура; + Параметры.Вставить("fields", "*"); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список каталогов +// Получает список каталогов диска +// +// Параметры: +// Токен - Строка - Токен - token +// ИмяСодержит - Строка - Отбор по имени - querry +// Подробно - Булево - Добавляет список файлов к полям каталога - depth +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Массив соответствий каталогов +Функция ПолучитьСписокКаталогов(Знач Токен, Знач ИмяСодержит = "", Знач Подробно = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит); + OPI_ПреобразованиеТипов.ПолучитьБулево(Подробно); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + МассивОбъектов = Новый Массив; + Отбор = Новый Массив; + + Отбор.Добавить("mimeType = 'application/vnd.google-apps.folder'"); + + Если ЗначениеЗаполнено(ИмяСодержит) Тогда + Отбор.Добавить("name contains '" + ИмяСодержит + "'"); + КонецЕсли; + + ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор); + + Если Подробно Тогда + РазложитьОбъектыПодробно(Токен, МассивОбъектов); + КонецЕсли; + + Возврат МассивОбъектов; + +КонецФункции + +// Получить список файлов +// Получает список файлов +// +// Параметры: +// Токен - Строка - Токен - token +// ИмяСодержит - Строка - Отбор по имени - querry +// Каталог - Строка - Отбор по ID каталога родителя - catalog +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Массив соответствий файлов +Функция ПолучитьСписокФайлов(Знач Токен, Знач ИмяСодержит = "", Знач Каталог = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Каталог); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + МассивОбъектов = Новый Массив; + Отбор = Новый Массив; + + Отбор.Добавить("mimeType != 'application/vnd.google-apps.folder'"); + + Если ЗначениеЗаполнено(ИмяСодержит) Тогда + Отбор.Добавить("name contains '" + ИмяСодержит + "'"); + КонецЕсли; + + Если ЗначениеЗаполнено(Каталог) Тогда + Отбор.Добавить("'" + Каталог + "' in parents"); + КонецЕсли; + + ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, , Отбор); + + Возврат МассивОбъектов; + +КонецФункции + +// Загрузить файл +// Загружает файл на диск +// +// Параметры: +// Токен - Строка - Токен - token +// Файл - ДвоичныеДанные,Строка - Загружаемый файл - file +// Описание - Соответствие Из КлючИЗначение - См. ПолучитьОписаниеФайла - props - JSON описания или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Описание) Экспорт + Возврат УправлениеФайлом(Токен, Файл, Описание); +КонецФункции + +// Создать папку +// Создает пустой каталог на диске +// +// Параметры: +// Токен - Строка - Токен - token +// Имя - Строка - Имя папки - title +// Родитель - Строка - Родитель - catalog +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция СоздатьПапку(Знач Токен, Знач Имя, Знач Родитель = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); + + Описание = Новый Соответствие; + Описание.Вставить("MIME" , "application/vnd.google-apps.folder"); + Описание.Вставить("Имя" , Имя); + Описание.Вставить("Описание", ""); + Описание.Вставить("Родитель", ?(ЗначениеЗаполнено(Родитель), Родитель, "root")); + + Возврат УправлениеФайлом(Токен, , Описание); + +КонецФункции + +// Скачать файл +// Получает файл по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор файла - object +// ПутьСохранения - Строка - Путь сохранения файла - out +// +// Возвращаемое значение: +// ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения +Функция СкачатьФайл(Знач Токен, Знач Идентификатор, Знач ПутьСохранения = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; + + Параметры = Новый Соответствие; + Параметры.Вставить("alt", "media"); + + Ответ = OPI_Инструменты.Get(URL, Параметры , Заголовки, ПутьСохранения); + + Возврат Ответ; + +КонецФункции + +// Скоприровать объект +// Копирует файл или каталог +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор объекта - object +// НовоеИмя - Строка - Новое имя объекта - title +// НовыйРодитель - Строка - Новый каталог размещения - catalog +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция СкопироватьОбъект(Знач Токен, Знач Идентификатор, Знач НовоеИмя = "", Знач НовыйРодитель = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + OPI_ПреобразованиеТипов.ПолучитьСтроку(НовыйРодитель); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/copy"; + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(НовоеИмя) Тогда + Параметры.Вставить("name", НовоеИмя); + КонецЕсли; + + Если ЗначениеЗаполнено(НовыйРодитель) Тогда + + МассивРодителей = Новый Массив; + МассивРодителей.Добавить(НовыйРодитель); + Параметры.Вставить("parents", МассивРодителей); + + КонецЕсли; + + Ответ = OPI_Инструменты.Post(URL, Параметры , Заголовки, Истина); + + Возврат Ответ; + +КонецФункции + +// Обновить файл +// Обновляет двоичные данные файла +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор обновляемого объекта - object +// Файл - ДвоичныеДанные,Строка - Файл источник обновления - file +// НовоеИмя - Строка - Новое имя файла (если необходимо) - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ОбновитьФайл(Знач Токен, Знач Идентификатор, Знач Файл, Знач НовоеИмя = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя); + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + + Если ЗначениеЗаполнено(НовоеИмя) Тогда + Описание = Новый Соответствие; + Описание.Вставить("Имя", НовоеИмя); + Иначе + Описание = ""; + КонецЕсли; + + Возврат УправлениеФайлом(Токен, Файл, Описание, Идентификатор); + +КонецФункции + +// Удалить объект +// Удаляет файл или каталог по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор объекта для удаления - object +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция УдалитьОбъект(Знач Токен, Знач Идентификатор) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить описание файла !NOCLI +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Описание файла +Функция ПолучитьОписаниеФайла() Экспорт + + Описание = Новый Соответствие; + Описание.Вставить("MIME" , "image/jpeg"); // MIME-тип загружаемого файла + Описание.Вставить("Имя" , "Новый файл.jpg"); // Имя файла с расширением + Описание.Вставить("Описание" , "Это новый файл"); // Описание файла + Описание.Вставить("Родитель" , "root"); // ID каталога загрузки или "root" для загрузки в корень + + Возврат Описание; + +КонецФункции + +#КонецОбласти + +#Область РаботаСКомментариями + +// Создать комментарий +// Создает комментарий к файлу или каталогу +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор объекта, для которого необходим комментарий - object +// Комментарий - Строка - Текст комментария - text +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция СоздатьКомментарий(Знач Токен, Знач Идентификатор, Знач Комментарий) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/comments?fields=*"; + + Параметры = Новый Структура; + Параметры.Вставить("content", Комментарий); + + Ответ = OPI_Инструменты.POST(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить комментарий +// Получает комментарий по ID +// +// Параметры: +// Токен - Строка - Токен - token +// ИДОбъекта - Строка - Идентификатор файла или каталога размещения комментария - object +// ИДКомментария - Строка - Идентификатор комментария - comment +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария; + + Параметры = Новый Структура; + Параметры.Вставить("fields", "*"); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список комментариев +// Получает список всех комментариев объекта +// +// Параметры: +// Токен - Строка - Токен - token +// ИДОбъекта - Строка - Идентификатор объекта - object +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьСписокКомментариев(Знач Токен, Знач ИДОбъекта) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments"; + + Параметры = Новый Структура; + Параметры.Вставить("fields", "*"); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить комментарий +// Удаляет комментарий по ID +// +// Параметры: +// Токен - Строка - Токен - token +// ИДОбъекта - Строка - Идентификатор файла или каталога размещения комментария - object +// ИДКомментария - Строка - Идентификатор комментария - comment +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция УдалитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария; + + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ПолучитьСписокОбъектовРекурсивно(Знач Заголовки, МассивОбъектов, Подробно = Ложь, Отбор = "", Страница = "") + + URL = "https://www.googleapis.com/drive/v3/files"; + Files = "files"; + NPT = "nextPageToken"; + Параметры = Новый Структура; + Параметры.Вставить("fields", "*"); + + Если ЗначениеЗаполнено(Страница) Тогда + Параметры.Вставить("pageToken", Страница); + КонецЕсли; + + Если ЗначениеЗаполнено(Отбор) И ТипЗнч(Отбор) = Тип("Массив") Тогда + ОтборСтрока = СтрСоединить(Отбор, " and "); + Параметры.Вставить("q", ОтборСтрока); + КонецЕсли; + + Результат = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Объекты = Результат[Files]; + Страница = Результат[NPT]; + + Для Каждого ТекущийОбъект Из Объекты Цикл + МассивОбъектов.Добавить(ТекущийОбъект); + КонецЦикла; + + Если Объекты.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда + ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор, Страница); + КонецЕсли; + +КонецПроцедуры + +Процедура РазложитьОбъектыПодробно(Знач Токен, МассивОбъектов) + + Для Каждого ТекущийОбъект Из МассивОбъектов Цикл + + МассивФайлов = Новый Массив; + ТекущийИД = ТекущийОбъект["id"]; + + Результат = ПолучитьСписокФайлов(Токен, , ТекущийИД); + + Для Каждого Файл Из Результат Цикл + МассивФайлов.Добавить(Файл); + КонецЦикла; + + ТекущийОбъект.Вставить("files", МассивФайлов); + + КонецЦикла; + +КонецПроцедуры + +Процедура СформироватьПараметрыЗагрузкиФайла(Описание) + + СформированноеОписание = Новый Соответствие; + OPI_Инструменты.УдалитьПустыеПоляКоллекции(Описание); + + СоответствиеПолей = Новый Соответствие; + СоответствиеПолей.Вставить("MIME" , "mimeType"); + СоответствиеПолей.Вставить("Имя" , "name"); + СоответствиеПолей.Вставить("Описание" , "description"); + СоответствиеПолей.Вставить("Родитель" , "parents"); + СоответствиеПолей.Вставить("Расширение", "fileExtension"); + + Для Каждого Элемент Из Описание Цикл + + Если Элемент.Ключ = "Родитель" Тогда + + ТекущееЗначение = Новый Массив; + ТекущееЗначение.Добавить(Элемент.Значение); + + Иначе + + ТекущееЗначение = Элемент.Значение; + + КонецЕсли; + + ИмяПоля = СоответствиеПолей.Получить(Элемент.Ключ); + СформированноеОписание.Вставить(ИмяПоля, ТекущееЗначение); + + КонецЦикла; + + Описание = СформированноеОписание; + +КонецПроцедуры + +Функция УправлениеФайлом(Знач Токен, Знач Файл = "", Знач Описание = "", Знач Идентификатор = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + + Если ЗначениеЗаполнено(Описание) Тогда + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Описание); + КонецЕсли; + + MimeType = "mimeType"; + + Если ЗначениеЗаполнено(Идентификатор) Тогда + MIME = ПолучитьИнформациюОбОбъекте(Токен, Идентификатор)[MimeType]; + Иначе + MIME = Описание["MIME"]; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Описание) Тогда + Описание = Новый Соответствие; + КонецЕсли; + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + СформироватьПараметрыЗагрузкиФайла(Описание); + ОписаниеJSON = OPI_Инструменты.JSONСтрокой(Описание); + + СоответствиеФайла = Новый Соответствие; + + Если ЗначениеЗаполнено(Файл) Тогда + + РазмерЧасти = 268435457; + Размер = OPI_Инструменты.ПреобразоватьДанныеСПолучениемРазмера(Файл, РазмерЧасти); + + СоответствиеФайла.Вставить(Файл, MIME); + + Если Размер < РазмерЧасти И ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда + Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор); + Иначе + Ответ = ЗагрузитьБольшойФайл(Описание, СоответствиеФайла, Заголовки, Идентификатор); + КонецЕсли; + + Иначе + Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ЗагрузитьМалыйФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "") + + URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"; + + Если ЗначениеЗаполнено(Идентификатор) Тогда + URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор); + Ответ = OPI_Инструменты.PatchMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки); + Иначе + Ответ = OPI_Инструменты.PostMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ЗагрузитьБольшойФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "") + + Для Каждого Файл Из СоответствиеФайла Цикл + Двоичные = Файл.Ключ; + Прервать; + КонецЦикла; + + URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable"; + + Если ЗначениеЗаполнено(Идентификатор) Тогда + URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор); + Ответ = OPI_Инструменты.Patch(URL, Описание, Заголовки, Истина, Истина); + Иначе + Ответ = OPI_Инструменты.Post(URL, Описание, Заголовки, Истина, Истина); + КонецЕсли; + + АдресЗагрузки = Ответ.Заголовки["Location"]; + + Если Не ЗначениеЗаполнено(АдресЗагрузки) Тогда + OPI_Инструменты.ОбработатьОтвет(Ответ); + Возврат Ответ; + КонецЕсли; + + ОтветЗагрузки = ЗагрузитьФайлЧастями(Двоичные, АдресЗагрузки); + Ответ = ?(ЗначениеЗаполнено(ОтветЗагрузки), ОтветЗагрузки, Ответ); + + OPI_Инструменты.ОбработатьОтвет(Ответ); + Возврат Ответ; + +КонецФункции + +Функция ЗагрузитьФайлЧастями(Знач Двоичные, Знач АдресЗагрузки) + + Ответ = ""; + РазмерЧасти = 268435456; + ПрочитаноБайт = 0; + ТекущаяПозиция = 0; + ОбщийРазмер = Двоичные.Размер(); + СтрОбщийРазмер = OPI_Инструменты.ЧислоВСтроку(ОбщийРазмер); + ЧтениеДанных = Новый ЧтениеДанных(Двоичные); + ИсходныйПоток = ЧтениеДанных.ИсходныйПоток(); + + Пока ПрочитаноБайт < ОбщийРазмер Цикл + + ПрочитаноБайт = ИсходныйПоток.ТекущаяПозиция(); + Результат = ЧтениеДанных.Прочитать(РазмерЧасти); + ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); + РазмерТекущих = ТекущиеДанные.Размер(); + СледующаяПозиция = ТекущаяПозиция + РазмерТекущих - 1; + + Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда + Прервать; + КонецЕсли; + + ЗаголовокПотока = "bytes " + + OPI_Инструменты.ЧислоВСтроку(ТекущаяПозиция) + + "-" + + OPI_Инструменты.ЧислоВСтроку(СледующаяПозиция) + + "/" + + СтрОбщийРазмер; + + ДопЗаголовки = Новый Соответствие; + ДопЗаголовки.Вставить("Content-Length", OPI_Инструменты.ЧислоВСтроку(РазмерТекущих)); + ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока); + ДопЗаголовки.Вставить("Content-Type" , "application/octet-stream"); + + Ответ = OPI_Инструменты.Put(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина); + + РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция); + + Если ЗначениеЗаполнено(РезультатПроверки) Тогда + Возврат РезультатПроверки; + КонецЕсли; + + КБайт = 1024; + МБайт = КБайт * КБайт; + Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт)); + + ВыполнитьСборкуМусора(); + ОсвободитьОбъект(ТекущиеДанные); + + КонецЦикла; + + Возврат Ответ; + +КонецФункции + +Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция) + + НачалоКодовОшибок = 400; + КонецКодовПадений = 600; + НачалоКодовУспеха = 200; + КонецКодовУспеха = 300; + Перенаправление = 308; + + Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда + + ЗаголовокПотока = "bytes */" + СтрОбщийРазмер; + ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока); + + ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина); + + Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда + + OPI_Инструменты.ОбработатьОтвет(ОтветПроверки); + Возврат ОтветПроверки; + + ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда + + ЗагруженныеДанные = Ответ.Заголовки["Range"]; + + Иначе + + OPI_Инструменты.ОбработатьОтвет(Ответ); + Возврат Ответ; + + КонецЕсли; + + Иначе + ЗагруженныеДанные = Ответ.Заголовки["Range"]; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда + OPI_Инструменты.ОбработатьОтвет(Ответ); + Возврат Ответ; + КонецЕсли; + + ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", ""); + МассивИнформации = СтрРазделить(ЗагруженныеДанные, "-", Ложь); + НеобходимоЧастей = 2; + + Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда + OPI_Инструменты.ОбработатьОтвет(Ответ); + Возврат Ответ; + КонецЕсли; + + ТекущаяПозиция = Число(МассивИнформации[1]) + 1; + + Возврат ""; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_GoogleSheets.os b/ru/OInt/core/Modules/OPI_GoogleSheets.os index f8db5f80e2..1828f40471 100644 --- a/ru/OInt/core/Modules/OPI_GoogleSheets.os +++ b/ru/OInt/core/Modules/OPI_GoogleSheets.os @@ -1,409 +1,409 @@ -// Расположение OS: ./OInt/core/Modules/OPI_GoogleSheets.os -// Библиотека: Google Sheets -// Команда CLI: gsheets - -// 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:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область РаботаСКнигами - -// Создать книгу -// Создает новую книгу -// -// Параметры: -// Токен - Строка - Токен - token -// Наименование - Строка - Наименование - title -// МассивИменЛистов - Массив из Строка - Массив имен для добавления новых листов в книгу - sheets -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция СоздатьКнигу(Знач Токен, Знач Наименование, Знач МассивИменЛистов) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИменЛистов); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://sheets.googleapis.com/v4/spreadsheets"; - - Свойства = Новый Структура("title" , Наименование); - Листы = Новый Массив; - - ЗаполнитьМассивЛистов(МассивИменЛистов, Листы); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("properties", Свойства, "Коллекция", Параметры); - OPI_Инструменты.ДобавитьПоле("sheets" , Листы , "Коллекция", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить книгу -// Получает информацию о книге по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор книги - spreadsheet -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьКнигу(Знач Токен, Знач Идентификатор) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Идентификатор; - - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить наименование книги -// Изменяет наименование существующей книги -// -// Параметры: -// Токен - Строка - Токен - token -// Книга - Строка - ID книги - spreadsheet -// Наименование - Строка - Новое наименование - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ИзменитьНаименованиеКниги(Знач Токен, Знач Книга, Знач Наименование) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate"; - - Изменение = Новый Структура("title", Наименование); - ЗапросИзменения = Новый Структура("properties,fields", Изменение, "title"); - Запрос = Новый Структура("updateSpreadsheetProperties", ЗапросИзменения); - - МассивЗапросов = Новый Массив; - МассивЗапросов.Добавить(Запрос); - - Параметры = Новый Структура("requests", МассивЗапросов); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСЛистами - -// Добавить лист -// Добавляет новый лист в книгу -// -// -// Параметры: -// Токен - Строка - Токен - token -// Книга - Строка - Идентификатор книги - spreadsheet -// Наименование - Строка - Наименование нового листа - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ДобавитьЛист(Знач Токен, Знач Книга, Знач Наименование) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate"; - Лист = СоздатьЛист(Наименование); - - Запросы = Новый Массив; - Изменение = Новый Структура("addSheet", Лист); - Запросы.Добавить(Изменение); - - Параметры = Новый Структура("requests", Запросы); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить лист -// Удаляет лист из книги -// -// Параметры: -// Токен - Строка - Токен - token -// Книга - Строка - Идентификатор книги - spreadsheet -// Лист - Строка - Идентификатор удаляемого листа - sheet -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция УдалитьЛист(Знач Токен, Знач Книга, Знач Лист) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate"; - - Запросы = Новый Массив; - Лист = Новый Структура("sheetId" , Лист); - Изменение = Новый Структура("deleteSheet", Лист); - Запросы.Добавить(Изменение); - - Параметры = Новый Структура("requests", Запросы); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Копировать лист -// Копирует лист из одной книги в другую -// -// Параметры: -// Токен - Строка - Токен - token -// Откуда - Строка - ID книги источника - from -// Куда - Строка - ID книги приемника - to -// Лист - Строка - ID копируемого листа - sheet -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция КопироватьЛист(Знач Токен, Знач Откуда, Знач Куда, Знач Лист) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://sheets.googleapis.com/v4/spreadsheets/" - + Откуда - + "/sheets/" - + Лист - + ":copyTo"; - - Параметры = Новый Структура("destinationSpreadsheetId", Куда); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСДанными - -// Установить значения ячеек -// Устанавливает значения ячеек листа -// -// Параметры: -// Токен - Строка - Токен - token -// Книга - Строка - ID книги - spreadsheet -// СоответствиеЗначений - Соответствие Из КлючИЗначение - Данные заполнения, где ключ это имя ячейки вида A1 - data -// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname -// ОсновноеИзмерение - Строка - Основное измерение при заполнении диапазона массивом - dim -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция УстановитьЗначенияЯчеек(Знач Токен - , Знач Книга - , Знач СоответствиеЗначений - , Знач Лист = "" - , Знач ОсновноеИзмерение = "COLUMNS") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеЗначений); - - Если Не ТипЗнч(СоответствиеЗначений) = Тип("Структура") - И Не ТипЗнч(СоответствиеЗначений) = Тип("Соответствие") Тогда - Возврат "Не удалось привести структуру значений к коллекции"; - КонецЕсли; - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchUpdate"; - МассивДанных = СформироватьМассивДанныхЯчеек(СоответствиеЗначений, ОсновноеИзмерение, Лист); - - Параметры = Новый Структура("data,valueInputOption", МассивДанных, "USER_ENTERED"); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Очистить ячейки -// Очищает значение в ячейках -// -// Параметры: -// Токен - Строка - Токен - token -// Книга - Строка - ID книги - spreadsheet -// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для очистки - cells -// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ОчиститьЯчейки(Знач Токен, Знач Книга, Знач МассивЯчеек, Знач Лист = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchClear"; - - СформироватьМассивИменЯчеек(МассивЯчеек, Лист); - - Параметры = Новый Структура("ranges", МассивЯчеек); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить значения ячеек -// Получает значения ячеек таблицы -// -// Параметры: -// Токен - Строка - Токен - token -// Книга - Строка - ID книги - spreadsheet -// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для получения (весь лист, если не заполнено) - cells -// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьЗначенияЯчеек(Знач Токен, Знач Книга, Знач МассивЯчеек = "", Знач Лист = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchGet"; - - Если ЗначениеЗаполнено(МассивЯчеек) Тогда - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек); - СформироватьМассивИменЯчеек(МассивЯчеек, Лист); - - Первый = Истина; - Для Каждого Ячейка Из МассивЯчеек Цикл - Разделитель = ?(Первый, "?", "&"); - URL = URL + Разделитель + "ranges=" + Ячейка; - Первый = Ложь; - КонецЦикла; - Иначе - URL = URL + "?ranges='" + Лист + "'"; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ЗаполнитьМассивЛистов(Знач МассивИмен, МассивЛистов) - - Для Каждого ИмяЛиста Из МассивИмен Цикл - - Лист = СоздатьЛист(ИмяЛиста); - МассивЛистов.Добавить(Лист); - - КонецЦикла; - -КонецПроцедуры - -Процедура ДобавитьИмяЛиста(Ячейка, Знач Лист) - - Если ЗначениеЗаполнено(Лист) Тогда - Ячейка = "'" + Лист + "'!" + Ячейка; - КонецЕсли; - -КонецПроцедуры - -Функция СоздатьЛист(Знач Наименование) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - - СвойстваЛиста = Новый Структура("title" , Наименование); - Лист = Новый Структура("properties", СвойстваЛиста); - - Возврат Лист; - -КонецФункции - -Функция СформироватьМассивДанныхЯчеек(Знач СтруктураЗначений, Знач ОсновноеИзмерение, Знач Лист) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); - - МассивДанных = Новый Массив; - - Для Каждого ДанныеЯчейки Из СтруктураЗначений Цикл - - ТекущееЗначение = ДанныеЯчейки.Значение; - ТекущийКлюч = ДанныеЯчейки.Ключ; - - ДобавитьИмяЛиста(ТекущийКлюч, Лист); - - OPI_ПреобразованиеТипов.ПолучитьМассив(ТекущееЗначение); - - ТекущиеДанные = Новый Соответствие; - ТекущийМассив = Новый Массив; - - ТекущийМассив.Добавить(ТекущееЗначение); - - OPI_Инструменты.ДобавитьПоле("range" , ТекущийКлюч , "Строка", ТекущиеДанные); - OPI_Инструменты.ДобавитьПоле("values" , ТекущийМассив , "Массив", ТекущиеДанные); - OPI_Инструменты.ДобавитьПоле("majorDimension", ОсновноеИзмерение, "Строка", ТекущиеДанные); - - МассивДанных.Добавить(ТекущиеДанные); - - КонецЦикла; - - Возврат МассивДанных; - -КонецФункции - -Процедура СформироватьМассивИменЯчеек(Знач МассивИмен, Знач Лист) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); - - Для Н = 0 По МассивИмен.ВГраница() Цикл - ДобавитьИмяЛиста(МассивИмен[Н], Лист); - КонецЦикла; - -КонецПроцедуры - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_GoogleSheets.os +// Библиотека: Google Sheets +// Команда CLI: gsheets + +// 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:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область РаботаСКнигами + +// Создать книгу +// Создает новую книгу +// +// Параметры: +// Токен - Строка - Токен - token +// Наименование - Строка - Наименование - title +// МассивИменЛистов - Массив из Строка - Массив имен для добавления новых листов в книгу - sheets +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция СоздатьКнигу(Знач Токен, Знач Наименование, Знач МассивИменЛистов) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИменЛистов); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://sheets.googleapis.com/v4/spreadsheets"; + + Свойства = Новый Структура("title" , Наименование); + Листы = Новый Массив; + + ЗаполнитьМассивЛистов(МассивИменЛистов, Листы); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("properties", Свойства, "Коллекция", Параметры); + OPI_Инструменты.ДобавитьПоле("sheets" , Листы , "Коллекция", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить книгу +// Получает информацию о книге по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор книги - spreadsheet +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьКнигу(Знач Токен, Знач Идентификатор) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Идентификатор; + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить наименование книги +// Изменяет наименование существующей книги +// +// Параметры: +// Токен - Строка - Токен - token +// Книга - Строка - ID книги - spreadsheet +// Наименование - Строка - Новое наименование - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ИзменитьНаименованиеКниги(Знач Токен, Знач Книга, Знач Наименование) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate"; + + Изменение = Новый Структура("title", Наименование); + ЗапросИзменения = Новый Структура("properties,fields", Изменение, "title"); + Запрос = Новый Структура("updateSpreadsheetProperties", ЗапросИзменения); + + МассивЗапросов = Новый Массив; + МассивЗапросов.Добавить(Запрос); + + Параметры = Новый Структура("requests", МассивЗапросов); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСЛистами + +// Добавить лист +// Добавляет новый лист в книгу +// +// +// Параметры: +// Токен - Строка - Токен - token +// Книга - Строка - Идентификатор книги - spreadsheet +// Наименование - Строка - Наименование нового листа - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ДобавитьЛист(Знач Токен, Знач Книга, Знач Наименование) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate"; + Лист = СоздатьЛист(Наименование); + + Запросы = Новый Массив; + Изменение = Новый Структура("addSheet", Лист); + Запросы.Добавить(Изменение); + + Параметры = Новый Структура("requests", Запросы); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить лист +// Удаляет лист из книги +// +// Параметры: +// Токен - Строка - Токен - token +// Книга - Строка - Идентификатор книги - spreadsheet +// Лист - Строка - Идентификатор удаляемого листа - sheet +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция УдалитьЛист(Знач Токен, Знач Книга, Знач Лист) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate"; + + Запросы = Новый Массив; + Лист = Новый Структура("sheetId" , Лист); + Изменение = Новый Структура("deleteSheet", Лист); + Запросы.Добавить(Изменение); + + Параметры = Новый Структура("requests", Запросы); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Копировать лист +// Копирует лист из одной книги в другую +// +// Параметры: +// Токен - Строка - Токен - token +// Откуда - Строка - ID книги источника - from +// Куда - Строка - ID книги приемника - to +// Лист - Строка - ID копируемого листа - sheet +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция КопироватьЛист(Знач Токен, Знач Откуда, Знач Куда, Знач Лист) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + + Откуда + + "/sheets/" + + Лист + + ":copyTo"; + + Параметры = Новый Структура("destinationSpreadsheetId", Куда); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСДанными + +// Установить значения ячеек +// Устанавливает значения ячеек листа +// +// Параметры: +// Токен - Строка - Токен - token +// Книга - Строка - ID книги - spreadsheet +// СоответствиеЗначений - Соответствие Из КлючИЗначение - Данные заполнения, где ключ это имя ячейки вида A1 - data +// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname +// ОсновноеИзмерение - Строка - Основное измерение при заполнении диапазона массивом - dim +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция УстановитьЗначенияЯчеек(Знач Токен + , Знач Книга + , Знач СоответствиеЗначений + , Знач Лист = "" + , Знач ОсновноеИзмерение = "COLUMNS") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеЗначений); + + Если Не ТипЗнч(СоответствиеЗначений) = Тип("Структура") + И Не ТипЗнч(СоответствиеЗначений) = Тип("Соответствие") Тогда + Возврат "Не удалось привести структуру значений к коллекции"; + КонецЕсли; + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchUpdate"; + МассивДанных = СформироватьМассивДанныхЯчеек(СоответствиеЗначений, ОсновноеИзмерение, Лист); + + Параметры = Новый Структура("data,valueInputOption", МассивДанных, "USER_ENTERED"); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Очистить ячейки +// Очищает значение в ячейках +// +// Параметры: +// Токен - Строка - Токен - token +// Книга - Строка - ID книги - spreadsheet +// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для очистки - cells +// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ОчиститьЯчейки(Знач Токен, Знач Книга, Знач МассивЯчеек, Знач Лист = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchClear"; + + СформироватьМассивИменЯчеек(МассивЯчеек, Лист); + + Параметры = Новый Структура("ranges", МассивЯчеек); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить значения ячеек +// Получает значения ячеек таблицы +// +// Параметры: +// Токен - Строка - Токен - token +// Книга - Строка - ID книги - spreadsheet +// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для получения (весь лист, если не заполнено) - cells +// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьЗначенияЯчеек(Знач Токен, Знач Книга, Знач МассивЯчеек = "", Знач Лист = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchGet"; + + Если ЗначениеЗаполнено(МассивЯчеек) Тогда + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек); + СформироватьМассивИменЯчеек(МассивЯчеек, Лист); + + Первый = Истина; + Для Каждого Ячейка Из МассивЯчеек Цикл + Разделитель = ?(Первый, "?", "&"); + URL = URL + Разделитель + "ranges=" + Ячейка; + Первый = Ложь; + КонецЦикла; + Иначе + URL = URL + "?ranges='" + Лист + "'"; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ЗаполнитьМассивЛистов(Знач МассивИмен, МассивЛистов) + + Для Каждого ИмяЛиста Из МассивИмен Цикл + + Лист = СоздатьЛист(ИмяЛиста); + МассивЛистов.Добавить(Лист); + + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьИмяЛиста(Ячейка, Знач Лист) + + Если ЗначениеЗаполнено(Лист) Тогда + Ячейка = "'" + Лист + "'!" + Ячейка; + КонецЕсли; + +КонецПроцедуры + +Функция СоздатьЛист(Знач Наименование) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + + СвойстваЛиста = Новый Структура("title" , Наименование); + Лист = Новый Структура("properties", СвойстваЛиста); + + Возврат Лист; + +КонецФункции + +Функция СформироватьМассивДанныхЯчеек(Знач СтруктураЗначений, Знач ОсновноеИзмерение, Знач Лист) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); + + МассивДанных = Новый Массив; + + Для Каждого ДанныеЯчейки Из СтруктураЗначений Цикл + + ТекущееЗначение = ДанныеЯчейки.Значение; + ТекущийКлюч = ДанныеЯчейки.Ключ; + + ДобавитьИмяЛиста(ТекущийКлюч, Лист); + + OPI_ПреобразованиеТипов.ПолучитьМассив(ТекущееЗначение); + + ТекущиеДанные = Новый Соответствие; + ТекущийМассив = Новый Массив; + + ТекущийМассив.Добавить(ТекущееЗначение); + + OPI_Инструменты.ДобавитьПоле("range" , ТекущийКлюч , "Строка", ТекущиеДанные); + OPI_Инструменты.ДобавитьПоле("values" , ТекущийМассив , "Массив", ТекущиеДанные); + OPI_Инструменты.ДобавитьПоле("majorDimension", ОсновноеИзмерение, "Строка", ТекущиеДанные); + + МассивДанных.Добавить(ТекущиеДанные); + + КонецЦикла; + + Возврат МассивДанных; + +КонецФункции + +Процедура СформироватьМассивИменЯчеек(Знач МассивИмен, Знач Лист) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); + + Для Н = 0 По МассивИмен.ВГраница() Цикл + ДобавитьИмяЛиста(МассивИмен[Н], Лист); + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_GoogleWorkspace.os b/ru/OInt/core/Modules/OPI_GoogleWorkspace.os index bb65b18314..4fd739a8a3 100644 --- a/ru/OInt/core/Modules/OPI_GoogleWorkspace.os +++ b/ru/OInt/core/Modules/OPI_GoogleWorkspace.os @@ -1,173 +1,173 @@ -// Расположение OS: ./OInt/core/Modules/OPI_GoogleWorkspace.os -// Библиотека: Google Workspace -// Команда CLI: google - -// 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:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -// Сформировать ссылку получения кода -// Возвращает URL для авторизации в браузере -// -// Параметры: -// ClientID - Строка - Client ID - id -// Calendar - Булево - разрешение на методы Calendar - calendar -// Drive - Булево - разрешение на методы Drive - drive -// Sheets - Булево - разрешение на методы Sheets - sheets -// -// Возвращаемое значение: -// Строка - Ссылка получения кода -Функция СформироватьСсылкуПолученияКода(Знач ClientID - , Знач Calendar = Истина - , Знач Drive = Истина - , Знач Sheets = Истина) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID); - OPI_ПреобразованиеТипов.ПолучитьБулево(Calendar); - OPI_ПреобразованиеТипов.ПолучитьБулево(Sheets); - OPI_ПреобразованиеТипов.ПолучитьБулево(Drive); - - URL = "https://accounts.google.com/o/oauth2/auth"; - - ПараметрыURL = Новый Структура; - ПараметрыURL.Вставить("response_type", "code"); - ПараметрыURL.Вставить("client_id" , ClientID); - ПараметрыURL.Вставить("redirect_uri" , "http://localhost"); - ПараметрыURL.Вставить("access_type" , "offline"); - ПараметрыURL.Вставить("scope" , ПолучитьСписокРазрешений(Calendar, Drive, Sheets)); - - URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); - - Возврат URL; - -КонецФункции - -// Получить токен по коду -// Получает токен по коду из авторизации в бразуере -// -// Параметры: -// ClientID - Строка - Client ID - id -// ClientSecret - Строка - Client secret - secret -// Code - Строка - Code из браузера - code -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьТокенПоКоду(Знач ClientID, Знач ClientSecret, Знач Code) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Code); - - URL = "https://accounts.google.com/o/oauth2/token"; - - ПараметрыURL = Новый Структура; - ПараметрыURL.Вставить("grant_type" , "authorization_code"); - ПараметрыURL.Вставить("client_id" , ClientID); - ПараметрыURL.Вставить("client_secret", ClientSecret); - ПараметрыURL.Вставить("redirect_uri" , "http://localhost"); - ПараметрыURL.Вставить("code" , Code); - - Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь); - - Возврат Ответ; - -КонецФункции - -// Обновить токен -// Обновляет токен по Refresh token -// -// Параметры: -// ClientID - Строка - Client ID - id -// ClientSecret - Строка - Client secret - secret -// RefreshToken - Строка - Refresh token - refresh -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ОбновитьТокен(Знач ClientID, Знач ClientSecret, Знач RefreshToken) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret); - OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken); - - URL = "https://accounts.google.com/o/oauth2/token"; - - ПараметрыURL = Новый Структура; - ПараметрыURL.Вставить("grant_type" , "refresh_token"); - ПараметрыURL.Вставить("client_id" , ClientID); - ПараметрыURL.Вставить("client_secret", ClientSecret); - ПараметрыURL.Вставить("refresh_token", RefreshToken); - - Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - -Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Authorization", "Bearer " + Токен); - - Возврат Заголовки; - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИфункции - -Функция ПолучитьСписокРазрешений(Calendar, Drive, Sheets) - - МассивРазрешений = Новый Массив; - - Если Calendar Тогда - МассивРазрешений.Добавить("https://www.googleapis.com/auth/calendar"); - КонецЕсли; - - Если Drive Тогда - МассивРазрешений.Добавить("https://www.googleapis.com/auth/drive"); - КонецЕсли; - - Если Sheets Тогда - МассивРазрешений.Добавить("https://www.googleapis.com/auth/spreadsheets"); - КонецЕсли; - - Возврат СтрСоединить(МассивРазрешений, " "); - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_GoogleWorkspace.os +// Библиотека: Google Workspace +// Команда CLI: google + +// 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:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +// Сформировать ссылку получения кода +// Возвращает URL для авторизации в браузере +// +// Параметры: +// ClientID - Строка - Client ID - id +// Calendar - Булево - разрешение на методы Calendar - calendar +// Drive - Булево - разрешение на методы Drive - drive +// Sheets - Булево - разрешение на методы Sheets - sheets +// +// Возвращаемое значение: +// Строка - Ссылка получения кода +Функция СформироватьСсылкуПолученияКода(Знач ClientID + , Знач Calendar = Истина + , Знач Drive = Истина + , Знач Sheets = Истина) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID); + OPI_ПреобразованиеТипов.ПолучитьБулево(Calendar); + OPI_ПреобразованиеТипов.ПолучитьБулево(Sheets); + OPI_ПреобразованиеТипов.ПолучитьБулево(Drive); + + URL = "https://accounts.google.com/o/oauth2/auth"; + + ПараметрыURL = Новый Структура; + ПараметрыURL.Вставить("response_type", "code"); + ПараметрыURL.Вставить("client_id" , ClientID); + ПараметрыURL.Вставить("redirect_uri" , "http://localhost"); + ПараметрыURL.Вставить("access_type" , "offline"); + ПараметрыURL.Вставить("scope" , ПолучитьСписокРазрешений(Calendar, Drive, Sheets)); + + URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); + + Возврат URL; + +КонецФункции + +// Получить токен по коду +// Получает токен по коду из авторизации в бразуере +// +// Параметры: +// ClientID - Строка - Client ID - id +// ClientSecret - Строка - Client secret - secret +// Code - Строка - Code из браузера - code +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьТокенПоКоду(Знач ClientID, Знач ClientSecret, Знач Code) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Code); + + URL = "https://accounts.google.com/o/oauth2/token"; + + ПараметрыURL = Новый Структура; + ПараметрыURL.Вставить("grant_type" , "authorization_code"); + ПараметрыURL.Вставить("client_id" , ClientID); + ПараметрыURL.Вставить("client_secret", ClientSecret); + ПараметрыURL.Вставить("redirect_uri" , "http://localhost"); + ПараметрыURL.Вставить("code" , Code); + + Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь); + + Возврат Ответ; + +КонецФункции + +// Обновить токен +// Обновляет токен по Refresh token +// +// Параметры: +// ClientID - Строка - Client ID - id +// ClientSecret - Строка - Client secret - secret +// RefreshToken - Строка - Refresh token - refresh +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ОбновитьТокен(Знач ClientID, Знач ClientSecret, Знач RefreshToken) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret); + OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken); + + URL = "https://accounts.google.com/o/oauth2/token"; + + ПараметрыURL = Новый Структура; + ПараметрыURL.Вставить("grant_type" , "refresh_token"); + ПараметрыURL.Вставить("client_id" , ClientID); + ПараметрыURL.Вставить("client_secret", ClientSecret); + ПараметрыURL.Вставить("refresh_token", RefreshToken); + + Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization", "Bearer " + Токен); + + Возврат Заголовки; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИфункции + +Функция ПолучитьСписокРазрешений(Calendar, Drive, Sheets) + + МассивРазрешений = Новый Массив; + + Если Calendar Тогда + МассивРазрешений.Добавить("https://www.googleapis.com/auth/calendar"); + КонецЕсли; + + Если Drive Тогда + МассивРазрешений.Добавить("https://www.googleapis.com/auth/drive"); + КонецЕсли; + + Если Sheets Тогда + МассивРазрешений.Добавить("https://www.googleapis.com/auth/spreadsheets"); + КонецЕсли; + + Возврат СтрСоединить(МассивРазрешений, " "); + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_Notion.os b/ru/OInt/core/Modules/OPI_Notion.os index fb9c068f55..9303abb4fa 100644 --- a/ru/OInt/core/Modules/OPI_Notion.os +++ b/ru/OInt/core/Modules/OPI_Notion.os @@ -1,889 +1,889 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Notion.os -// Библиотека: Notion -// Команда CLI: notion - -// 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:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:NumberOfOptionalParams-off -// BSLLS:UsingServiceTag-off - -// @skip-check method-too-many-params - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область РаботаСоСтраницами - -// Создать страницу -// Создает дочернюю страницу над другой страницей-родителем -// -// Параметры: -// Токен - Строка - Токен - token -// Родитель - Строка - ID Родителя - page -// Заголовок - Строка - Заголовок страницы - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция СоздатьСтраницу(Знач Токен, Знач Родитель, Знач Заголовок) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Свойства = Новый Структура; - Параметры = Новый Структура; - - ДобавитьЗаголовокСтраницы(Заголовок, Свойства); - ДобавитьРодителяСтраницы(Родитель, Ложь, Параметры); - - Параметры.Вставить("properties", Свойства); - - Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать страницу в базу -// Создает страницу в базе-родителе -// -// Параметры: -// Токен - Строка - Токен - token -// Родитель - Строка - ID родительской базы - base -// Данные - Соответствие Из КлючИЗначение - Соответствие свойств - data -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция СоздатьСтраницуВБазу(Знач Токен, Знач Родитель, Знач Данные) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Параметры = Новый Структура; - - ДобавитьРодителяСтраницы(Родитель, Истина, Параметры); - - Свойства = ЗаполнитьДанныеПоСхеме(Родитель, Данные, Токен); - Параметры.Вставить("properties", Свойства); - - Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить страницу -// Получает информацию о странице по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Страница - Строка - ID страницы - page -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ПолучитьСтраницу(Знач Токен, Знач Страница) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - ПреобразоватьИД(Страница); - - Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/pages/" + Страница, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить свойства страницы. -// -// Параметры: -// Токен - Строка - Токен - token -// Страница - Строка - ID изменяемой страницы - page -// Данные - Соответствие Из КлючИЗначение - Соответствие изменяемых параметров - data -// Иконка - Строка - URL картинки иконки страницы - icon -// Обложка - Строка - URL картинки обложки страницы - cover -// Архивирована - Булево - Архивировать страницу или нет (булево) - archive -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ИзменитьСвойстваСтраницы(Знач Токен - , Знач Страница - , Знач Данные = "" - , Знач Иконка = "" - , Знач Обложка = "" - , Знач Архивирована = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Иконка); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Обложка); - OPI_ПреобразованиеТипов.ПолучитьБулево(Архивирована); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Параметры = Новый Структура; - Files = "files"; - - Если ЗначениеЗаполнено(Данные) - И (ТипЗнч(Данные) = Тип("Соответствие") Или ТипЗнч(Данные) = Тип("Структура")) Тогда - Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь); - Иначе - Свойства = Новый Соответствие; - КонецЕсли; - - Если ЗначениеЗаполнено(Иконка) Тогда - СоответствиеИконки = Новый Соответствие; - СоответствиеИконки.Вставить("Icon", Иконка); - - ОбъектИконка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеИконки); - ОбъектИконка = ОбъектИконка[Files][0]; - ОбъектИконка.Удалить("name"); - - Параметры.Вставить("icon", ОбъектИконка); - КонецЕсли; - - Если ЗначениеЗаполнено(Обложка) Тогда - СоответствиеОбложки = Новый Соответствие; - СоответствиеОбложки.Вставить("Cover", Обложка); - - ОбъектОбложка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеОбложки); - ОбъектОбложка = ОбъектОбложка[Files][0]; - ОбъектОбложка.Удалить("name"); - - Параметры.Вставить("cover", ОбъектОбложка); - КонецЕсли; - - Параметры.Вставить("properties", Свойства); - Параметры.Вставить("archived" , Архивирована); - - ПреобразоватьИД(Страница); - - Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/pages/" + Страница, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСБазамиДанных - -// Создать базу данных -// Создает базу данных -// -// Параметры: -// Токен - Строка - Токен - token -// Родитель - Строка - ID страницы родителя - page -// Заголовок - Строка - Заголовок базы данных - title -// Свойства - Структура Из Строка - Свойства базы данных - props -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция СоздатьБазуДанных(Знач Токен, Знач Родитель, Знач Заголовок, Знач Свойства = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства); - - // Пример структуры/соответствия свойств - - // Имя : title - // Описание : rich_text - // В работе : checkbox - // Количество : number - // Дата : date - // Статус : Соответствие - // Активный : green - // Неактивный : red - // Архив : yellow - - // Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя - - Если Не ТипЗнч(Свойства) = Тип("Структура") И Не ТипЗнч(Свойства) = Тип("Соответствие") Тогда - Свойства = Новый Структура("Наименование", "title"); - КонецЕсли; - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Параметры = Новый Структура; - - ДобавитьРодителяБазы(Родитель, Ложь, Параметры); - ДобавитьЗаголовокБазы(Заголовок, Параметры); - ДобавитьСвойстваБазы(Свойства, Параметры); - - Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/databases", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить базу данных -// Получить данные о базе данных -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - ID базы данных - base -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ПолучитьБазуДанных(Знач Токен, Знач База) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - ПреобразоватьИД(База); - - Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/databases/" + База, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить свойства базы -// Изменяет свойства существующей базы -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - ID целевой базы - base -// Свойства - Соответствие из КлючИЗначение - Новые или изменяемые свойства базы данных - props -// Заголовок - Строка - Новый заголовок базы - title -// Описание - Строка - Новое описание базы - description -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ИзменитьСвойстваБазы(Знач Токен, Знач База, Знач Свойства = "", Знач Заголовок = "", Знач Описание = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства); - - Параметры = Новый Структура; - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - ПреобразоватьИД(База); - - Если ЗначениеЗаполнено(Заголовок) Тогда - ДобавитьЗаголовокБазы(Заголовок, Параметры); - КонецЕсли; - - Если ЗначениеЗаполнено(Описание) Тогда - ДобавитьОписаниеБазы(Описание, Параметры); - КонецЕсли; - - Если ТипЗнч(Свойства) = Тип("Структура") Или ТипЗнч(Свойства) = Тип("Соответствие") Тогда - ДобавитьСвойстваБазы(Свойства, Параметры); - КонецЕсли; - - Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/databases/" + База, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСБлоками - -// Создать блок -// Создает новый блок на основе существующего блока -// -// Параметры: -// Токен - Строка - Токен - token -// Родитель - Строка - ID родительского блока или страницы - page -// Блок - Строка,Соответствие Из КлючИЗначение - ID блока или сам блок образец - block -// ВставитьПосле - Строка - ID блока, после которого необходимо встаивть новый - prev -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция СоздатьБлок(Знач Токен, Знач Родитель, Знач Блок, Знач ВставитьПосле = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ВставитьПосле); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блок); - - Если ТипЗнч(Блок) = Тип("Массив") Тогда - Блок = Блок[0]; - КонецЕсли; - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - ПреобразоватьИД(Родитель); - - Если ТипЗнч(Блок) = Тип("Строка") Тогда - ПреобразоватьИД(Блок); - Блок = ВернутьБлок(Токен, Блок); - КонецЕсли; - - МассивБлоков = Новый Массив; - МассивБлоков.Добавить(Блок); - - Параметры = Новый Соответствие; - Параметры.Вставить("children", МассивБлоков); - - Если ЗначениеЗаполнено(ВставитьПосле) Тогда - Параметры.Вставить("after", ВставитьПосле); - КонецЕсли; - - URL = "https://api.notion.com/v1/blocks/" + Родитель + "/children"; - Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Вернуть блок. -// -// Параметры: -// Токен - Строка - Токен - token -// ИДБлока - Строка - ID блока - block -// ТолькоОснова - Булево - Истина > служебные поля удаляются, остается только сам блок - core -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ВернутьБлок(Знач Токен, Знач ИДБлока, Знач ТолькоОснова = Истина) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока); - OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоОснова); - - ПреобразоватьИД(ИДБлока); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки); - - Если ТолькоОснова Тогда - УдалитьЛишниеПоляБлока(Ответ); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -// Вернуть дочерние блоки -// Созвращает список дочерних блоков блока-родителя -// -// Параметры: -// Токен - Строка - Токен - token -// ИДБлока - Строка - ID блока родителя - block -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ВернутьДочерниеБлоки(Знач Токен, Знач ИДБлока) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока); - - ПреобразоватьИД(ИДБлока); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока + "/children", , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить блок -// Удаляет блок по ID -// -// Параметры: -// Токен - Строка - Токен - token -// ИДБлока - Строка - ID блока - block -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция УдалитьБлок(Знач Токен, Знач ИДБлока) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока); - - ПреобразоватьИД(ИДБлока); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Delete("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область Пользователи - -// Список пользователей -// Возвращает список пользователей рабочего пространства -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция СписокПользователей(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/users", , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить данные пользователя -// Получает данные пользователя по ID -// -// Параметры: -// Токен - Строка - Токен - token -// ИДПользователя - Строка - ID целевого пользователя - user -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ПолучитьДанныеПользователя(Знач Токен, Знач ИДПользователя) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПользователя); - - ПреобразоватьИД(ИДПользователя); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/users/" + ИДПользователя, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция СоздатьЗаголовкиЗапроса(Знач Токен) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Authorization" , "Bearer " + Токен); - Заголовки.Вставить("Notion-Version", "2022-06-28"); - - Возврат Заголовки; - -КонецФункции - -Процедура ПреобразоватьИД(Идентификатор) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - - Идентификатор = СтрЗаменить(Идентификатор, "-", ""); - -КонецПроцедуры - -Процедура ДобавитьРодителяСтраницы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза); - - ПреобразоватьИД(Родитель); - - ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id"); - СтруктураРодителя = Новый Структура(ПолеИдентификатора, Родитель); - - ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя); - -КонецПроцедуры - -Процедура ДобавитьРодителяБазы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза); - - ПреобразоватьИД(Родитель); - - ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id"); - - СтруктураРодителя = Новый Структура(); - СтруктураРодителя.Вставить("type" , ПолеИдентификатора); - СтруктураРодителя.Вставить(ПолеИдентификатора, Родитель); - - ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя); - -КонецПроцедуры - -Процедура ДобавитьЗаголовокСтраницы(Знач Заголовок, ОсновнаяСтруктура) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); - - ПодчиненнаяСтруктура = Новый Структура; - СтруктураДанных = Новый Структура; - СтруктураТекста = Новый Структура; - МассивДанных = Новый Массив; - Title = "title"; - - СтруктураТекста.Вставить("content", Заголовок); - СтруктураТекста.Вставить("link" , Неопределено); - - СтруктураДанных.Вставить("text", СтруктураТекста); - СтруктураДанных.Вставить("type", "text"); - - МассивДанных.Добавить(СтруктураДанных); - - ПодчиненнаяСтруктура.Вставить("id" , Title); - ПодчиненнаяСтруктура.Вставить("type" , Title); - ПодчиненнаяСтруктура.Вставить(Title , МассивДанных); - - ОсновнаяСтруктура.Вставить(Title, ПодчиненнаяСтруктура); - -КонецПроцедуры - -Процедура ДобавитьЗаголовокБазы(Знач Заголовок, ОсновнаяСтруктура) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); - - Заголовок = ПреобразоватьЗаголовок(Заголовок); - ОсновнаяСтруктура.Вставить("title", Заголовок["title"]); - -КонецПроцедуры - -Процедура ДобавитьОписаниеБазы(Знач Описание, ОсновнаяСтруктура) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); - - Заголовок = ПреобразоватьЗаголовок(Описание); - ОсновнаяСтруктура.Вставить("description", Заголовок["title"]); - -КонецПроцедуры - -Процедура ДобавитьСвойстваБазы(Знач Свойства, ОсновнаяСтруктура) - - Если Свойства.Количество() = 0 Тогда - ОсновнаяСтруктура.Вставить("properties", Новый Структура); - Возврат; - КонецЕсли; - - СоответствиеПараметров = Новый Соответствие; - - Для Каждого Свойство Из Свойства Цикл - - Если ТипЗнч(Свойство.Значение) = Тип("Строка") Тогда - - СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура(Свойство.Значение, Новый Структура)); - - ИначеЕсли ТипЗнч(Свойство.Значение) = Тип("Структура") - Или ТипЗнч(Свойство.Значение) = Тип("Соответствие") Тогда - - ВыборЗначения = СформироватьЗначенияВыбора(Свойство.Значение); - СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура("select", ВыборЗначения)); - - Иначе - - СоответствиеПараметров.Вставить(Свойство.Ключ, Свойство.Значение); - - КонецЕсли; - - КонецЦикла; - - ОсновнаяСтруктура.Вставить("properties", СоответствиеПараметров); - -КонецПроцедуры - -Функция СформироватьЗначенияВыбора(Знач СтруктураВариантов) - - МассивВариантов = Новый Массив; - - Для Каждого Вариант Из СтруктураВариантов Цикл - - СоответствиеВарианта = Новый Соответствие; - СоответствиеВарианта.Вставить("name" , Вариант.Ключ); - СоответствиеВарианта.Вставить("color", Вариант.Значение); - - МассивВариантов.Добавить(СоответствиеВарианта); - - КонецЦикла; - - Возврат Новый Структура("options", МассивВариантов); - -КонецФункции - -Функция ЗаполнитьДанныеПоСхеме(Знач Схема, Знач Данные, Знач Токен, Знач ЭтоБаза = Истина) - - Если ЭтоБаза Тогда - ДанныеСхемы = ПолучитьБазуДанных(Токен, Схема); - Иначе - ДанныеСхемы = ПолучитьСтраницу(Токен, Схема); - КонецЕсли; - - ПоляБазы = ДанныеСхемы["properties"]; - Свойства = Новый Соответствие; - - Если ЗначениеЗаполнено(ПоляБазы) Тогда - - Для Каждого Поле Из ПоляБазы Цикл - - ДанныеПоля = Поле.Значение; - ТипПоля = ДанныеПоля["type"]; - - ЗаполняемыеДанные = Данные.Получить(Поле.Ключ); - - Если ЗаполняемыеДанные = Неопределено Тогда - Продолжить; - КонецЕсли; - - ПреобразованныеДанные = ПреобразоватьЗначениеПоТипу(ТипПоля, ЗаполняемыеДанные); - - Если ПреобразованныеДанные = Неопределено Тогда - Продолжить; - КонецЕсли; - - Свойства.Вставить(ДанныеПоля["id"], ПреобразованныеДанные); - - КонецЦикла; - - КонецЕсли; - - Возврат Свойства; - -КонецФункции - -Процедура УдалитьЛишниеПоляБлока(Знач Блок) - - МассивЛишних = Новый Массив; - МассивЛишних.Добавить("request_id"); - МассивЛишних.Добавить("archived"); - МассивЛишних.Добавить("created_by"); - МассивЛишних.Добавить("last_edited_time"); - МассивЛишних.Добавить("created_time"); - МассивЛишних.Добавить("has_children"); - МассивЛишних.Добавить("parrent"); - МассивЛишних.Добавить("last_edited_by"); - МассивЛишних.Добавить("id"); - - Для Каждого Поле Из МассивЛишних Цикл - - Если Не Блок.Получить(Поле) = Неопределено Тогда - Блок.Удалить(Поле); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -#Область ПреобразованиеТипов - -Функция ПреобразоватьЗначениеПоТипу(Знач Тип, Знач Значение) - - Если Тип = "title" Тогда - Возврат ПреобразоватьЗаголовок(Значение); - ИначеЕсли Тип = "rich_text" Тогда - Возврат ПреобразоватьТекст(Значение); - ИначеЕсли Тип = "number" Тогда - Возврат ПреобразоватьЧисло(Значение); - ИначеЕсли Тип = "select" Тогда - Возврат ПреобразоватьВариантВыбора(Значение); - ИначеЕсли Тип = "multi_select" Тогда - Возврат ПреобразоватьМножественныйВыбор(Значение); - ИначеЕсли Тип = "status" Тогда - Возврат ПреобразоватьСтатус(Значение); - ИначеЕсли Тип = "date" Тогда - Возврат ПреобразоватьДату(Значение); - ИначеЕсли Тип = "relation" Тогда - Возврат ПреобразоватьСвязь(Значение); - ИначеЕсли Тип = "people" Тогда - Возврат ПреобразоватьПользователей(Значение); - ИначеЕсли Тип = "files" Тогда - Возврат ПреобразоватьФайлы(Значение); - ИначеЕсли Тип = "checkbox" Тогда - Возврат ПреобразоватьБулево(Значение); - ИначеЕсли Тип = "url" Тогда - Возврат ПреобразоватьСсылку(Значение); - ИначеЕсли Тип = "email" Тогда - Возврат ПреобразоватьПочту(Значение); - ИначеЕсли Тип = "phone_number" Тогда - Возврат ПреобразоватьТелефон(Значение); - Иначе - Возврат Неопределено; - КонецЕсли; - -КонецФункции - -Функция ПреобразоватьЗаголовок(Знач Заголовок) - - СтруктураДанных = Новый Структура; - СтруктураТекста = Новый Структура; - МассивДанных = Новый Массив; - - СтруктураТекста.Вставить("content", Заголовок); - СтруктураТекста.Вставить("link" , Неопределено); - - СтруктураДанных.Вставить("type", "text"); - СтруктураДанных.Вставить("text", СтруктураТекста); - - МассивДанных.Добавить(СтруктураДанных); - - Возврат Новый Структура("title", МассивДанных); - -КонецФункции - -Функция ПреобразоватьТекст(Знач Текст) - - МассивТекста = Новый Массив; - СтруктураТекста = Новый Структура; - - СтруктураТекста.Вставить("type", "text"); - СтруктураТекста.Вставить("text", Новый Структура("content", Текст)); - - МассивТекста.Добавить(СтруктураТекста); - - Возврат Новый Структура("rich_text", МассивТекста); - -КонецФункции - -Функция ПреобразоватьЧисло(Знач Число) - Возврат Новый Структура("number", Число); -КонецФункции - -Функция ПреобразоватьВариантВыбора(Знач Вариант) - - СтруктураВыбора = Новый Структура; - СтруктураВыбора.Вставить("select", Новый Структура("name", Вариант)); - - Возврат СтруктураВыбора; - -КонецФункции - -Функция ПреобразоватьСтатус(Знач Статус) - - СтруктураСтатуса = Новый Структура; - СтруктураСтатуса.Вставить("status", Новый Структура("name", Статус)); - - Возврат СтруктураСтатуса; - -КонецФункции - -Функция ПреобразоватьМножественныйВыбор(Знач МассивВариантов) - - МассивВариантовВыбора = Новый Массив; - - Для Каждого Вариант Из МассивВариантов Цикл - МассивВариантовВыбора.Добавить(Новый Структура("name", Вариант)); - КонецЦикла; - - Возврат Новый Структура("multi_select", МассивВариантовВыбора); - -КонецФункции - -Функция ПреобразоватьДату(Знач Дата) - - СтруктураДаты = Новый Структура; - - Если Дата = НачалоДня(Дата) Тогда - ФорматДаты = "ДФ=yyyy-MM-dd"; - Иначе - ФорматДаты = "ДФ=yyyy-MM-ddThh:mm:ssZ"; - КонецЕсли; - - Дата = Формат(Дата, ФорматДаты); - СтруктураДаты.Вставить("start", Дата); - - Возврат Новый Структура("date", СтруктураДаты); - -КонецФункции - -Функция ПреобразоватьСвязь(Знач Идентификатор) - - МассивСвязи = Новый Массив; - МассивСвязи.Добавить(Новый Структура("id", Идентификатор)); - - Возврат Новый Структура("relation", МассивСвязи); - -КонецФункции - -Функция ПреобразоватьПользователей(Знач МассивИД) - - Если Не ТипЗнч(МассивИД) = Тип("Массив") Тогда - МассивИД_ = Новый Массив; - МассивИД_.Добавить(МассивИД); - МассивИД = МассивИД_; - КонецЕсли; - - МассивПользователей = Новый Массив; - - Для Каждого Идентификатор Из МассивИД Цикл - - СтруктураПользователя = Новый Структура; - СтруктураПользователя.Вставить("object", "user"); - СтруктураПользователя.Вставить("id" , Идентификатор); - МассивПользователей.Добавить(СтруктураПользователя); - - КонецЦикла; - - Возврат Новый Структура("people", МассивПользователей); - -КонецФункции - -Функция ПреобразоватьФайлы(Знач СоответствиеФайлов) - - МассивФайлов = Новый Массив; - - Для Каждого Файл Из СоответствиеФайлов Цикл - - СтруктураФайла = Новый Структура; - СтруктураФайла.Вставить("type" , "external"); - СтруктураФайла.Вставить("name" , Файл.Ключ); - СтруктураФайла.Вставить("external", Новый Структура("url", Файл.Значение)); - - МассивФайлов.Добавить(СтруктураФайла); - - КонецЦикла; - - Возврат Новый Структура("files", МассивФайлов); - -КонецФункции - -Функция ПреобразоватьБулево(Знач Булево) - Возврат Новый Структура("checkbox", Булево); -КонецФункции - -Функция ПреобразоватьСсылку(Знач URL) - Возврат Новый Структура("url", URL); -КонецФункции - -Функция ПреобразоватьПочту(Знач Почта) - Возврат Новый Структура("email", Почта); -КонецФункции - -Функция ПреобразоватьТелефон(Знач Телефон) - Возврат Новый Структура("phone_number", Телефон); -КонецФункции - -#КонецОбласти - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Notion.os +// Библиотека: Notion +// Команда CLI: notion + +// 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:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off + +// @skip-check method-too-many-params + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область РаботаСоСтраницами + +// Создать страницу +// Создает дочернюю страницу над другой страницей-родителем +// +// Параметры: +// Токен - Строка - Токен - token +// Родитель - Строка - ID Родителя - page +// Заголовок - Строка - Заголовок страницы - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция СоздатьСтраницу(Знач Токен, Знач Родитель, Знач Заголовок) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Свойства = Новый Структура; + Параметры = Новый Структура; + + ДобавитьЗаголовокСтраницы(Заголовок, Свойства); + ДобавитьРодителяСтраницы(Родитель, Ложь, Параметры); + + Параметры.Вставить("properties", Свойства); + + Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать страницу в базу +// Создает страницу в базе-родителе +// +// Параметры: +// Токен - Строка - Токен - token +// Родитель - Строка - ID родительской базы - base +// Данные - Соответствие Из КлючИЗначение - Соответствие свойств - data +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция СоздатьСтраницуВБазу(Знач Токен, Знач Родитель, Знач Данные) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Параметры = Новый Структура; + + ДобавитьРодителяСтраницы(Родитель, Истина, Параметры); + + Свойства = ЗаполнитьДанныеПоСхеме(Родитель, Данные, Токен); + Параметры.Вставить("properties", Свойства); + + Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить страницу +// Получает информацию о странице по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Страница - Строка - ID страницы - page +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ПолучитьСтраницу(Знач Токен, Знач Страница) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + ПреобразоватьИД(Страница); + + Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/pages/" + Страница, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить свойства страницы. +// +// Параметры: +// Токен - Строка - Токен - token +// Страница - Строка - ID изменяемой страницы - page +// Данные - Соответствие Из КлючИЗначение - Соответствие изменяемых параметров - data +// Иконка - Строка - URL картинки иконки страницы - icon +// Обложка - Строка - URL картинки обложки страницы - cover +// Архивирована - Булево - Архивировать страницу или нет (булево) - archive +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ИзменитьСвойстваСтраницы(Знач Токен + , Знач Страница + , Знач Данные = "" + , Знач Иконка = "" + , Знач Обложка = "" + , Знач Архивирована = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Иконка); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Обложка); + OPI_ПреобразованиеТипов.ПолучитьБулево(Архивирована); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Параметры = Новый Структура; + Files = "files"; + + Если ЗначениеЗаполнено(Данные) + И (ТипЗнч(Данные) = Тип("Соответствие") Или ТипЗнч(Данные) = Тип("Структура")) Тогда + Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь); + Иначе + Свойства = Новый Соответствие; + КонецЕсли; + + Если ЗначениеЗаполнено(Иконка) Тогда + СоответствиеИконки = Новый Соответствие; + СоответствиеИконки.Вставить("Icon", Иконка); + + ОбъектИконка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеИконки); + ОбъектИконка = ОбъектИконка[Files][0]; + ОбъектИконка.Удалить("name"); + + Параметры.Вставить("icon", ОбъектИконка); + КонецЕсли; + + Если ЗначениеЗаполнено(Обложка) Тогда + СоответствиеОбложки = Новый Соответствие; + СоответствиеОбложки.Вставить("Cover", Обложка); + + ОбъектОбложка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеОбложки); + ОбъектОбложка = ОбъектОбложка[Files][0]; + ОбъектОбложка.Удалить("name"); + + Параметры.Вставить("cover", ОбъектОбложка); + КонецЕсли; + + Параметры.Вставить("properties", Свойства); + Параметры.Вставить("archived" , Архивирована); + + ПреобразоватьИД(Страница); + + Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/pages/" + Страница, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСБазамиДанных + +// Создать базу данных +// Создает базу данных +// +// Параметры: +// Токен - Строка - Токен - token +// Родитель - Строка - ID страницы родителя - page +// Заголовок - Строка - Заголовок базы данных - title +// Свойства - Структура Из Строка - Свойства базы данных - props +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция СоздатьБазуДанных(Знач Токен, Знач Родитель, Знач Заголовок, Знач Свойства = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства); + + // Пример структуры/соответствия свойств + + // Имя : title + // Описание : rich_text + // В работе : checkbox + // Количество : number + // Дата : date + // Статус : Соответствие + // Активный : green + // Неактивный : red + // Архив : yellow + + // Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя + + Если Не ТипЗнч(Свойства) = Тип("Структура") И Не ТипЗнч(Свойства) = Тип("Соответствие") Тогда + Свойства = Новый Структура("Наименование", "title"); + КонецЕсли; + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Параметры = Новый Структура; + + ДобавитьРодителяБазы(Родитель, Ложь, Параметры); + ДобавитьЗаголовокБазы(Заголовок, Параметры); + ДобавитьСвойстваБазы(Свойства, Параметры); + + Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/databases", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить базу данных +// Получить данные о базе данных +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - ID базы данных - base +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ПолучитьБазуДанных(Знач Токен, Знач База) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + ПреобразоватьИД(База); + + Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/databases/" + База, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить свойства базы +// Изменяет свойства существующей базы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - ID целевой базы - base +// Свойства - Соответствие из КлючИЗначение - Новые или изменяемые свойства базы данных - props +// Заголовок - Строка - Новый заголовок базы - title +// Описание - Строка - Новое описание базы - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ИзменитьСвойстваБазы(Знач Токен, Знач База, Знач Свойства = "", Знач Заголовок = "", Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства); + + Параметры = Новый Структура; + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + ПреобразоватьИД(База); + + Если ЗначениеЗаполнено(Заголовок) Тогда + ДобавитьЗаголовокБазы(Заголовок, Параметры); + КонецЕсли; + + Если ЗначениеЗаполнено(Описание) Тогда + ДобавитьОписаниеБазы(Описание, Параметры); + КонецЕсли; + + Если ТипЗнч(Свойства) = Тип("Структура") Или ТипЗнч(Свойства) = Тип("Соответствие") Тогда + ДобавитьСвойстваБазы(Свойства, Параметры); + КонецЕсли; + + Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/databases/" + База, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСБлоками + +// Создать блок +// Создает новый блок на основе существующего блока +// +// Параметры: +// Токен - Строка - Токен - token +// Родитель - Строка - ID родительского блока или страницы - page +// Блок - Строка,Соответствие Из КлючИЗначение - ID блока или сам блок образец - block +// ВставитьПосле - Строка - ID блока, после которого необходимо встаивть новый - prev +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция СоздатьБлок(Знач Токен, Знач Родитель, Знач Блок, Знач ВставитьПосле = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ВставитьПосле); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блок); + + Если ТипЗнч(Блок) = Тип("Массив") Тогда + Блок = Блок[0]; + КонецЕсли; + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + ПреобразоватьИД(Родитель); + + Если ТипЗнч(Блок) = Тип("Строка") Тогда + ПреобразоватьИД(Блок); + Блок = ВернутьБлок(Токен, Блок); + КонецЕсли; + + МассивБлоков = Новый Массив; + МассивБлоков.Добавить(Блок); + + Параметры = Новый Соответствие; + Параметры.Вставить("children", МассивБлоков); + + Если ЗначениеЗаполнено(ВставитьПосле) Тогда + Параметры.Вставить("after", ВставитьПосле); + КонецЕсли; + + URL = "https://api.notion.com/v1/blocks/" + Родитель + "/children"; + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Вернуть блок. +// +// Параметры: +// Токен - Строка - Токен - token +// ИДБлока - Строка - ID блока - block +// ТолькоОснова - Булево - Истина > служебные поля удаляются, остается только сам блок - core +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ВернутьБлок(Знач Токен, Знач ИДБлока, Знач ТолькоОснова = Истина) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока); + OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоОснова); + + ПреобразоватьИД(ИДБлока); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки); + + Если ТолькоОснова Тогда + УдалитьЛишниеПоляБлока(Ответ); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +// Вернуть дочерние блоки +// Созвращает список дочерних блоков блока-родителя +// +// Параметры: +// Токен - Строка - Токен - token +// ИДБлока - Строка - ID блока родителя - block +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ВернутьДочерниеБлоки(Знач Токен, Знач ИДБлока) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока); + + ПреобразоватьИД(ИДБлока); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока + "/children", , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить блок +// Удаляет блок по ID +// +// Параметры: +// Токен - Строка - Токен - token +// ИДБлока - Строка - ID блока - block +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция УдалитьБлок(Знач Токен, Знач ИДБлока) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока); + + ПреобразоватьИД(ИДБлока); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Delete("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область Пользователи + +// Список пользователей +// Возвращает список пользователей рабочего пространства +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция СписокПользователей(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/users", , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить данные пользователя +// Получает данные пользователя по ID +// +// Параметры: +// Токен - Строка - Токен - token +// ИДПользователя - Строка - ID целевого пользователя - user +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ПолучитьДанныеПользователя(Знач Токен, Знач ИДПользователя) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПользователя); + + ПреобразоватьИД(ИДПользователя); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/users/" + ИДПользователя, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьЗаголовкиЗапроса(Знач Токен) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization" , "Bearer " + Токен); + Заголовки.Вставить("Notion-Version", "2022-06-28"); + + Возврат Заголовки; + +КонецФункции + +Процедура ПреобразоватьИД(Идентификатор) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + + Идентификатор = СтрЗаменить(Идентификатор, "-", ""); + +КонецПроцедуры + +Процедура ДобавитьРодителяСтраницы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза); + + ПреобразоватьИД(Родитель); + + ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id"); + СтруктураРодителя = Новый Структура(ПолеИдентификатора, Родитель); + + ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя); + +КонецПроцедуры + +Процедура ДобавитьРодителяБазы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза); + + ПреобразоватьИД(Родитель); + + ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id"); + + СтруктураРодителя = Новый Структура(); + СтруктураРодителя.Вставить("type" , ПолеИдентификатора); + СтруктураРодителя.Вставить(ПолеИдентификатора, Родитель); + + ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя); + +КонецПроцедуры + +Процедура ДобавитьЗаголовокСтраницы(Знач Заголовок, ОсновнаяСтруктура) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + + ПодчиненнаяСтруктура = Новый Структура; + СтруктураДанных = Новый Структура; + СтруктураТекста = Новый Структура; + МассивДанных = Новый Массив; + Title = "title"; + + СтруктураТекста.Вставить("content", Заголовок); + СтруктураТекста.Вставить("link" , Неопределено); + + СтруктураДанных.Вставить("text", СтруктураТекста); + СтруктураДанных.Вставить("type", "text"); + + МассивДанных.Добавить(СтруктураДанных); + + ПодчиненнаяСтруктура.Вставить("id" , Title); + ПодчиненнаяСтруктура.Вставить("type" , Title); + ПодчиненнаяСтруктура.Вставить(Title , МассивДанных); + + ОсновнаяСтруктура.Вставить(Title, ПодчиненнаяСтруктура); + +КонецПроцедуры + +Процедура ДобавитьЗаголовокБазы(Знач Заголовок, ОсновнаяСтруктура) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + + Заголовок = ПреобразоватьЗаголовок(Заголовок); + ОсновнаяСтруктура.Вставить("title", Заголовок["title"]); + +КонецПроцедуры + +Процедура ДобавитьОписаниеБазы(Знач Описание, ОсновнаяСтруктура) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); + + Заголовок = ПреобразоватьЗаголовок(Описание); + ОсновнаяСтруктура.Вставить("description", Заголовок["title"]); + +КонецПроцедуры + +Процедура ДобавитьСвойстваБазы(Знач Свойства, ОсновнаяСтруктура) + + Если Свойства.Количество() = 0 Тогда + ОсновнаяСтруктура.Вставить("properties", Новый Структура); + Возврат; + КонецЕсли; + + СоответствиеПараметров = Новый Соответствие; + + Для Каждого Свойство Из Свойства Цикл + + Если ТипЗнч(Свойство.Значение) = Тип("Строка") Тогда + + СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура(Свойство.Значение, Новый Структура)); + + ИначеЕсли ТипЗнч(Свойство.Значение) = Тип("Структура") + Или ТипЗнч(Свойство.Значение) = Тип("Соответствие") Тогда + + ВыборЗначения = СформироватьЗначенияВыбора(Свойство.Значение); + СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура("select", ВыборЗначения)); + + Иначе + + СоответствиеПараметров.Вставить(Свойство.Ключ, Свойство.Значение); + + КонецЕсли; + + КонецЦикла; + + ОсновнаяСтруктура.Вставить("properties", СоответствиеПараметров); + +КонецПроцедуры + +Функция СформироватьЗначенияВыбора(Знач СтруктураВариантов) + + МассивВариантов = Новый Массив; + + Для Каждого Вариант Из СтруктураВариантов Цикл + + СоответствиеВарианта = Новый Соответствие; + СоответствиеВарианта.Вставить("name" , Вариант.Ключ); + СоответствиеВарианта.Вставить("color", Вариант.Значение); + + МассивВариантов.Добавить(СоответствиеВарианта); + + КонецЦикла; + + Возврат Новый Структура("options", МассивВариантов); + +КонецФункции + +Функция ЗаполнитьДанныеПоСхеме(Знач Схема, Знач Данные, Знач Токен, Знач ЭтоБаза = Истина) + + Если ЭтоБаза Тогда + ДанныеСхемы = ПолучитьБазуДанных(Токен, Схема); + Иначе + ДанныеСхемы = ПолучитьСтраницу(Токен, Схема); + КонецЕсли; + + ПоляБазы = ДанныеСхемы["properties"]; + Свойства = Новый Соответствие; + + Если ЗначениеЗаполнено(ПоляБазы) Тогда + + Для Каждого Поле Из ПоляБазы Цикл + + ДанныеПоля = Поле.Значение; + ТипПоля = ДанныеПоля["type"]; + + ЗаполняемыеДанные = Данные.Получить(Поле.Ключ); + + Если ЗаполняемыеДанные = Неопределено Тогда + Продолжить; + КонецЕсли; + + ПреобразованныеДанные = ПреобразоватьЗначениеПоТипу(ТипПоля, ЗаполняемыеДанные); + + Если ПреобразованныеДанные = Неопределено Тогда + Продолжить; + КонецЕсли; + + Свойства.Вставить(ДанныеПоля["id"], ПреобразованныеДанные); + + КонецЦикла; + + КонецЕсли; + + Возврат Свойства; + +КонецФункции + +Процедура УдалитьЛишниеПоляБлока(Знач Блок) + + МассивЛишних = Новый Массив; + МассивЛишних.Добавить("request_id"); + МассивЛишних.Добавить("archived"); + МассивЛишних.Добавить("created_by"); + МассивЛишних.Добавить("last_edited_time"); + МассивЛишних.Добавить("created_time"); + МассивЛишних.Добавить("has_children"); + МассивЛишних.Добавить("parrent"); + МассивЛишних.Добавить("last_edited_by"); + МассивЛишних.Добавить("id"); + + Для Каждого Поле Из МассивЛишних Цикл + + Если Не Блок.Получить(Поле) = Неопределено Тогда + Блок.Удалить(Поле); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#Область ПреобразованиеТипов + +Функция ПреобразоватьЗначениеПоТипу(Знач Тип, Знач Значение) + + Если Тип = "title" Тогда + Возврат ПреобразоватьЗаголовок(Значение); + ИначеЕсли Тип = "rich_text" Тогда + Возврат ПреобразоватьТекст(Значение); + ИначеЕсли Тип = "number" Тогда + Возврат ПреобразоватьЧисло(Значение); + ИначеЕсли Тип = "select" Тогда + Возврат ПреобразоватьВариантВыбора(Значение); + ИначеЕсли Тип = "multi_select" Тогда + Возврат ПреобразоватьМножественныйВыбор(Значение); + ИначеЕсли Тип = "status" Тогда + Возврат ПреобразоватьСтатус(Значение); + ИначеЕсли Тип = "date" Тогда + Возврат ПреобразоватьДату(Значение); + ИначеЕсли Тип = "relation" Тогда + Возврат ПреобразоватьСвязь(Значение); + ИначеЕсли Тип = "people" Тогда + Возврат ПреобразоватьПользователей(Значение); + ИначеЕсли Тип = "files" Тогда + Возврат ПреобразоватьФайлы(Значение); + ИначеЕсли Тип = "checkbox" Тогда + Возврат ПреобразоватьБулево(Значение); + ИначеЕсли Тип = "url" Тогда + Возврат ПреобразоватьСсылку(Значение); + ИначеЕсли Тип = "email" Тогда + Возврат ПреобразоватьПочту(Значение); + ИначеЕсли Тип = "phone_number" Тогда + Возврат ПреобразоватьТелефон(Значение); + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +Функция ПреобразоватьЗаголовок(Знач Заголовок) + + СтруктураДанных = Новый Структура; + СтруктураТекста = Новый Структура; + МассивДанных = Новый Массив; + + СтруктураТекста.Вставить("content", Заголовок); + СтруктураТекста.Вставить("link" , Неопределено); + + СтруктураДанных.Вставить("type", "text"); + СтруктураДанных.Вставить("text", СтруктураТекста); + + МассивДанных.Добавить(СтруктураДанных); + + Возврат Новый Структура("title", МассивДанных); + +КонецФункции + +Функция ПреобразоватьТекст(Знач Текст) + + МассивТекста = Новый Массив; + СтруктураТекста = Новый Структура; + + СтруктураТекста.Вставить("type", "text"); + СтруктураТекста.Вставить("text", Новый Структура("content", Текст)); + + МассивТекста.Добавить(СтруктураТекста); + + Возврат Новый Структура("rich_text", МассивТекста); + +КонецФункции + +Функция ПреобразоватьЧисло(Знач Число) + Возврат Новый Структура("number", Число); +КонецФункции + +Функция ПреобразоватьВариантВыбора(Знач Вариант) + + СтруктураВыбора = Новый Структура; + СтруктураВыбора.Вставить("select", Новый Структура("name", Вариант)); + + Возврат СтруктураВыбора; + +КонецФункции + +Функция ПреобразоватьСтатус(Знач Статус) + + СтруктураСтатуса = Новый Структура; + СтруктураСтатуса.Вставить("status", Новый Структура("name", Статус)); + + Возврат СтруктураСтатуса; + +КонецФункции + +Функция ПреобразоватьМножественныйВыбор(Знач МассивВариантов) + + МассивВариантовВыбора = Новый Массив; + + Для Каждого Вариант Из МассивВариантов Цикл + МассивВариантовВыбора.Добавить(Новый Структура("name", Вариант)); + КонецЦикла; + + Возврат Новый Структура("multi_select", МассивВариантовВыбора); + +КонецФункции + +Функция ПреобразоватьДату(Знач Дата) + + СтруктураДаты = Новый Структура; + + Если Дата = НачалоДня(Дата) Тогда + ФорматДаты = "ДФ=yyyy-MM-dd"; + Иначе + ФорматДаты = "ДФ=yyyy-MM-ddThh:mm:ssZ"; + КонецЕсли; + + Дата = Формат(Дата, ФорматДаты); + СтруктураДаты.Вставить("start", Дата); + + Возврат Новый Структура("date", СтруктураДаты); + +КонецФункции + +Функция ПреобразоватьСвязь(Знач Идентификатор) + + МассивСвязи = Новый Массив; + МассивСвязи.Добавить(Новый Структура("id", Идентификатор)); + + Возврат Новый Структура("relation", МассивСвязи); + +КонецФункции + +Функция ПреобразоватьПользователей(Знач МассивИД) + + Если Не ТипЗнч(МассивИД) = Тип("Массив") Тогда + МассивИД_ = Новый Массив; + МассивИД_.Добавить(МассивИД); + МассивИД = МассивИД_; + КонецЕсли; + + МассивПользователей = Новый Массив; + + Для Каждого Идентификатор Из МассивИД Цикл + + СтруктураПользователя = Новый Структура; + СтруктураПользователя.Вставить("object", "user"); + СтруктураПользователя.Вставить("id" , Идентификатор); + МассивПользователей.Добавить(СтруктураПользователя); + + КонецЦикла; + + Возврат Новый Структура("people", МассивПользователей); + +КонецФункции + +Функция ПреобразоватьФайлы(Знач СоответствиеФайлов) + + МассивФайлов = Новый Массив; + + Для Каждого Файл Из СоответствиеФайлов Цикл + + СтруктураФайла = Новый Структура; + СтруктураФайла.Вставить("type" , "external"); + СтруктураФайла.Вставить("name" , Файл.Ключ); + СтруктураФайла.Вставить("external", Новый Структура("url", Файл.Значение)); + + МассивФайлов.Добавить(СтруктураФайла); + + КонецЦикла; + + Возврат Новый Структура("files", МассивФайлов); + +КонецФункции + +Функция ПреобразоватьБулево(Знач Булево) + Возврат Новый Структура("checkbox", Булево); +КонецФункции + +Функция ПреобразоватьСсылку(Знач URL) + Возврат Новый Структура("url", URL); +КонецФункции + +Функция ПреобразоватьПочту(Знач Почта) + Возврат Новый Структура("email", Почта); +КонецФункции + +Функция ПреобразоватьТелефон(Знач Телефон) + Возврат Новый Структура("phone_number", Телефон); +КонецФункции + +#КонецОбласти + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_Slack.os b/ru/OInt/core/Modules/OPI_Slack.os index 7ec31af5b4..237f9bc5fd 100644 --- a/ru/OInt/core/Modules/OPI_Slack.os +++ b/ru/OInt/core/Modules/OPI_Slack.os @@ -1,1055 +1,1055 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Slack.os -// Библиотека: Slack -// Команда CLI: slack - -// 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:IncorrectLineBreak-off -// BSLLS:Typo-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область УправлениеИНастройки - -// Получить информацию о боте -// Получает основную информацию о боте -// -// Параметры: -// Токен - Строка - Токен бота - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьИнформациюОБоте(Знач Токен) Экспорт - - URL = "https://slack.com/api/auth.test"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список рабочих областей -// Получает список рабочих областей, в которых подключен бот -// -// Параметры: -// Токен - Строка - Токен бота - token -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокРабочихОбластей(Знач Токен, Знач Курсор = "") Экспорт - - URL = "https://slack.com/api/auth.teams.list"; - Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор); - - Возврат Ответ; - -КонецФункции - -// Получить список пользователей -// Получает список пользователей рабочей области -// -// Параметры: -// Токен - Строка - Токен бота - token -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокПользователей(Знач Токен, Знач Курсор = "") Экспорт - - URL = "https://slack.com/api/users.list"; - Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаССообщениями - -// Отправить сообщение -// Отправляет сообщение в выбранный час -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Текст - Строка - Текст сообщения - text -// ДатаОтправки - Дата - Дата отправки для отложенного сообщения - date -// Блоки - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ОтправитьСообщение(Знач Токен, Знач Канал, Знач Текст = "", Знач ДатаОтправки = "", Знач Блоки = "") Экспорт - - Строка_ = "Строка"; - ЕстьДата = ЗначениеЗаполнено(ДатаОтправки); - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Если ЗначениеЗаполнено(Блоки) И ТипЗнч(Блоки) = Тип(Строка_) Тогда - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки); - - Если ТипЗнч(Блоки) = Тип("Массив") Тогда - - Для Н = 0 По Блоки.ВГраница() Цикл - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки[Н]); - КонецЦикла; - - КонецЕсли; - - КонецЕсли; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал, Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("text" , Текст, Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("blocks" , Блоки, "Массив" , Параметры); - - Если ЕстьДата Тогда - - URL = "https://slack.com/api/chat.scheduleMessage"; - OPI_Инструменты.ДобавитьПоле("post_at", ДатаОтправки, "Дата", Параметры); - - Иначе - - URL = "https://slack.com/api/chat.postMessage"; - - КонецЕсли; - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Отправить эфемерное сообщение -// Отправляет сообщение, которое приходит в канал, но видно -// только конкретному пользователю -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Текст - Строка - Текст сообщения - text -// Пользователь - Строка - ID пользователя - user -// Блоки - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ОтправитьЭфемерноеСообщение(Знач Токен - , Знач Канал - , Знач Текст = "" - , Знач Пользователь = "" - , Знач Блоки = "") Экспорт - - Строка_ = "Строка"; - - Если ЗначениеЗаполнено(Блоки) И Не ТипЗнч(Блоки) = Тип(Строка_) Тогда - OPI_ПреобразованиеТипов.ПолучитьМассив(Блоки); - КонецЕсли; - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("user" , Пользователь, Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("blocks" , Блоки , "Коллекция", Параметры); - - URL = "https://slack.com/api/chat.postEphemeral"; - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить сообщение -// Изменяет состав существующего сообщения -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Отметка - Строка - Временная отметка сообщения - stamp -// Текст - Строка - Новый текст сообщения - text -// МассивБлоков - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ИзменитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Текст = "", Знач МассивБлоков = "") Экспорт - - Строка_ = "Строка"; - URL = "https://slack.com/api/chat.update"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("ts" , Отметка , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("blocks" , МассивБлоков, "Коллекция", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить сообщение -// Удаляет сообщение канала по timestamp -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Отметка - Строка - Временная отметка или ID сообщения - stamp -// ЭтоОтложенное - Булево - Признак удаления отложенного сообщения - issheduled -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция УдалитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач ЭтоОтложенное = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоОтложенное); - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Если ЭтоОтложенное Тогда - URL = "https://slack.com/api/chat.deleteScheduledMessage"; - ПолеОтметки = "scheduled_message_id"; - Иначе - URL = "https://slack.com/api/chat.delete"; - ПолеОтметки = "ts"; - КонецЕсли; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel" , Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле(ПолеОтметки, Отметка, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список отложенных сообщений -// Получает список отложенных сообщений канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокОтложенныхСообщений(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт - - URL = "https://slack.com/api/chat.scheduledMessages.list"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить ссылку на сообщение -// Получает постоянный UTL к сообщению канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Отметка - Строка - Временная отметка или ID сообщения - stamp -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСсылкуНаСообщение(Знач Токен, Знач Канал, Знач Отметка) Экспорт - - URL = "https://slack.com/api/chat.getPermalink"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel" , Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("message_ts", Отметка, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список ответов на сообщение -// Получает массив сообщений, которые являются ответом на указанное -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Отметка - Строка - Временная отметка или ID сообщения - stamp -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокОтветовНаСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Курсор = "") Экспорт - - Строка_ = "Строка"; - URL = "https://slack.com/api/conversations.replies"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("ts" , Отметка, Строка_, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСКаналами - -// Получить список каналов -// Получает список доступных каналов -// -// Параметры: -// Токен - Строка - Токен бота - token -// ИсключатьАрхивированные - Булево - Признак исключения архивированных каналов - notarchived -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокКаналов(Знач Токен, Знач ИсключатьАрхивированные = Ложь, Знач Курсор = "") Экспорт - - URL = "https://slack.com/api/conversations.list"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("exclude_archived", ИсключатьАрхивированные, "Булево", Параметры); - OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список пользователей канала -// Получает список пользователей указанного канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокПользователейКанала(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт - - URL = "https://slack.com/api/conversations.members"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать канал -// Создает новый канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// Название - Строка - Наименование канала - title -// Приватный - Булево - Создать канал приватным - private -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция СоздатьКанал(Знач Токен, Знач Название, Знач Приватный = Ложь) Экспорт - - URL = "https://slack.com/api/conversations.create"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("name" , Название , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("is_private", Приватный, "Булево", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Архивировать канал -// Архивирует активный канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция АрхивироватьКанал(Знач Токен, Знач Канал) Экспорт - - URL = "https://slack.com/api/conversations.archive"; - Ответ = УправлениеДиалогом(Токен, Канал, URL); - Возврат Ответ; - -КонецФункции - -// Получить канал -// Получает информацию о канале -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьКанал(Знач Токен, Знач Канал) Экспорт - - URL = "https://slack.com/api/conversations.info"; - Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET"); - Возврат Ответ; - -КонецФункции - -// Получить историю канала -// Получает информацию событиях канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьИсториюКанала(Знач Токен, Знач Канал) Экспорт - - URL = "https://slack.com/api/conversations.history"; - Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET"); - Возврат Ответ; - -КонецФункции - -// Пригласить пользователей в канал -// Добавляет указанных пользователей в канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// МассивПользователей - Массив Из Строка - Массив ID пользователей - users -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПригласитьПользователейВКанал(Знач Токен, Знач Канал, Знач МассивПользователей) Экспорт - - URL = "https://slack.com/api/conversations.invite"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей); - МассивПользователей = СтрСоединить(МассивПользователей, ","); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("users" , МассивПользователей, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Выгнать пользователя из канала -// Удаляет указанного пользователя из канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// Пользователь - Строка - ID пользователя - user -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ВыгнатьПользователяИзКанала(Знач Токен, Знач Канал, Знач Пользователь) Экспорт - - URL = "https://slack.com/api/conversations.kick"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("user" , Пользователь, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Вступить в канал -// Добавляет текущего бота в канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ВступитьВКанал(Знач Токен, Знач Канал) Экспорт - - URL = "https://slack.com/api/conversations.join"; - Ответ = УправлениеДиалогом(Токен, Канал, URL); - Возврат Ответ; - -КонецФункции - -// Покинуть канал -// Удаляет текущего бота из канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПокинутьКанал(Знач Токен, Знач Канал) Экспорт - - URL = "https://slack.com/api/conversations.leave"; - Ответ = УправлениеДиалогом(Токен, Канал, URL); - Возврат Ответ; - -КонецФункции - -// Установить тему канала -// Устанавливает тему канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// Тема - Строка - Тема канала - theme -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция УстановитьТемуКанала(Знач Токен, Знач Канал, Знач Тема) Экспорт - - URL = "https://slack.com/api/conversations.setTopic"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("topic" , Тема , "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Установить цель канала -// Устанавливает цель (описание) канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// Цель - Строка - Цель канала - purpose -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция УстановитьЦельКанала(Знач Токен, Знач Канал, Знач Цель) Экспорт - - URL = "https://slack.com/api/conversations.setPurpose"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("purpose", Цель , "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Переименовать канал -// Изменяет название канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// Название - Строка - Новое название канала - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПереименоватьКанал(Знач Токен, Знач Канал, Знач Название) Экспорт - - URL = "https://slack.com/api/conversations.rename"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("name" , Название, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСДиалогами - -// Открыть диалог -// Открывает новый диалог с одним или несколькими пользователями -// -// Параметры: -// Токен - Строка - Токен бота - token -// МассивПользователей - Массив из Строка - Массив ID пользователей - users -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ОткрытьДиалог(Знач Токен, Знач МассивПользователей) Экспорт - - URL = "https://slack.com/api/conversations.open"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей); - МассивПользователей = СтрСоединить(МассивПользователей, ","); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("users", МассивПользователей, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Закрыть диалог -// Закрывает существующий диалог -// -// Параметры: -// Токен - Строка - Токен бота - token -// Диалог - Строка - ID диалога - conv -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ЗакрытьДиалог(Знач Токен, Знач Диалог) Экспорт - - URL = "https://slack.com/api/conversations.close"; - Ответ = УправлениеДиалогом(Токен, Диалог, URL); - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСФайлами - -// Получить список файлов -// Получает список файлов бота или канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Канал для отбора - channel -// НомерСтраницы - Число, Строка - Номер страницы - page -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокФайлов(Знач Токен, Знач Канал = "", Знач НомерСтраницы = 1) Экспорт - - URL = "https://slack.com/api/files.list"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("page" , НомерСтраницы, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Загрузить файл -// Загружает файл на сервера Slack -// -// Параметры: -// Токен - Строка - Токен бота - token -// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file -// ИмяФайла - Строка - Имя файла с расширением - filename -// Заголовок - Строка - Имя файла в Slack - title -// Канал - Строка - ID канала - channel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач ИмяФайла, Знач Заголовок, Знач Канал = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяФайла); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); - - Строка_ = "Строка"; - Upload_url = "upload_url"; - File_id = "file_id"; - URL = "https://slack.com/api/files.getUploadURLExternal"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - Размер = Файл.Размер(); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("filename", ИмяФайла, Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("length" , Размер , Строка_, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - URL = Ответ[Upload_url]; - Идентификатор = Ответ[File_id]; - - Если Не ЗначениеЗаполнено(URL) Или Не ЗначениеЗаполнено(Идентификатор) Тогда - Возврат Ответ; - КонецЕсли; - - Файлы = Новый Соответствие; - Файлы.Вставить(ИмяФайла, Файл); - - Ответ = OPI_Инструменты.PostMultipart(URL, , Файлы, , Заголовки); - URL = "https://slack.com/api/files.completeUploadExternal"; - ФайлСлак = Новый Структура("id, title", Идентификатор, Заголовок); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("filename" , ИмяФайла, Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("channel_id", Канал , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("files" , ФайлСлак, "Массив", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить данные файла -// Получает информацию о файле -// -// Параметры: -// Токен - Строка - Токен бота - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьДанныеФайла(Знач Токен, Знач ИдентификаторФайла) Экспорт - - URL = "https://slack.com/api/files.info"; - Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL, "GET"); - - Возврат Ответ; - -КонецФункции - -// Удалить файл -// Удаляет файл на Slack -// -// Параметры: -// Токен - Строка - Токен бота - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция УдалитьФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт - - URL = "https://slack.com/api/files.delete"; - Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); - - Возврат Ответ; - -КонецФункции - -// Сделать файл публичным -// Создает публичный URL для файла. Требует токен пользователя -// -// Параметры: -// Токен - Строка - Токен пользователя - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция СделатьФайлПубличным(Знач Токен, Знач ИдентификаторФайла) Экспорт - - URL = "https://slack.com/api/files.sharedPublicURL"; - Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); - - Возврат Ответ; - -КонецФункции - -// Сделать файл приватным -// Удаляет публичный URL у файла. Требует токен пользователя -// -// Параметры: -// Токен - Строка - Токен пользователя - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция СделатьФайлПриватным(Знач Токен, Знач ИдентификаторФайла) Экспорт - - URL = "https://slack.com/api/files.revokePublicURL"; - Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСУдаленнымиФайлами - -// Получить список внешних файлов -// Получает список внешних файлов пользователя или канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Канал для отбора - channel -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокВнешнихФайлов(Знач Токен, Знач Канал = "", Знач Курсор = "") Экспорт - - URL = "https://slack.com/api/files.remote.list"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить внешний файл -// Получает информацию о внешнем файле -// -// Параметры: -// Токен - Строка - Токен бота - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт - - URL = "https://slack.com/api/files.remote.info"; - Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL); - - Возврат Ответ; - -КонецФункции - -// Добавить внешний файл -// Добавляет новый внешний файл -// -// Параметры: -// Токен - Строка - Токен бота - token -// URL - Строка - URL к внешнему файлу - url -// Заголовок - Строка - Заголовок файла для Slack - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ДобавитьВнешнийФайл(Знач Токен, Знач URL, Знач Заголовок) Экспорт - - Строка_ = "Строка"; - URL = "https://slack.com/api/files.remote.add"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - UID = Строка(Новый УникальныйИдентификатор()); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("external_url", URL , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("external_id" , UID , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("title" , Заголовок , Строка_, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Отправить внешний файл -// Отправляет внейшний файл по списку каналов -// -// Параметры: -// Токен - Строка - Токен бота - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// МассивКаналов - Массив Из Строка - Массив каналов для отправки - channels -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ОтправитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла, Знач МассивКаналов) Экспорт - - URL = "https://slack.com/api/files.remote.share"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКаналов); - МассивКаналов = СтрСоединить(МассивКаналов, ","); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("file" , ИдентификаторФайла , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("channels", МассивКаналов , "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить внешний файл -// Удаляет внешний файл из Slack -// -// Параметры: -// Токен - Строка - Токен бота - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция УдалитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт - - URL = "https://slack.com/api/files.remote.remove"; - Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область ФормированиеБлоков - -// Сформировать блок картинку -// Формирует блок с картинкой для добавления в массив блоков сообщения -// -// Параметры: -// URL - Строка - URL картинки - picture -// АльтернативныйТекст - Строка - Альтернативный текст картинки - alt -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Блок картинки -Функция СформироватьБлокКартинку(Знач URL, Знач АльтернативныйТекст = "") Экспорт - - Строка_ = "Строка"; - - Блок = Новый Соответствие; - OPI_Инструменты.ДобавитьПоле("type" , "image" , Строка_, Блок); - OPI_Инструменты.ДобавитьПоле("image_url", URL , Строка_, Блок); - OPI_Инструменты.ДобавитьПоле("alt_text" , АльтернативныйТекст , Строка_, Блок); - - Возврат Блок; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ПолучитьЗаголовокАвторизации(Знач Токен) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Authorization", "Bearer " + Токен); - Возврат Заголовки; - -КонецФункции - -Функция УправлениеДиалогом(Знач Токен, Знач Канал, Знач URL, Знач ВидЗапроса = "POST") - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - ВидЗапроса = вРег(ВидЗапроса); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал, "Строка", Параметры); - - Если ВидЗапроса = "POST" Тогда - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - Иначе - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция УправлениеФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL, Знач ВидЗапроса = "POST") - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - ВидЗапроса = вРег(ВидЗапроса); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры); - - Если ВидЗапроса = "POST" Тогда - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - Иначе - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ПолучениеОбщихДанных(Знач Токен, Знач URL, Знач Курсор) - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -Функция УправлениеВнешнимФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL) - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Slack.os +// Библиотека: Slack +// Команда CLI: slack + +// 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:IncorrectLineBreak-off +// BSLLS:Typo-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область УправлениеИНастройки + +// Получить информацию о боте +// Получает основную информацию о боте +// +// Параметры: +// Токен - Строка - Токен бота - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьИнформациюОБоте(Знач Токен) Экспорт + + URL = "https://slack.com/api/auth.test"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список рабочих областей +// Получает список рабочих областей, в которых подключен бот +// +// Параметры: +// Токен - Строка - Токен бота - token +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокРабочихОбластей(Знач Токен, Знач Курсор = "") Экспорт + + URL = "https://slack.com/api/auth.teams.list"; + Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор); + + Возврат Ответ; + +КонецФункции + +// Получить список пользователей +// Получает список пользователей рабочей области +// +// Параметры: +// Токен - Строка - Токен бота - token +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокПользователей(Знач Токен, Знач Курсор = "") Экспорт + + URL = "https://slack.com/api/users.list"; + Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаССообщениями + +// Отправить сообщение +// Отправляет сообщение в выбранный час +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Текст - Строка - Текст сообщения - text +// ДатаОтправки - Дата - Дата отправки для отложенного сообщения - date +// Блоки - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ОтправитьСообщение(Знач Токен, Знач Канал, Знач Текст = "", Знач ДатаОтправки = "", Знач Блоки = "") Экспорт + + Строка_ = "Строка"; + ЕстьДата = ЗначениеЗаполнено(ДатаОтправки); + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Если ЗначениеЗаполнено(Блоки) И ТипЗнч(Блоки) = Тип(Строка_) Тогда + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки); + + Если ТипЗнч(Блоки) = Тип("Массив") Тогда + + Для Н = 0 По Блоки.ВГраница() Цикл + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки[Н]); + КонецЦикла; + + КонецЕсли; + + КонецЕсли; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал, Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("text" , Текст, Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("blocks" , Блоки, "Массив" , Параметры); + + Если ЕстьДата Тогда + + URL = "https://slack.com/api/chat.scheduleMessage"; + OPI_Инструменты.ДобавитьПоле("post_at", ДатаОтправки, "Дата", Параметры); + + Иначе + + URL = "https://slack.com/api/chat.postMessage"; + + КонецЕсли; + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Отправить эфемерное сообщение +// Отправляет сообщение, которое приходит в канал, но видно +// только конкретному пользователю +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Текст - Строка - Текст сообщения - text +// Пользователь - Строка - ID пользователя - user +// Блоки - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ОтправитьЭфемерноеСообщение(Знач Токен + , Знач Канал + , Знач Текст = "" + , Знач Пользователь = "" + , Знач Блоки = "") Экспорт + + Строка_ = "Строка"; + + Если ЗначениеЗаполнено(Блоки) И Не ТипЗнч(Блоки) = Тип(Строка_) Тогда + OPI_ПреобразованиеТипов.ПолучитьМассив(Блоки); + КонецЕсли; + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("user" , Пользователь, Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("blocks" , Блоки , "Коллекция", Параметры); + + URL = "https://slack.com/api/chat.postEphemeral"; + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить сообщение +// Изменяет состав существующего сообщения +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Отметка - Строка - Временная отметка сообщения - stamp +// Текст - Строка - Новый текст сообщения - text +// МассивБлоков - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ИзменитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Текст = "", Знач МассивБлоков = "") Экспорт + + Строка_ = "Строка"; + URL = "https://slack.com/api/chat.update"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("ts" , Отметка , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("blocks" , МассивБлоков, "Коллекция", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить сообщение +// Удаляет сообщение канала по timestamp +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Отметка - Строка - Временная отметка или ID сообщения - stamp +// ЭтоОтложенное - Булево - Признак удаления отложенного сообщения - issheduled +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция УдалитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач ЭтоОтложенное = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоОтложенное); + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Если ЭтоОтложенное Тогда + URL = "https://slack.com/api/chat.deleteScheduledMessage"; + ПолеОтметки = "scheduled_message_id"; + Иначе + URL = "https://slack.com/api/chat.delete"; + ПолеОтметки = "ts"; + КонецЕсли; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel" , Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле(ПолеОтметки, Отметка, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список отложенных сообщений +// Получает список отложенных сообщений канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокОтложенныхСообщений(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт + + URL = "https://slack.com/api/chat.scheduledMessages.list"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить ссылку на сообщение +// Получает постоянный UTL к сообщению канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Отметка - Строка - Временная отметка или ID сообщения - stamp +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСсылкуНаСообщение(Знач Токен, Знач Канал, Знач Отметка) Экспорт + + URL = "https://slack.com/api/chat.getPermalink"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel" , Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("message_ts", Отметка, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список ответов на сообщение +// Получает массив сообщений, которые являются ответом на указанное +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Отметка - Строка - Временная отметка или ID сообщения - stamp +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокОтветовНаСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Курсор = "") Экспорт + + Строка_ = "Строка"; + URL = "https://slack.com/api/conversations.replies"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("ts" , Отметка, Строка_, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСКаналами + +// Получить список каналов +// Получает список доступных каналов +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИсключатьАрхивированные - Булево - Признак исключения архивированных каналов - notarchived +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокКаналов(Знач Токен, Знач ИсключатьАрхивированные = Ложь, Знач Курсор = "") Экспорт + + URL = "https://slack.com/api/conversations.list"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("exclude_archived", ИсключатьАрхивированные, "Булево", Параметры); + OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список пользователей канала +// Получает список пользователей указанного канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокПользователейКанала(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт + + URL = "https://slack.com/api/conversations.members"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать канал +// Создает новый канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// Название - Строка - Наименование канала - title +// Приватный - Булево - Создать канал приватным - private +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция СоздатьКанал(Знач Токен, Знач Название, Знач Приватный = Ложь) Экспорт + + URL = "https://slack.com/api/conversations.create"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("name" , Название , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("is_private", Приватный, "Булево", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Архивировать канал +// Архивирует активный канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция АрхивироватьКанал(Знач Токен, Знач Канал) Экспорт + + URL = "https://slack.com/api/conversations.archive"; + Ответ = УправлениеДиалогом(Токен, Канал, URL); + Возврат Ответ; + +КонецФункции + +// Получить канал +// Получает информацию о канале +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьКанал(Знач Токен, Знач Канал) Экспорт + + URL = "https://slack.com/api/conversations.info"; + Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET"); + Возврат Ответ; + +КонецФункции + +// Получить историю канала +// Получает информацию событиях канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьИсториюКанала(Знач Токен, Знач Канал) Экспорт + + URL = "https://slack.com/api/conversations.history"; + Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET"); + Возврат Ответ; + +КонецФункции + +// Пригласить пользователей в канал +// Добавляет указанных пользователей в канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// МассивПользователей - Массив Из Строка - Массив ID пользователей - users +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПригласитьПользователейВКанал(Знач Токен, Знач Канал, Знач МассивПользователей) Экспорт + + URL = "https://slack.com/api/conversations.invite"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей); + МассивПользователей = СтрСоединить(МассивПользователей, ","); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("users" , МассивПользователей, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Выгнать пользователя из канала +// Удаляет указанного пользователя из канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// Пользователь - Строка - ID пользователя - user +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ВыгнатьПользователяИзКанала(Знач Токен, Знач Канал, Знач Пользователь) Экспорт + + URL = "https://slack.com/api/conversations.kick"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("user" , Пользователь, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Вступить в канал +// Добавляет текущего бота в канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ВступитьВКанал(Знач Токен, Знач Канал) Экспорт + + URL = "https://slack.com/api/conversations.join"; + Ответ = УправлениеДиалогом(Токен, Канал, URL); + Возврат Ответ; + +КонецФункции + +// Покинуть канал +// Удаляет текущего бота из канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПокинутьКанал(Знач Токен, Знач Канал) Экспорт + + URL = "https://slack.com/api/conversations.leave"; + Ответ = УправлениеДиалогом(Токен, Канал, URL); + Возврат Ответ; + +КонецФункции + +// Установить тему канала +// Устанавливает тему канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// Тема - Строка - Тема канала - theme +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция УстановитьТемуКанала(Знач Токен, Знач Канал, Знач Тема) Экспорт + + URL = "https://slack.com/api/conversations.setTopic"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("topic" , Тема , "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Установить цель канала +// Устанавливает цель (описание) канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// Цель - Строка - Цель канала - purpose +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция УстановитьЦельКанала(Знач Токен, Знач Канал, Знач Цель) Экспорт + + URL = "https://slack.com/api/conversations.setPurpose"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("purpose", Цель , "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Переименовать канал +// Изменяет название канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// Название - Строка - Новое название канала - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПереименоватьКанал(Знач Токен, Знач Канал, Знач Название) Экспорт + + URL = "https://slack.com/api/conversations.rename"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("name" , Название, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСДиалогами + +// Открыть диалог +// Открывает новый диалог с одним или несколькими пользователями +// +// Параметры: +// Токен - Строка - Токен бота - token +// МассивПользователей - Массив из Строка - Массив ID пользователей - users +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ОткрытьДиалог(Знач Токен, Знач МассивПользователей) Экспорт + + URL = "https://slack.com/api/conversations.open"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей); + МассивПользователей = СтрСоединить(МассивПользователей, ","); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("users", МассивПользователей, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Закрыть диалог +// Закрывает существующий диалог +// +// Параметры: +// Токен - Строка - Токен бота - token +// Диалог - Строка - ID диалога - conv +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ЗакрытьДиалог(Знач Токен, Знач Диалог) Экспорт + + URL = "https://slack.com/api/conversations.close"; + Ответ = УправлениеДиалогом(Токен, Диалог, URL); + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСФайлами + +// Получить список файлов +// Получает список файлов бота или канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Канал для отбора - channel +// НомерСтраницы - Число, Строка - Номер страницы - page +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокФайлов(Знач Токен, Знач Канал = "", Знач НомерСтраницы = 1) Экспорт + + URL = "https://slack.com/api/files.list"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("page" , НомерСтраницы, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Загрузить файл +// Загружает файл на сервера Slack +// +// Параметры: +// Токен - Строка - Токен бота - token +// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file +// ИмяФайла - Строка - Имя файла с расширением - filename +// Заголовок - Строка - Имя файла в Slack - title +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач ИмяФайла, Знач Заголовок, Знач Канал = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяФайла); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + + Строка_ = "Строка"; + Upload_url = "upload_url"; + File_id = "file_id"; + URL = "https://slack.com/api/files.getUploadURLExternal"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Размер = Файл.Размер(); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("filename", ИмяФайла, Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("length" , Размер , Строка_, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + URL = Ответ[Upload_url]; + Идентификатор = Ответ[File_id]; + + Если Не ЗначениеЗаполнено(URL) Или Не ЗначениеЗаполнено(Идентификатор) Тогда + Возврат Ответ; + КонецЕсли; + + Файлы = Новый Соответствие; + Файлы.Вставить(ИмяФайла, Файл); + + Ответ = OPI_Инструменты.PostMultipart(URL, , Файлы, , Заголовки); + URL = "https://slack.com/api/files.completeUploadExternal"; + ФайлСлак = Новый Структура("id, title", Идентификатор, Заголовок); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("filename" , ИмяФайла, Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("channel_id", Канал , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("files" , ФайлСлак, "Массив", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить данные файла +// Получает информацию о файле +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьДанныеФайла(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.info"; + Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL, "GET"); + + Возврат Ответ; + +КонецФункции + +// Удалить файл +// Удаляет файл на Slack +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция УдалитьФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.delete"; + Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +// Сделать файл публичным +// Создает публичный URL для файла. Требует токен пользователя +// +// Параметры: +// Токен - Строка - Токен пользователя - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция СделатьФайлПубличным(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.sharedPublicURL"; + Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +// Сделать файл приватным +// Удаляет публичный URL у файла. Требует токен пользователя +// +// Параметры: +// Токен - Строка - Токен пользователя - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция СделатьФайлПриватным(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.revokePublicURL"; + Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСУдаленнымиФайлами + +// Получить список внешних файлов +// Получает список внешних файлов пользователя или канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Канал для отбора - channel +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокВнешнихФайлов(Знач Токен, Знач Канал = "", Знач Курсор = "") Экспорт + + URL = "https://slack.com/api/files.remote.list"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить внешний файл +// Получает информацию о внешнем файле +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.remote.info"; + Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +// Добавить внешний файл +// Добавляет новый внешний файл +// +// Параметры: +// Токен - Строка - Токен бота - token +// URL - Строка - URL к внешнему файлу - url +// Заголовок - Строка - Заголовок файла для Slack - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ДобавитьВнешнийФайл(Знач Токен, Знач URL, Знач Заголовок) Экспорт + + Строка_ = "Строка"; + URL = "https://slack.com/api/files.remote.add"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + UID = Строка(Новый УникальныйИдентификатор()); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("external_url", URL , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("external_id" , UID , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("title" , Заголовок , Строка_, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Отправить внешний файл +// Отправляет внейшний файл по списку каналов +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// МассивКаналов - Массив Из Строка - Массив каналов для отправки - channels +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ОтправитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла, Знач МассивКаналов) Экспорт + + URL = "https://slack.com/api/files.remote.share"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКаналов); + МассивКаналов = СтрСоединить(МассивКаналов, ","); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("file" , ИдентификаторФайла , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("channels", МассивКаналов , "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить внешний файл +// Удаляет внешний файл из Slack +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция УдалитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.remote.remove"; + Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область ФормированиеБлоков + +// Сформировать блок картинку +// Формирует блок с картинкой для добавления в массив блоков сообщения +// +// Параметры: +// URL - Строка - URL картинки - picture +// АльтернативныйТекст - Строка - Альтернативный текст картинки - alt +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Блок картинки +Функция СформироватьБлокКартинку(Знач URL, Знач АльтернативныйТекст = "") Экспорт + + Строка_ = "Строка"; + + Блок = Новый Соответствие; + OPI_Инструменты.ДобавитьПоле("type" , "image" , Строка_, Блок); + OPI_Инструменты.ДобавитьПоле("image_url", URL , Строка_, Блок); + OPI_Инструменты.ДобавитьПоле("alt_text" , АльтернативныйТекст , Строка_, Блок); + + Возврат Блок; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьЗаголовокАвторизации(Знач Токен) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization", "Bearer " + Токен); + Возврат Заголовки; + +КонецФункции + +Функция УправлениеДиалогом(Знач Токен, Знач Канал, Знач URL, Знач ВидЗапроса = "POST") + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + ВидЗапроса = вРег(ВидЗапроса); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал, "Строка", Параметры); + + Если ВидЗапроса = "POST" Тогда + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + Иначе + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция УправлениеФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL, Знач ВидЗапроса = "POST") + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + ВидЗапроса = вРег(ВидЗапроса); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры); + + Если ВидЗапроса = "POST" Тогда + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + Иначе + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ПолучениеОбщихДанных(Знач Токен, Знач URL, Знач Курсор) + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +Функция УправлениеВнешнимФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL) + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_Telegram.os b/ru/OInt/core/Modules/OPI_Telegram.os index 0b368450ed..0fd95001d1 100644 --- a/ru/OInt/core/Modules/OPI_Telegram.os +++ b/ru/OInt/core/Modules/OPI_Telegram.os @@ -1,1253 +1,1253 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Telegram.os -// Библиотека: Telegram -// Команда CLI: telegram - -// MIT License - -// Copyright (c) 2023 Anton Tsitavets - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -// https://github.com/Bayselonarrend/OpenIntegrations - -// BSLLS:Typo-off -// BSLLS:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:UnreachableCode-off -// BSLLS:CommentedCode-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область ПолучениеДанныхИНастройка - -// Получить информацию о боте -// Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д. -// -// Параметры: -// Токен - Строка - Токен бота - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ПолучитьИнформациюБота(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/getMe"; - Ответ = OPI_Инструменты.Get(URL); - - Возврат Ответ; - -КонецФункции - -// Получить обновления -// Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме -// -// Параметры: -// Токен - Строка - Токен бота - token -// Таймаут - Строка,Число - Время ожидания новых событий - timeout -// Смещение - Строка,Число - Смещение в списке получаемых сообщений - offset -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ПолучитьОбновления(Знач Токен, Знач Таймаут = 0, Знач Смещение = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/getUpdates"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("timeout", Таймаут , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("offset" , Смещение, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - Возврат Ответ; - -КонецФункции - -// Установить Webhook -// Устанавливает URL обработчика событий бота для работы в режиме Webhook -// -// Параметры: -// Токен - Строка - Токен бота - token -// URL - Строка - Адрес обработки запросов от Telegram (с https:) - url -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("url", URL, "Строка", Параметры); - - URL = "api.telegram.org/bot" + Токен + "/setWebHook"; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Удалить Webhook -// Удаляет URL обработчика событий бота для работы в режиме Webhook -// -// Параметры: -// Токен - Строка - Токен бота - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция УдалитьWebhook(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/deleteWebHook"; - Ответ = OPI_Инструменты.Get(URL); - - Возврат Ответ; - -КонецФункции - -// Скачать файл -// Скачивает файл с серверов Telegram -// -// Параметры: -// Токен - Строка - Токен - token -// IDФайла - Строка - ID файла для скачивания - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт - - Result = "result"; - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); - - Параметры = Новый Структура("file_id", IDФайла); - - URL = "api.telegram.org/bot" + Токен + "/getFile"; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Путь = Ответ[Result]["file_path"]; - - Если Не ЗначениеЗаполнено(Путь) Тогда - Возврат Ответ; - КонецЕсли; - - URL = "api.telegram.org/file/bot" + Токен + "/" + Путь; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// ОбработатьДанные Telegram Mini App -// Обрабатывает данные TMA и опредеяет их достоверность -// -// Параметры: -// СтрокаДанных - Строка - querry из Telegram.WebApp.initData -// Токен - Строка - Токен бота -// -// Возвращаемое значение: -// Соответствие из Строка - Соответствие данных с результатом проверки в поле passed -Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(СтрокаДанных); - - СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL); - СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных); - Ключ = "WebAppData"; - Хэш = ""; - КлючДвоичные = ПолучитьДвоичныеДанныеИзСтроки(Ключ); - - Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен)); - - ТЗнач = Новый ТаблицаЗначений; - ТЗнач.Колонки.Добавить("Ключ"); - ТЗнач.Колонки.Добавить("Значение"); - - Для Каждого Данные Из СтруктураДанных Цикл - - НоваяСтрока = ТЗнач.Добавить(); - НоваяСтрока.Ключ = Данные.Ключ; - НоваяСтрока.Значение = Данные.Значение; - - КонецЦикла; - - ТЗнач.Сортировать("Ключ"); - - СоответствиеВозврата = Новый Соответствие; - DCS = ""; - - Для Каждого СтрокаТЗ Из ТЗнач Цикл - - Если СтрокаТЗ.Ключ <> "hash" Тогда - DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС; - СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение); - Иначе - Хэш = СтрокаТЗ.Значение; - КонецЕсли; - - КонецЦикла; - - DCS = Лев(DCS, СтрДлина(DCS) - 1); - Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS)); - - Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись); - - Если Финал = вРег(Хэш) Тогда - Ответ = Истина; - Иначе - Ответ = Ложь; - КонецЕсли; - - СоответствиеВозврата.Вставить("passed", Ответ); - - Возврат СоответствиеВозврата; - -КонецФункции - -#КонецОбласти - -#Область ОтправкаДанных - -// Отправить текстовое сообщение -// Отправляет текстовое сообщение в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьТекстовоеСообщение(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры); - OPI_Инструменты.ДобавитьПоле("text" , Текст , "Строка" , Параметры); - OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); - - ДобавитьИдентификаторЧата(IDЧата, Параметры); - - URL = "api.telegram.org/bot" + Токен + "/sendMessage"; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Отправить картинку -// Отправляет картинку в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// Картинка - ДвоичныеДанные,Строка - Файл картинки - picture -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьКартинку(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач Картинка - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура, Разметка); - -КонецФункции - -// Отправить видео -// Отправляет видео в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// Видео - ДвоичныеДанные,Строка - Файл видео - video -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьВидео(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач Видео - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура, Разметка); - -КонецФункции - -// Отправить аудио -// Отправляет аудиофайл в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// Аудио - ДвоичныеДанные,Строка - Файл аудио - audio -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьАудио(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач Аудио - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура, Разметка); - -КонецФункции - -// Отправить документ -// Отправляет документ в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// Документ - ДвоичныеДанные,Строка - Файл документа - doc -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьДокумент(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач Документ - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура, Разметка); - -КонецФункции - -// Отправить гифку -// Отправляет гифку в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// Гифка - ДвоичныеДанные,Строка - Файл гифки - gif -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьГифку(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач Гифка - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура, Разметка); - -КонецФункции - -// Отправить группу медиафайлов -// Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// СоответствиеФайлов - Соответствие из Строка - Коллекция файлов - media - JSON файлов или путь к .json -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьМедиагруппу(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач СоответствиеФайлов - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - // СоответствиеФайлов - // Ключ - Файл, Значение - Тип - // Типы: audio, document, photo, video - // Нельзя замешивать разные типы! - - Строка_ = "Строка"; - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов); - - OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка); - - URL = "api.telegram.org/bot" + Токен + "/sendMediaGroup"; - СтруктураФайлов = Новый Структура; - Медиа = Новый Массив; - Параметры = Новый Структура; - - ДобавитьИдентификаторЧата(IDЧата, Параметры); - СформироватьМассивМедиа(СоответствиеФайлов, Текст, СтруктураФайлов, Медиа); - - OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("caption" , Текст , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("media" , Медиа , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); - - Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed"); - - Возврат Ответ; - -КонецФункции - -// Отправить местоположение -// Отправляет местоположение по географической широте и долготе в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Широта - Строка,Число - Географическая широта - lat -// Долгота - Строка,Число - Географическая долгота - long -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); - - URL = "api.telegram.org/bot" + Токен + "/sendLocation"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("latitude" , Широта , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("longitude" , Долгота , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура , "СтрокаФайла", Параметры); - - ДобавитьИдентификаторЧата(IDЧата, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Отправить контакт -// Отправляет контакт с именем и номером телефона -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Имя - Строка - Имя контакта - name -// Фамилия - Строка - Фамилия контакта - surname -// Телефон - Строка - Телефон контакта - phone -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); - - URL = "api.telegram.org/bot" + Токен + "/sendContact"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown", Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("first_name" , Имя , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("last_name" , Фамилия , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("phone_number", Телефон , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); - - ДобавитьИдентификаторЧата(IDЧата, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Отправить опрос -// Отправляет опрос с вариантами ответа -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Вопрос - Строка - Вопрос опроса - question -// МассивОтветов - Массив из Строка - Массив вариантов ответа - options -// Анонимный - Булево - Анонимность опроса - anonymous -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов); - - OPI_ПреобразованиеТипов.ПолучитьБулево(Анонимный); - - URL = "api.telegram.org/bot" + Токен + "/sendPoll"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка" , Параметры); - OPI_Инструменты.ДобавитьПоле("question" , Вопрос , "Строка" , Параметры); - OPI_Инструменты.ДобавитьПоле("options" , МассивОтветов, "СтрокаФайла", Параметры); - - Параметры.Вставить("is_anonymous", ?(Анонимный, 1, 0)); - ДобавитьИдентификаторЧата(IDЧата, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Переслать сообщение -// Пересылает сообщение между чатами или в рамках одного чата -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDОригинала - Строка,Число - ID оригинального сообщения - message -// ОткудаID - Строка,Число - ID чата оригинального сообщения - from -// КудаID - Строка,Число - ID целевого чата или IDЧата*IDТемы - to -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОригинала); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ОткудаID); - OPI_ПреобразованиеТипов.ПолучитьСтроку(КудаID); - - URL = "api.telegram.org/bot" + Токен + "/forwardMessage"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("from_chat_id", ОткудаID , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("message_id" , IDОригинала, "Строка", Параметры); - - ДобавитьИдентификаторЧата(КудаID, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Сформировать клавиатуру по массиву кнопок -// Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели -// -// Параметры: -// МассивКнопок - Массив из Строка - Массив кнопок - buttons -// ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели - under -// ОднаПодОдной - Булево - Истина > кнопки выводятся в столбик, Ложь > в строку - column -// -// Возвращаемое значение: -// Строка - JSON клавиатуры -Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок - , Знач ПодСообщением = Ложь - , Знач ОднаПодОдной = Истина) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением); - OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); - - Если ОднаПодОдной Тогда - Строки = СоздатьВысокуюКлавиатуру(МассивКнопок); - Иначе - Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок); - КонецЕсли; - - Если ПодСообщением Тогда - СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1); - Иначе - СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина); - КонецЕсли; - - Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра); - - Возврат Клавиатура; - -КонецФункции - -#КонецОбласти - -#Область Администрирование - -// Бан -// Банит пользователя в выбранном чате -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// IDПользователя - Строка,Число - ID целевого пользователя - user -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/banChatMember"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, Строка_, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Разбан -// Разбанивает забаненного ранее пользователя -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// IDПользователя - Строка,Число - ID целевого пользователя - user -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/unbanChatMember"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("only_if_banned", Ложь , "Булево", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Создать ссылку-приглашение -// Создает ссылку для вступления в закрытый чат -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Заголовок - Строка - Заголовок приглашения - title -// ДатаИстечения - Дата - Дата окончания жизни ссылки (безсрочно, если не указано) - expire -// ЛимитПользователей - Число - Лимит пользователей (бесконечно, если не указано) - limit -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция СоздатьСсылкуПриглашение(Знач Токен - , Знач IDЧата - , Знач Заголовок = "" - , Знач ДатаИстечения = "" - , Знач ЛимитПользователей = 0) Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("name" , Заголовок , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("member_limit" , ЛимитПользователей, Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("expire_date" , ДатаИстечения , "Дата" , Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Закрепить сообщение -// Закрепляет сообщение в шапке чата -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID целевого чата - chat -// IDСообщения - Строка,Число - ID целевого сообщения - message -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/pinChatMessage"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("message_id" , IDСообщения, Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("disable_notification", Ложь , "Булево", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Открепить сообщение -// Открепляет сообщение в шапке чата -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата - chat -// IDСообщения - Строка,Число - ID целевого сообщения - message -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, Строка_, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Получить число участников -// Получает общее число участников чата -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата - chat -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСТемамиФорума - -// Получить список иконок-аватаров -// Получает соответствие ID Emoji для установки в качестве иконок тем форума -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji -Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Result = "result"; - URL = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers"; - Ответ = OPI_Инструменты.Get(URL); - Иконки = Ответ[Result]; - - Если Не ЗначениеЗаполнено(Иконки) Тогда - Возврат Ответ; - КонецЕсли; - - Коллекция = Новый Соответствие; - - Для Каждого Иконка Из Иконки Цикл - Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]); - КонецЦикла; - - Возврат Коллекция; - -КонецФункции - -// Создать тему форума -// Создает новую тему в группе с включенным функционалом тем -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата создания темы - forum -// Заголовок - Строка - Заголовок темы - title -// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт - Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки); -КонецФункции - -// Изменить тему форума -// Создает новую тему в группе с включенным функционалом тем -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата создания темы - forum -// IDТемы - Строка,Число - ID темы - topic -// Заголовок - Строка - Новый заголовок - title -// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ИзменитьТемуФорума(Знач Токен - , Знач IDЧата - , Знач IDТемы - , Знач Заголовок = Неопределено - , Знач IDИконки = Неопределено) Экспорт - - Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы); -КонецФункции - -// Закрыть тему форума -// Закрывает тему для новых сообщений -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// IDТемы - Строка,Число - ID темы - topic -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт - Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы); -КонецФункции - -// Открыть тему форума -// Повторно открывает ранее закрытую тему форума -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// IDТемы - Строка,Число - ID темы - topic -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт - Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы); -КонецФункции - -// Удалить тему форума -// Удаляет тему форума -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// IDТемы - Строка,Число - ID темы - topic -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт - Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы); -КонецФункции - -// Скрыть главную тему форума -// Скрывает главную тему форума -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт - Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина); -КонецФункции - -// Показать главную тему форума -// Показывает ранее скрытую главную тему форума -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт - Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь); -КонецФункции - -// Изменить имя главной темы форума -// Изменяет имя главной темы форума -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// Заголовок - Строка - Новое имя главной темы - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("name" , Заголовок, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Очистить список закрепленных сообщений темы -// Очищает список закрепленных сообщений в теме форума -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// IDТемы - Строка,Число - ID темы. Главная, если не заполнено - topic -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры); - - Если ЗначениеЗаполнено(IDТемы) Тогда - Метод = "/unpinAllForumTopicMessages"; - Иначе - Метод = "/unpinAllGeneralForumTopicMessages"; - КонецЕсли; - - URL = "api.telegram.org/bot" + Токен + Метод; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура, Знач Разметка) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид); - - Расширение = ""; - Метод = ""; - - ОпределитьМетодОтправки(Вид, Метод, Расширение); - ПреобразоватьДанныеФайла(Файл, Расширение, Вид); - OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры); - OPI_Инструменты.ДобавитьПоле("caption" , Текст , "Строка" , Параметры); - OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); - - ДобавитьИдентификаторЧата(IDЧата, Параметры); - - СтруктураФайлов = Новый Структура; - СтруктураФайлов.Вставить(Вид + Расширение, Файл); - - URL = "api.telegram.org/bot" + Токен + Метод; - Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed"); - - Возврат Ответ; - -КонецФункции - -Функция УправлениеТемойФорума(Знач Токен - , Знач IDЧата - , Знач Заголовок = Неопределено - , Знач IDИконки = Неопределено - , Знач IDТемы = "") - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("name" , Заголовок, Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("icon_custom_emoji_id", IDИконки , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("message_thread_id" , IDТемы , Строка_, Параметры); - - Если ЗначениеЗаполнено(IDТемы) Тогда - Метод = "/editForumTopic"; - Иначе - Метод = "/createForumTopic"; - КонецЕсли; - - OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры); - - Возврат Ответ; - -КонецФункции - -Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач Статус, Знач IDТемы = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Если ЗначениеЗаполнено(IDТемы) Тогда - Форум = "Forum"; - Иначе - Форум = "GeneralForum"; - КонецЕсли; - - Метод = ОпределитьМетодУправленияФорумом(Статус, Форум); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры); - - URL = "api.telegram.org/bot" + Токен + Метод; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть); - - Если Скрыть Тогда - Метод = "/hideGeneralForumTopic"; - Иначе - Метод = "/unhideGeneralForumTopic"; - КонецЕсли; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата, "Строка", Параметры); - - URL = "api.telegram.org/bot" + Токен + Метод; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -Функция ОпределитьМетодУправленияФорумом(Знач Статус, Знач Форум) - - Открыть = 1; - Закрыть = 2; - Удалить = 3; - - Если Статус = Открыть Тогда - Метод = "/reopen" + Форум + "Topic"; - ИначеЕсли Статус = Закрыть Тогда - Метод = "/close" + Форум + "Topic"; - ИначеЕсли Статус = Удалить Тогда - Метод = "/deleteForumTopic"; - Иначе - ВызватьИсключение "Некорректный статус управления форумом"; - КонецЕсли; - - Возврат Метод; - -КонецФункции - -Функция СоздатьВысокуюКлавиатуру(Знач МассивКнопок) - - Строки = Новый Массив; - - Для Каждого Кнопка Из МассивКнопок Цикл - Кнопки = Новый Массив; - Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); - Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); - Строки.Добавить(Кнопки); - КонецЦикла; - - Возврат Строки; - -КонецФункции - -Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок) - - Строки = Новый Массив; - Кнопки = Новый Массив; - - Для Каждого Кнопка Из МассивКнопок Цикл - Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); - Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); - КонецЦикла; - - Строки.Добавить(Кнопки); - - Возврат Строки; - -КонецФункции - -Процедура СформироватьМассивМедиа(Знач СоответствиеФайлов, Знач Текст, СтруктураФайлов, Медиа) - - Счетчик = 0; - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - - Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда - ВызватьИсключение("Не удалось получить информацию из json медиа!"); - Возврат; - КонецЕсли; - - Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл - - Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда - - Двоичные = ТекущийФайл.Ключ; - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Двоичные); - - ЭтотФайл = Новый Файл(ТекущийФайл.Ключ); - ИмяМедиа = ТекущийФайл.Значение - + Строка(Счетчик) - + ?(ТекущийФайл.Значение = "document", ЭтотФайл.Расширение, ""); - - ПолноеИмяМедиа = СтрЗаменить(ИмяМедиа, ".", "___"); - - Иначе - Двоичные = ТекущийФайл.Ключ; - ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик); - ПолноеИмяМедиа = ИмяМедиа; - КонецЕсли; - - СтруктураФайлов.Вставить(ПолноеИмяМедиа, Двоичные); - - СтруктураМедиа = Новый Структура; - СтруктураМедиа.Вставить("type" , ТекущийФайл.Значение); - СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа); - - Если Счетчик = 0 Тогда - СтруктураМедиа.Вставить("caption", Текст); - КонецЕсли; - - Медиа.Добавить(СтруктураМедиа); - - Счетчик = Счетчик + 1; - - КонецЦикла; - - Медиа = OPI_Инструменты.JSONСтрокой(Медиа); - -КонецПроцедуры - -Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры) - - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - МассивЧата = СтрРазделить(IDЧата, "*", Ложь); - - Если МассивЧата.Количество() > 1 Тогда - - IDЧата = МассивЧата[0]; - IDТемы = МассивЧата[1]; - - Параметры.Вставить("message_thread_id", IDТемы); - - КонецЕсли; - - Параметры.Вставить("chat_id", IDЧата); - -КонецПроцедуры - -Процедура ОпределитьМетодОтправки(Знач Вид, Метод, Расширение) - - Если Вид = "photo" Тогда - Метод = "/sendPhoto"; - ИначеЕсли Вид = "video" Тогда - Метод = "/sendVideo"; - ИначеЕсли Вид = "audio" Тогда - Метод = "/sendAudio"; - ИначеЕсли Вид = "document" Тогда - Метод = "/sendDocument"; - ИначеЕсли Вид = "animation" Тогда - Метод = "/sendAnimation"; - Расширение = ".gif"; - Иначе - ВызватьИсключение "Некорректный вид отправки"; - КонецЕсли; - -КонецПроцедуры - -Процедура ПреобразоватьДанныеФайла(Файл, Расширение, Вид) - - Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда - - ТекущийФайл = Новый Файл(Файл); - Расширение = ?(Вид = "document", ТекущийФайл.Расширение, Расширение); - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); - - КонецЕсли; - - Расширение = СтрЗаменить(Расширение, ".", "___"); - -КонецПроцедуры - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Telegram.os +// Библиотека: Telegram +// Команда CLI: telegram + +// MIT License + +// Copyright (c) 2023 Anton Tsitavets + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +// https://github.com/Bayselonarrend/OpenIntegrations + +// BSLLS:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UnreachableCode-off +// BSLLS:CommentedCode-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область ПолучениеДанныхИНастройка + +// Получить информацию о боте +// Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д. +// +// Параметры: +// Токен - Строка - Токен бота - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ПолучитьИнформациюБота(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/getMe"; + Ответ = OPI_Инструменты.Get(URL); + + Возврат Ответ; + +КонецФункции + +// Получить обновления +// Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме +// +// Параметры: +// Токен - Строка - Токен бота - token +// Таймаут - Строка,Число - Время ожидания новых событий - timeout +// Смещение - Строка,Число - Смещение в списке получаемых сообщений - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ПолучитьОбновления(Знач Токен, Знач Таймаут = 0, Знач Смещение = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/getUpdates"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("timeout", Таймаут , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("offset" , Смещение, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + Возврат Ответ; + +КонецФункции + +// Установить Webhook +// Устанавливает URL обработчика событий бота для работы в режиме Webhook +// +// Параметры: +// Токен - Строка - Токен бота - token +// URL - Строка - Адрес обработки запросов от Telegram (с https:) - url +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("url", URL, "Строка", Параметры); + + URL = "api.telegram.org/bot" + Токен + "/setWebHook"; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Удалить Webhook +// Удаляет URL обработчика событий бота для работы в режиме Webhook +// +// Параметры: +// Токен - Строка - Токен бота - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция УдалитьWebhook(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/deleteWebHook"; + Ответ = OPI_Инструменты.Get(URL); + + Возврат Ответ; + +КонецФункции + +// Скачать файл +// Скачивает файл с серверов Telegram +// +// Параметры: +// Токен - Строка - Токен - token +// IDФайла - Строка - ID файла для скачивания - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт + + Result = "result"; + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); + + Параметры = Новый Структура("file_id", IDФайла); + + URL = "api.telegram.org/bot" + Токен + "/getFile"; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Путь = Ответ[Result]["file_path"]; + + Если Не ЗначениеЗаполнено(Путь) Тогда + Возврат Ответ; + КонецЕсли; + + URL = "api.telegram.org/file/bot" + Токен + "/" + Путь; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// ОбработатьДанные Telegram Mini App +// Обрабатывает данные TMA и опредеяет их достоверность +// +// Параметры: +// СтрокаДанных - Строка - querry из Telegram.WebApp.initData +// Токен - Строка - Токен бота +// +// Возвращаемое значение: +// Соответствие из Строка - Соответствие данных с результатом проверки в поле passed +Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(СтрокаДанных); + + СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL); + СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных); + Ключ = "WebAppData"; + Хэш = ""; + КлючДвоичные = ПолучитьДвоичныеДанныеИзСтроки(Ключ); + + Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен)); + + ТЗнач = Новый ТаблицаЗначений; + ТЗнач.Колонки.Добавить("Ключ"); + ТЗнач.Колонки.Добавить("Значение"); + + Для Каждого Данные Из СтруктураДанных Цикл + + НоваяСтрока = ТЗнач.Добавить(); + НоваяСтрока.Ключ = Данные.Ключ; + НоваяСтрока.Значение = Данные.Значение; + + КонецЦикла; + + ТЗнач.Сортировать("Ключ"); + + СоответствиеВозврата = Новый Соответствие; + DCS = ""; + + Для Каждого СтрокаТЗ Из ТЗнач Цикл + + Если СтрокаТЗ.Ключ <> "hash" Тогда + DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС; + СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение); + Иначе + Хэш = СтрокаТЗ.Значение; + КонецЕсли; + + КонецЦикла; + + DCS = Лев(DCS, СтрДлина(DCS) - 1); + Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS)); + + Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись); + + Если Финал = вРег(Хэш) Тогда + Ответ = Истина; + Иначе + Ответ = Ложь; + КонецЕсли; + + СоответствиеВозврата.Вставить("passed", Ответ); + + Возврат СоответствиеВозврата; + +КонецФункции + +#КонецОбласти + +#Область ОтправкаДанных + +// Отправить текстовое сообщение +// Отправляет текстовое сообщение в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьТекстовоеСообщение(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры); + OPI_Инструменты.ДобавитьПоле("text" , Текст , "Строка" , Параметры); + OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); + + ДобавитьИдентификаторЧата(IDЧата, Параметры); + + URL = "api.telegram.org/bot" + Токен + "/sendMessage"; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Отправить картинку +// Отправляет картинку в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// Картинка - ДвоичныеДанные,Строка - Файл картинки - picture +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьКартинку(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач Картинка + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура, Разметка); + +КонецФункции + +// Отправить видео +// Отправляет видео в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// Видео - ДвоичныеДанные,Строка - Файл видео - video +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьВидео(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач Видео + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура, Разметка); + +КонецФункции + +// Отправить аудио +// Отправляет аудиофайл в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// Аудио - ДвоичныеДанные,Строка - Файл аудио - audio +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьАудио(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач Аудио + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура, Разметка); + +КонецФункции + +// Отправить документ +// Отправляет документ в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// Документ - ДвоичныеДанные,Строка - Файл документа - doc +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьДокумент(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач Документ + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура, Разметка); + +КонецФункции + +// Отправить гифку +// Отправляет гифку в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// Гифка - ДвоичныеДанные,Строка - Файл гифки - gif +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьГифку(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач Гифка + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура, Разметка); + +КонецФункции + +// Отправить группу медиафайлов +// Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// СоответствиеФайлов - Соответствие из Строка - Коллекция файлов - media - JSON файлов или путь к .json +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьМедиагруппу(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач СоответствиеФайлов + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + // СоответствиеФайлов + // Ключ - Файл, Значение - Тип + // Типы: audio, document, photo, video + // Нельзя замешивать разные типы! + + Строка_ = "Строка"; + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов); + + OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка); + + URL = "api.telegram.org/bot" + Токен + "/sendMediaGroup"; + СтруктураФайлов = Новый Структура; + Медиа = Новый Массив; + Параметры = Новый Структура; + + ДобавитьИдентификаторЧата(IDЧата, Параметры); + СформироватьМассивМедиа(СоответствиеФайлов, Текст, СтруктураФайлов, Медиа); + + OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("caption" , Текст , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("media" , Медиа , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); + + Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed"); + + Возврат Ответ; + +КонецФункции + +// Отправить местоположение +// Отправляет местоположение по географической широте и долготе в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Широта - Строка,Число - Географическая широта - lat +// Долгота - Строка,Число - Географическая долгота - long +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); + + URL = "api.telegram.org/bot" + Токен + "/sendLocation"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("latitude" , Широта , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("longitude" , Долгота , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура , "СтрокаФайла", Параметры); + + ДобавитьИдентификаторЧата(IDЧата, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Отправить контакт +// Отправляет контакт с именем и номером телефона +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Имя - Строка - Имя контакта - name +// Фамилия - Строка - Фамилия контакта - surname +// Телефон - Строка - Телефон контакта - phone +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); + + URL = "api.telegram.org/bot" + Токен + "/sendContact"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown", Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("first_name" , Имя , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("last_name" , Фамилия , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("phone_number", Телефон , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); + + ДобавитьИдентификаторЧата(IDЧата, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Отправить опрос +// Отправляет опрос с вариантами ответа +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Вопрос - Строка - Вопрос опроса - question +// МассивОтветов - Массив из Строка - Массив вариантов ответа - options +// Анонимный - Булево - Анонимность опроса - anonymous +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов); + + OPI_ПреобразованиеТипов.ПолучитьБулево(Анонимный); + + URL = "api.telegram.org/bot" + Токен + "/sendPoll"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка" , Параметры); + OPI_Инструменты.ДобавитьПоле("question" , Вопрос , "Строка" , Параметры); + OPI_Инструменты.ДобавитьПоле("options" , МассивОтветов, "СтрокаФайла", Параметры); + + Параметры.Вставить("is_anonymous", ?(Анонимный, 1, 0)); + ДобавитьИдентификаторЧата(IDЧата, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Переслать сообщение +// Пересылает сообщение между чатами или в рамках одного чата +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDОригинала - Строка,Число - ID оригинального сообщения - message +// ОткудаID - Строка,Число - ID чата оригинального сообщения - from +// КудаID - Строка,Число - ID целевого чата или IDЧата*IDТемы - to +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОригинала); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ОткудаID); + OPI_ПреобразованиеТипов.ПолучитьСтроку(КудаID); + + URL = "api.telegram.org/bot" + Токен + "/forwardMessage"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("from_chat_id", ОткудаID , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("message_id" , IDОригинала, "Строка", Параметры); + + ДобавитьИдентификаторЧата(КудаID, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Сформировать клавиатуру по массиву кнопок +// Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели +// +// Параметры: +// МассивКнопок - Массив из Строка - Массив кнопок - buttons +// ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели - under +// ОднаПодОдной - Булево - Истина > кнопки выводятся в столбик, Ложь > в строку - column +// +// Возвращаемое значение: +// Строка - JSON клавиатуры +Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок + , Знач ПодСообщением = Ложь + , Знач ОднаПодОдной = Истина) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением); + OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); + + Если ОднаПодОдной Тогда + Строки = СоздатьВысокуюКлавиатуру(МассивКнопок); + Иначе + Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок); + КонецЕсли; + + Если ПодСообщением Тогда + СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1); + Иначе + СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина); + КонецЕсли; + + Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра); + + Возврат Клавиатура; + +КонецФункции + +#КонецОбласти + +#Область Администрирование + +// Бан +// Банит пользователя в выбранном чате +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// IDПользователя - Строка,Число - ID целевого пользователя - user +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/banChatMember"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, Строка_, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Разбан +// Разбанивает забаненного ранее пользователя +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// IDПользователя - Строка,Число - ID целевого пользователя - user +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/unbanChatMember"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("only_if_banned", Ложь , "Булево", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Создать ссылку-приглашение +// Создает ссылку для вступления в закрытый чат +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Заголовок - Строка - Заголовок приглашения - title +// ДатаИстечения - Дата - Дата окончания жизни ссылки (безсрочно, если не указано) - expire +// ЛимитПользователей - Число - Лимит пользователей (бесконечно, если не указано) - limit +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция СоздатьСсылкуПриглашение(Знач Токен + , Знач IDЧата + , Знач Заголовок = "" + , Знач ДатаИстечения = "" + , Знач ЛимитПользователей = 0) Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("name" , Заголовок , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("member_limit" , ЛимитПользователей, Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("expire_date" , ДатаИстечения , "Дата" , Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Закрепить сообщение +// Закрепляет сообщение в шапке чата +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID целевого чата - chat +// IDСообщения - Строка,Число - ID целевого сообщения - message +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/pinChatMessage"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("message_id" , IDСообщения, Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("disable_notification", Ложь , "Булево", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Открепить сообщение +// Открепляет сообщение в шапке чата +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата - chat +// IDСообщения - Строка,Число - ID целевого сообщения - message +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, Строка_, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Получить число участников +// Получает общее число участников чата +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата - chat +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСТемамиФорума + +// Получить список иконок-аватаров +// Получает соответствие ID Emoji для установки в качестве иконок тем форума +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji +Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Result = "result"; + URL = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers"; + Ответ = OPI_Инструменты.Get(URL); + Иконки = Ответ[Result]; + + Если Не ЗначениеЗаполнено(Иконки) Тогда + Возврат Ответ; + КонецЕсли; + + Коллекция = Новый Соответствие; + + Для Каждого Иконка Из Иконки Цикл + Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]); + КонецЦикла; + + Возврат Коллекция; + +КонецФункции + +// Создать тему форума +// Создает новую тему в группе с включенным функционалом тем +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата создания темы - forum +// Заголовок - Строка - Заголовок темы - title +// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт + Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки); +КонецФункции + +// Изменить тему форума +// Создает новую тему в группе с включенным функционалом тем +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата создания темы - forum +// IDТемы - Строка,Число - ID темы - topic +// Заголовок - Строка - Новый заголовок - title +// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ИзменитьТемуФорума(Знач Токен + , Знач IDЧата + , Знач IDТемы + , Знач Заголовок = Неопределено + , Знач IDИконки = Неопределено) Экспорт + + Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы); +КонецФункции + +// Закрыть тему форума +// Закрывает тему для новых сообщений +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// IDТемы - Строка,Число - ID темы - topic +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт + Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы); +КонецФункции + +// Открыть тему форума +// Повторно открывает ранее закрытую тему форума +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// IDТемы - Строка,Число - ID темы - topic +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт + Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы); +КонецФункции + +// Удалить тему форума +// Удаляет тему форума +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// IDТемы - Строка,Число - ID темы - topic +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт + Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы); +КонецФункции + +// Скрыть главную тему форума +// Скрывает главную тему форума +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт + Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина); +КонецФункции + +// Показать главную тему форума +// Показывает ранее скрытую главную тему форума +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт + Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь); +КонецФункции + +// Изменить имя главной темы форума +// Изменяет имя главной темы форума +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// Заголовок - Строка - Новое имя главной темы - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("name" , Заголовок, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Очистить список закрепленных сообщений темы +// Очищает список закрепленных сообщений в теме форума +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// IDТемы - Строка,Число - ID темы. Главная, если не заполнено - topic +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры); + + Если ЗначениеЗаполнено(IDТемы) Тогда + Метод = "/unpinAllForumTopicMessages"; + Иначе + Метод = "/unpinAllGeneralForumTopicMessages"; + КонецЕсли; + + URL = "api.telegram.org/bot" + Токен + Метод; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура, Знач Разметка) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид); + + Расширение = ""; + Метод = ""; + + ОпределитьМетодОтправки(Вид, Метод, Расширение); + ПреобразоватьДанныеФайла(Файл, Расширение, Вид); + OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры); + OPI_Инструменты.ДобавитьПоле("caption" , Текст , "Строка" , Параметры); + OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); + + ДобавитьИдентификаторЧата(IDЧата, Параметры); + + СтруктураФайлов = Новый Структура; + СтруктураФайлов.Вставить(Вид + Расширение, Файл); + + URL = "api.telegram.org/bot" + Токен + Метод; + Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed"); + + Возврат Ответ; + +КонецФункции + +Функция УправлениеТемойФорума(Знач Токен + , Знач IDЧата + , Знач Заголовок = Неопределено + , Знач IDИконки = Неопределено + , Знач IDТемы = "") + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("name" , Заголовок, Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("icon_custom_emoji_id", IDИконки , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("message_thread_id" , IDТемы , Строка_, Параметры); + + Если ЗначениеЗаполнено(IDТемы) Тогда + Метод = "/editForumTopic"; + Иначе + Метод = "/createForumTopic"; + КонецЕсли; + + OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры); + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры); + + Возврат Ответ; + +КонецФункции + +Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач Статус, Знач IDТемы = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Если ЗначениеЗаполнено(IDТемы) Тогда + Форум = "Forum"; + Иначе + Форум = "GeneralForum"; + КонецЕсли; + + Метод = ОпределитьМетодУправленияФорумом(Статус, Форум); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры); + + URL = "api.telegram.org/bot" + Токен + Метод; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть); + + Если Скрыть Тогда + Метод = "/hideGeneralForumTopic"; + Иначе + Метод = "/unhideGeneralForumTopic"; + КонецЕсли; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата, "Строка", Параметры); + + URL = "api.telegram.org/bot" + Токен + Метод; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +Функция ОпределитьМетодУправленияФорумом(Знач Статус, Знач Форум) + + Открыть = 1; + Закрыть = 2; + Удалить = 3; + + Если Статус = Открыть Тогда + Метод = "/reopen" + Форум + "Topic"; + ИначеЕсли Статус = Закрыть Тогда + Метод = "/close" + Форум + "Topic"; + ИначеЕсли Статус = Удалить Тогда + Метод = "/deleteForumTopic"; + Иначе + ВызватьИсключение "Некорректный статус управления форумом"; + КонецЕсли; + + Возврат Метод; + +КонецФункции + +Функция СоздатьВысокуюКлавиатуру(Знач МассивКнопок) + + Строки = Новый Массив; + + Для Каждого Кнопка Из МассивКнопок Цикл + Кнопки = Новый Массив; + Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); + Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); + Строки.Добавить(Кнопки); + КонецЦикла; + + Возврат Строки; + +КонецФункции + +Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок) + + Строки = Новый Массив; + Кнопки = Новый Массив; + + Для Каждого Кнопка Из МассивКнопок Цикл + Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); + Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); + КонецЦикла; + + Строки.Добавить(Кнопки); + + Возврат Строки; + +КонецФункции + +Процедура СформироватьМассивМедиа(Знач СоответствиеФайлов, Знач Текст, СтруктураФайлов, Медиа) + + Счетчик = 0; + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + + Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда + ВызватьИсключение("Не удалось получить информацию из json медиа!"); + Возврат; + КонецЕсли; + + Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл + + Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда + + Двоичные = ТекущийФайл.Ключ; + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Двоичные); + + ЭтотФайл = Новый Файл(ТекущийФайл.Ключ); + ИмяМедиа = ТекущийФайл.Значение + + Строка(Счетчик) + + ?(ТекущийФайл.Значение = "document", ЭтотФайл.Расширение, ""); + + ПолноеИмяМедиа = СтрЗаменить(ИмяМедиа, ".", "___"); + + Иначе + Двоичные = ТекущийФайл.Ключ; + ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик); + ПолноеИмяМедиа = ИмяМедиа; + КонецЕсли; + + СтруктураФайлов.Вставить(ПолноеИмяМедиа, Двоичные); + + СтруктураМедиа = Новый Структура; + СтруктураМедиа.Вставить("type" , ТекущийФайл.Значение); + СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа); + + Если Счетчик = 0 Тогда + СтруктураМедиа.Вставить("caption", Текст); + КонецЕсли; + + Медиа.Добавить(СтруктураМедиа); + + Счетчик = Счетчик + 1; + + КонецЦикла; + + Медиа = OPI_Инструменты.JSONСтрокой(Медиа); + +КонецПроцедуры + +Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры) + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + МассивЧата = СтрРазделить(IDЧата, "*", Ложь); + + Если МассивЧата.Количество() > 1 Тогда + + IDЧата = МассивЧата[0]; + IDТемы = МассивЧата[1]; + + Параметры.Вставить("message_thread_id", IDТемы); + + КонецЕсли; + + Параметры.Вставить("chat_id", IDЧата); + +КонецПроцедуры + +Процедура ОпределитьМетодОтправки(Знач Вид, Метод, Расширение) + + Если Вид = "photo" Тогда + Метод = "/sendPhoto"; + ИначеЕсли Вид = "video" Тогда + Метод = "/sendVideo"; + ИначеЕсли Вид = "audio" Тогда + Метод = "/sendAudio"; + ИначеЕсли Вид = "document" Тогда + Метод = "/sendDocument"; + ИначеЕсли Вид = "animation" Тогда + Метод = "/sendAnimation"; + Расширение = ".gif"; + Иначе + ВызватьИсключение "Некорректный вид отправки"; + КонецЕсли; + +КонецПроцедуры + +Процедура ПреобразоватьДанныеФайла(Файл, Расширение, Вид) + + Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда + + ТекущийФайл = Новый Файл(Файл); + Расширение = ?(Вид = "document", ТекущийФайл.Расширение, Расширение); + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + + КонецЕсли; + + Расширение = СтрЗаменить(Расширение, ".", "___"); + +КонецПроцедуры + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_Twitter.os b/ru/OInt/core/Modules/OPI_Twitter.os index 21cd27e345..0e52e5651e 100644 --- a/ru/OInt/core/Modules/OPI_Twitter.os +++ b/ru/OInt/core/Modules/OPI_Twitter.os @@ -1,682 +1,682 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Twitter.os -// Библиотека: Twitter -// Команда CLI: twitter - -// MIT License - -// Copyright (c) 2023 Anton Tsitavets - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -// https://github.com/Bayselonarrend/OpenIntegrations -// Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры() -// и почитать комментарии - -// BSLLS:Typo-off -// BSLLS:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:NumberOfOptionalParams-off -// BSLLS:UsingServiceTag-off - -//@skip-check method-too-many-params - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область ДанныеИНастройка - -// Получить ссылку для авторизации -// Формирует ссылку для авторизации через браузер -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Строка - URL для перехода в браузере -Функция ПолучитьСсылкуАвторизации(Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - ПараметрыURL = Новый Структура; - - ПараметрыURL.Вставить("response_type" , "code"); - ПараметрыURL.Вставить("client_id" , Параметры_["client_id"]); - ПараметрыURL.Вставить("redirect_uri" , Параметры_["redirect_uri"]); - ПараметрыURL.Вставить("scope" , Параметры_["scope"]); - ПараметрыURL.Вставить("state" , "state"); - ПараметрыURL.Вставить("code_challenge" , "challenge"); - ПараметрыURL.Вставить("code_challenge_method", "plain"); - - ПараметрыURL = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); - Линк = "https://twitter.com/i/oauth2/authorize" + ПараметрыURL; - - Возврат Линк; - -КонецФункции - -// Получить токен -// Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации -// -// Параметры: -// Код - Строка - Код, полученный из авторизации См.ПолучитьСсылкуАвторизации - code -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция ПолучитьТокен(Знач Код, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Код); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - ПараметрыЗапроса = Новый Структура; - ПараметрыЗапроса.Вставить("code" , Код); - ПараметрыЗапроса.Вставить("grant_type" , "authorization_code"); - ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]); - ПараметрыЗапроса.Вставить("redirect_uri" , Параметры_["redirect_uri"]); - ПараметрыЗапроса.Вставить("code_verifier", "challenge"); - - Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token" - , ПараметрыЗапроса, , Ложь); - - Возврат Ответ; - -КонецФункции - -// Обновить токен -// Обновляет v2 токен при помощи refresh_token -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция ОбновитьТокен(Знач Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Refresh = "refresh_token"; - - ПараметрыЗапроса = Новый Структура; - ПараметрыЗапроса.Вставить(Refresh , Параметры_[Refresh]); - ПараметрыЗапроса.Вставить("grant_type" , Refresh); - ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]); - - Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token" - , ПараметрыЗапроса, , Ложь); - - Возврат Ответ; - -КонецФункции - -// !NOCLI -// Метод для вставки в http-сервис, адрес которого указывается в redirect_uri -// Вызывает метод получения токена, так как для получения токена из кода, приходящего -// на redirect_uri после авторизации через браузер есть всего 30 секунд -// -// Параметры: -// Запрос - HTTPСервисЗапрос - Запрос, приходящий на http-сервис -// -// Возвращаемое значение: -// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера -Функция ОбработкаВходящегоЗапросаПослеАвторизации(Запрос) Экспорт - - Код = Запрос.ПараметрыЗапроса["code"]; - ОтветТокен = ПолучитьТокен(Код); - - // BSLLS:CommentedCode-off - // Предпочтительное хранение токенов - // Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]); - // Константы.TwitterToken.Установить(ОтветТокен["access_token"]); - // BSLLS:CommentedCode-on - - Возврат ОтветТокен; - -КонецФункции - -#КонецОбласти - -#Область Твиты - -// !NOCLI -// Создать произвольный твит -// -// Параметры: -// Текст - Строка - Текст твита -// МассивМедиа - Массив из Строка,ДвоичныеДанные - Массив двоичных данных или путей к файлам -// МассивВариантовОпроса - Массив из Строка - Массив вариантов опроса, если необходимо -// ДлительностьОпроса - Строка,Число - Длительность опроса, если необходимо (опрос без длительности не создается) -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция СоздатьПроизвольныйТвит(Знач Текст = "" - , Знач МассивМедиа = "" - , Знач МассивВариантовОпроса = "" - , Знач ДлительностьОпроса = "" - , Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ДлительностьОпроса); - - Если ЗначениеЗаполнено(МассивМедиа) Тогда - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивМедиа); - КонецЕсли; - - Если ЗначениеЗаполнено(МассивВариантовОпроса) Тогда - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивВариантовОпроса); - КонецЕсли; - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - URL = "https://api.twitter.com/2/tweets"; - Массив = "Массив"; - Поля = Новый Соответствие; - - Если ЗначениеЗаполнено(Текст) Тогда - Поля.Вставить("text", Текст); - КонецЕсли; - - Если ТипЗнч(МассивВариантовОпроса) = Тип(Массив) И ЗначениеЗаполнено(ДлительностьОпроса) Тогда - - ДлительностьОпроса = Число(ДлительностьОпроса); - - Если МассивВариантовОпроса.Количество() > 0 Тогда - - СтруктураВарианта = Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса); - Поля.Вставить("poll", СтруктураВарианта); - - КонецЕсли; - - КонецЕсли; - - Если ТипЗнч(МассивМедиа) = Тип(Массив) Тогда - Если МассивМедиа.Количество() > 0 Тогда - Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа)); - КонецЕсли; - КонецЕсли; - - Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_); - Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация); - - Возврат Ответ; - -КонецФункции - -// Создать текстовый твит -// Создает твит без вложений -// -// Параметры: -// Текст - Строка - Текст твита - text -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт - Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры); -КонецФункции - -// Создать твит картинки -// Создает твит с картинкой вложением -// -// Параметры: -// Текст - Строка - Текст твита - text -// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив файлов картинок - pictures -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт - - МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры); - Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); - -КонецФункции - -// Создать твит гифки -// Создает твит с вложением-гифкой -// -// Параметры: -// Текст - Строка - Текст твита - text -// МассивГифок - Массив из Строка,ДвоичныеДанные - Массив файлов гифок - gifs -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт - - МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры); - Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); - -КонецФункции - -// Создать твит видео -// Создает твит с видеовложением -// -// Параметры: -// Текст - Строка - Текст твита - text -// МассивВидео - Массив из Строка,ДвоичныеДанные - Массив файлов видео - videos -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт - - МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры); - Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); - -КонецФункции - -// Создать твит опрос -// Создает твит с опросом -// -// Параметры: -// Текст - Строка - Текст твита - text -// МассивВариантов - Массив из Строка - Массив вариантов опроса - options -// Длительность - Строка,Число - Длительность опроса - duration -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт - Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры); -КонецФункции - -// Загрузить массив вложений !NOCLI -// Загружает файлы на сервер и возвращает их ID -// -// Параметры: -// МассивФайлов - Массив из Строка, ДвоичныеДанные - Массив файлов -// ТипВложений - Строка - Тип вложений -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Массив Из Строка - Массив ID медиа -Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ТипВложений); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивФайлов); - - МассивМедиа = Новый Массив; - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - MIS = "media_id_string"; - - Если ЗначениеЗаполнено(МассивФайлов) Тогда - - Для Каждого ФайлОтправки Из МассивФайлов Цикл - - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ФайлОтправки); - - Ответ = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_); - IDМедиа = Ответ[MIS]; - - Если Не ЗначениеЗаполнено(IDМедиа) Тогда - Возврат Ответ; - КонецЕсли; - - МассивМедиа.Добавить(IDМедиа); - - КонецЦикла; - - КонецЕсли; - - Возврат МассивМедиа; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры) - - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); - - ВидЗапроса = "POST"; - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - URL = "https://upload.twitter.com/1.1/media/upload.json"; - - Если Тип = "tweet_image" Тогда - - Поля = Новый Структура; - Поля.Вставить("media_data" , Base64Строка(Файл)); - Поля.Вставить("media_category", Тип); - - Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL); - Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); - - Иначе - - Ответ = ЗагрузитьМедиаЧастями(Файл, Тип, ВидЗапроса, URL, Параметры_); - - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ЗагрузитьМедиаЧастями(Знач Файл, Знач Тип, Знач ВидЗапроса, Знач URL, Параметры) - - Единица = 1024; - Количество = 4; - MediaKey = "media_key"; - MIS = "media_id_string"; - Command = "command"; - Размер = Файл.Размер(); - - СоответствиеMIME = Новый Соответствие; - СоответствиеMIME.Вставить("tweet_image", "image/jpeg"); - СоответствиеMIME.Вставить("tweet_video", "video/mp4"); - СоответствиеMIME.Вставить("tweet_gif" , "image/gif"); - - РазмерЧасти = Количество * Единица * Единица; - МассивЧтения = РазделитьДвоичныеДанные(Файл, РазмерЧасти); - - Поля = Новый Структура; - Поля.Вставить(Command , "INIT"); - Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер)); - Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип)); - Поля.Вставить("media_category" , Тип); - - Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, ВидЗапроса, URL); - - ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); - KeyИнициализации = ОтветИнициализации[MediaKey]; - IDИнициализации = ОтветИнициализации[MIS]; - - Если Не ЗначениеЗаполнено(KeyИнициализации) Или Не ЗначениеЗаполнено(IDИнициализации) Тогда - Возврат ОтветИнициализации; - КонецЕсли; - - Счетчик = 0; - - Для Каждого Часть Из МассивЧтения Цикл - - Поля = Новый Структура; - Поля.Вставить(Command , "APPEND"); - Поля.Вставить("media_key" , KeyИнициализации); - Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик)); - Поля.Вставить("media" , Часть); - - Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Новый Структура, ВидЗапроса, URL); - - OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация); - - Счетчик = Счетчик + 1; - - КонецЦикла; - - Поля = Новый Структура; - Поля.Вставить(Command , "FINALIZE"); - Поля.Вставить("media_id", IDИнициализации); - - СтатусОбработки = ПолучитьСтатусОбработки(Параметры, Поля, URL); - - Если Не ТипЗнч(СтатусОбработки) = Тип("Строка") Тогда - Возврат СтатусОбработки; - КонецЕсли; - - Ответ = ОжидатьЗавершенияОбработки(СтатусОбработки, IDИнициализации, URL, Параметры); - - Возврат Ответ; - -КонецФункции - -Функция ОжидатьЗавершенияОбработки(Знач СтатусОбработки, Знач IDИнициализации, Знач URL, Знач Параметры) - - ProcessingInfo = "processing_info"; - Command = "command"; - Поля = Новый Структура; - - Поля.Вставить(Command , "STATUS"); - Поля.Вставить("media_id", IDИнициализации); - - Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл - - Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "GET", URL); - Ответ = OPI_Инструменты.Get(URL, Поля, Авторизация); - Информация = Ответ[ProcessingInfo]; - - Если Не ЗначениеЗаполнено(Информация) Тогда - Возврат Ответ; - КонецЕсли; - - СтатусОбработки = Информация["state"]; - - Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда - Возврат Ответ; - КонецЕсли; - - КонецЦикла; - - Если СтатусОбработки = "failed" Тогда - ВызватьИсключение "Твиттер не смог обработать загруженное вами видео"; - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ПолучитьСтандартныеПараметры(Знач Параметры = "") - - // Здесь собрано определение данных, необходимых для работы. - // Для Twitter это довольно значительный набор, что обсуловлено наличием сразу 2-х API, - // которые, при этом, созданы не для разныз задач, но просто являются версиями друг друга. - // Актуальной версией API является v2 и она требует получения временных токенов. Несмотря на то, - // что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести - // механизм загрузки файлов и некоторые другие из старой версии - v1.1. Поэтому что-то нужно делать - // на версии 1.1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1.1, - // но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные - - // Мировая гигокорпорация Илона Маска, кстати, напоминаю ;) - - // P.S Далее часто упоминается "страница настроек Twitter Developer" - это - // https://developer.twitter.com/en/portal/dashboard и выбор конкретного проекта из списка (значек c ключем) - - Параметры_ = Новый Соответствие; - Разрешения = "tweet.read tweet.write tweet.moderate.write users.read " - + "follows.read follows.write offline.access space.read mute.read " - + "mute.write like.read like.write list.read list.write block.read " - + "block.write bookmark.read bookmark.write"; - - // Данные для API v2 - - // redirect_uri - URL вашего http-сервиса (или другого обработчика запросов) для авторизации - // scope - набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен - // client_id - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer - // client_secret - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer - // access_token - ПолучитьСсылкуАвторизации() -> Браузер -> code придет на redirect_uri -> ПолучитьТокен(code) - // refresh_token - Приходит вместе с access_token и используется для его обновления (время жизни access_token - 2 ч) - // Обновление происходит методом ОбновитьТокен с новыми access_token и refresh_token. - // При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить - // не получится (access_token тоже не получится) - - // |--> ОбновитьТокен() ->|access_token --> Используется в т-нии 2-х часов для запросов - // | |refresh_token --| - // |--------[через 2 ч.]-------------------| - - // Данные для API v1.1 - - // oauth_token - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer - // oauth_token_secret - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer - // oauth_consumer_key - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer - // oauth_consumer_secret - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer - - // Эти токены обновлять не надо - - Параметры_.Вставить("redirect_uri" , ""); - Параметры_.Вставить("scope" , Разрешения); - Параметры_.Вставить("client_id" , ""); - Параметры_.Вставить("client_secret" , ""); - Параметры_.Вставить("access_token" , ""); // Должно быть нечто вроде Константы.TwitterToken.Получить() - Параметры_.Вставить("refresh_token" , ""); // Должно быть нечто вроде Константы.TwitterRefresh.Получить() - Параметры_.Вставить("oauth_token" , ""); - Параметры_.Вставить("oauth_token_secret" , ""); - Параметры_.Вставить("oauth_consumer_key" , ""); - Параметры_.Вставить("oauth_consumer_secret", ""); - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры); - - Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда - Для Каждого ПереданныйПараметр Из Параметры Цикл - Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение)); - КонецЦикла; - КонецЕсли; - - Возврат Параметры_; - -КонецФункции - -Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL) - - ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); - ЗаголовокАвторизации = ""; - МетодХэширования = "HMAC-SHA1"; - ВерсияАпи = "1.0"; - СтрокаСигнатуры = ""; - Подпись = ""; - OCK = "oauth_consumer_key"; - OTK = "oauth_token"; - ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДата); - ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX); - ТаблицаПараметров = Новый ТаблицаЗначений; - ТаблицаПараметров.Колонки.Добавить("Ключ"); - ТаблицаПараметров.Колонки.Добавить("Значение"); - - Для Каждого Поле Из Поля Цикл - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = Поле.Ключ; - НоваяСтрока.Значение = Поле.Значение; - - КонецЦикла; - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = OCK; - НоваяСтрока.Значение = Параметры[OCK]; - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = OTK; - НоваяСтрока.Значение = Параметры[OTK]; - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = "oauth_version"; - НоваяСтрока.Значение = ВерсияАпи; - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = "oauth_signature_method"; - НоваяСтрока.Значение = МетодХэширования; - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = "oauth_timestamp"; - НоваяСтрока.Значение = ТекущаяДатаUNIX; - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = "oauth_nonce"; - НоваяСтрока.Значение = ТекущаяДатаUNIX; - - Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл - - СтрокаТаблицы.Ключ = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL); - СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL); - - КонецЦикла; - - ТаблицаПараметров.Сортировать("Ключ"); - - Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл - - СтрокаСигнатуры = СтрокаСигнатуры - + СтрокаТаблицы.Ключ - + "=" - + СтрокаТаблицы.Значение - + "&"; - - КонецЦикла; - - СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1); - СтрокаСигнатуры = вРег(ВидЗапроса) - + "&" - + КодироватьСтроку(URL, СпособКодированияСтроки.КодировкаURL) - + "&" - + КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL); - - Подпись = КодироватьСтроку(Параметры["oauth_consumer_secret"], СпособКодированияСтроки.КодировкаURL) - + "&" - + КодироватьСтроку(Параметры["oauth_token_secret"], СпособКодированияСтроки.КодировкаURL); - - Сигнатура = OPI_Криптография.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Подпись) - , ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры) - , ХешФункция.SHA1 - , 64); - - Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL); - - Разделитель = ""","; - ЗаголовокАвторизации = ЗаголовокАвторизации - + "OAuth " - + "oauth_consumer_key=""" + Параметры[OCK] + Разделитель - + "oauth_token=""" + Параметры[OTK] + Разделитель - + "oauth_signature_method=""" + МетодХэширования + Разделитель - + "oauth_timestamp=""" + ТекущаяДатаUNIX + Разделитель - + "oauth_nonce=""" + ТекущаяДатаUNIX + Разделитель - + "oauth_version=""" + ВерсияАпи + Разделитель - + "oauth_signature=""" + Сигнатура; - - СоответствиеЗаголовка = Новый Соответствие; - СоответствиеЗаголовка.Вставить("authorization", ЗаголовокАвторизации); - - Возврат СоответствиеЗаголовка; - -КонецФункции - -Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры) - - СоответствиеВозврата = Новый Соответствие; - СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]); - - Возврат СоответствиеВозврата; - -КонецФункции - -Функция ПолучитьСтатусОбработки(Знач Параметры, Знач Поля, Знач URL) - - ProcessingInfo = "processing_info"; - Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "POST", URL); - - Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); - Информация = Ответ[ProcessingInfo]; - - Если Не ЗначениеЗаполнено(Информация) Тогда - Возврат Ответ; - КонецЕсли; - - СтатусОбработки = Информация["state"]; - - Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда - Возврат Ответ; - Иначе - Возврат СтатусОбработки; - КонецЕсли; - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Twitter.os +// Библиотека: Twitter +// Команда CLI: twitter + +// MIT License + +// Copyright (c) 2023 Anton Tsitavets + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +// https://github.com/Bayselonarrend/OpenIntegrations +// Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры() +// и почитать комментарии + +// BSLLS:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off + +//@skip-check method-too-many-params + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область ДанныеИНастройка + +// Получить ссылку для авторизации +// Формирует ссылку для авторизации через браузер +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Строка - URL для перехода в браузере +Функция ПолучитьСсылкуАвторизации(Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + ПараметрыURL = Новый Структура; + + ПараметрыURL.Вставить("response_type" , "code"); + ПараметрыURL.Вставить("client_id" , Параметры_["client_id"]); + ПараметрыURL.Вставить("redirect_uri" , Параметры_["redirect_uri"]); + ПараметрыURL.Вставить("scope" , Параметры_["scope"]); + ПараметрыURL.Вставить("state" , "state"); + ПараметрыURL.Вставить("code_challenge" , "challenge"); + ПараметрыURL.Вставить("code_challenge_method", "plain"); + + ПараметрыURL = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); + Линк = "https://twitter.com/i/oauth2/authorize" + ПараметрыURL; + + Возврат Линк; + +КонецФункции + +// Получить токен +// Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации +// +// Параметры: +// Код - Строка - Код, полученный из авторизации См.ПолучитьСсылкуАвторизации - code +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция ПолучитьТокен(Знач Код, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Код); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("code" , Код); + ПараметрыЗапроса.Вставить("grant_type" , "authorization_code"); + ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]); + ПараметрыЗапроса.Вставить("redirect_uri" , Параметры_["redirect_uri"]); + ПараметрыЗапроса.Вставить("code_verifier", "challenge"); + + Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token" + , ПараметрыЗапроса, , Ложь); + + Возврат Ответ; + +КонецФункции + +// Обновить токен +// Обновляет v2 токен при помощи refresh_token +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция ОбновитьТокен(Знач Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Refresh = "refresh_token"; + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить(Refresh , Параметры_[Refresh]); + ПараметрыЗапроса.Вставить("grant_type" , Refresh); + ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]); + + Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token" + , ПараметрыЗапроса, , Ложь); + + Возврат Ответ; + +КонецФункции + +// !NOCLI +// Метод для вставки в http-сервис, адрес которого указывается в redirect_uri +// Вызывает метод получения токена, так как для получения токена из кода, приходящего +// на redirect_uri после авторизации через браузер есть всего 30 секунд +// +// Параметры: +// Запрос - HTTPСервисЗапрос - Запрос, приходящий на http-сервис +// +// Возвращаемое значение: +// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера +Функция ОбработкаВходящегоЗапросаПослеАвторизации(Запрос) Экспорт + + Код = Запрос.ПараметрыЗапроса["code"]; + ОтветТокен = ПолучитьТокен(Код); + + // BSLLS:CommentedCode-off + // Предпочтительное хранение токенов + // Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]); + // Константы.TwitterToken.Установить(ОтветТокен["access_token"]); + // BSLLS:CommentedCode-on + + Возврат ОтветТокен; + +КонецФункции + +#КонецОбласти + +#Область Твиты + +// !NOCLI +// Создать произвольный твит +// +// Параметры: +// Текст - Строка - Текст твита +// МассивМедиа - Массив из Строка,ДвоичныеДанные - Массив двоичных данных или путей к файлам +// МассивВариантовОпроса - Массив из Строка - Массив вариантов опроса, если необходимо +// ДлительностьОпроса - Строка,Число - Длительность опроса, если необходимо (опрос без длительности не создается) +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция СоздатьПроизвольныйТвит(Знач Текст = "" + , Знач МассивМедиа = "" + , Знач МассивВариантовОпроса = "" + , Знач ДлительностьОпроса = "" + , Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ДлительностьОпроса); + + Если ЗначениеЗаполнено(МассивМедиа) Тогда + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивМедиа); + КонецЕсли; + + Если ЗначениеЗаполнено(МассивВариантовОпроса) Тогда + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивВариантовОпроса); + КонецЕсли; + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + URL = "https://api.twitter.com/2/tweets"; + Массив = "Массив"; + Поля = Новый Соответствие; + + Если ЗначениеЗаполнено(Текст) Тогда + Поля.Вставить("text", Текст); + КонецЕсли; + + Если ТипЗнч(МассивВариантовОпроса) = Тип(Массив) И ЗначениеЗаполнено(ДлительностьОпроса) Тогда + + ДлительностьОпроса = Число(ДлительностьОпроса); + + Если МассивВариантовОпроса.Количество() > 0 Тогда + + СтруктураВарианта = Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса); + Поля.Вставить("poll", СтруктураВарианта); + + КонецЕсли; + + КонецЕсли; + + Если ТипЗнч(МассивМедиа) = Тип(Массив) Тогда + Если МассивМедиа.Количество() > 0 Тогда + Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа)); + КонецЕсли; + КонецЕсли; + + Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_); + Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация); + + Возврат Ответ; + +КонецФункции + +// Создать текстовый твит +// Создает твит без вложений +// +// Параметры: +// Текст - Строка - Текст твита - text +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт + Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры); +КонецФункции + +// Создать твит картинки +// Создает твит с картинкой вложением +// +// Параметры: +// Текст - Строка - Текст твита - text +// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив файлов картинок - pictures +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт + + МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры); + Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); + +КонецФункции + +// Создать твит гифки +// Создает твит с вложением-гифкой +// +// Параметры: +// Текст - Строка - Текст твита - text +// МассивГифок - Массив из Строка,ДвоичныеДанные - Массив файлов гифок - gifs +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт + + МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры); + Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); + +КонецФункции + +// Создать твит видео +// Создает твит с видеовложением +// +// Параметры: +// Текст - Строка - Текст твита - text +// МассивВидео - Массив из Строка,ДвоичныеДанные - Массив файлов видео - videos +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт + + МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры); + Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); + +КонецФункции + +// Создать твит опрос +// Создает твит с опросом +// +// Параметры: +// Текст - Строка - Текст твита - text +// МассивВариантов - Массив из Строка - Массив вариантов опроса - options +// Длительность - Строка,Число - Длительность опроса - duration +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт + Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры); +КонецФункции + +// Загрузить массив вложений !NOCLI +// Загружает файлы на сервер и возвращает их ID +// +// Параметры: +// МассивФайлов - Массив из Строка, ДвоичныеДанные - Массив файлов +// ТипВложений - Строка - Тип вложений +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Массив Из Строка - Массив ID медиа +Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ТипВложений); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивФайлов); + + МассивМедиа = Новый Массив; + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + MIS = "media_id_string"; + + Если ЗначениеЗаполнено(МассивФайлов) Тогда + + Для Каждого ФайлОтправки Из МассивФайлов Цикл + + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ФайлОтправки); + + Ответ = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_); + IDМедиа = Ответ[MIS]; + + Если Не ЗначениеЗаполнено(IDМедиа) Тогда + Возврат Ответ; + КонецЕсли; + + МассивМедиа.Добавить(IDМедиа); + + КонецЦикла; + + КонецЕсли; + + Возврат МассивМедиа; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры) + + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + + ВидЗапроса = "POST"; + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + URL = "https://upload.twitter.com/1.1/media/upload.json"; + + Если Тип = "tweet_image" Тогда + + Поля = Новый Структура; + Поля.Вставить("media_data" , Base64Строка(Файл)); + Поля.Вставить("media_category", Тип); + + Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL); + Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); + + Иначе + + Ответ = ЗагрузитьМедиаЧастями(Файл, Тип, ВидЗапроса, URL, Параметры_); + + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ЗагрузитьМедиаЧастями(Знач Файл, Знач Тип, Знач ВидЗапроса, Знач URL, Параметры) + + Единица = 1024; + Количество = 4; + MediaKey = "media_key"; + MIS = "media_id_string"; + Command = "command"; + Размер = Файл.Размер(); + + СоответствиеMIME = Новый Соответствие; + СоответствиеMIME.Вставить("tweet_image", "image/jpeg"); + СоответствиеMIME.Вставить("tweet_video", "video/mp4"); + СоответствиеMIME.Вставить("tweet_gif" , "image/gif"); + + РазмерЧасти = Количество * Единица * Единица; + МассивЧтения = РазделитьДвоичныеДанные(Файл, РазмерЧасти); + + Поля = Новый Структура; + Поля.Вставить(Command , "INIT"); + Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер)); + Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип)); + Поля.Вставить("media_category" , Тип); + + Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, ВидЗапроса, URL); + + ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); + KeyИнициализации = ОтветИнициализации[MediaKey]; + IDИнициализации = ОтветИнициализации[MIS]; + + Если Не ЗначениеЗаполнено(KeyИнициализации) Или Не ЗначениеЗаполнено(IDИнициализации) Тогда + Возврат ОтветИнициализации; + КонецЕсли; + + Счетчик = 0; + + Для Каждого Часть Из МассивЧтения Цикл + + Поля = Новый Структура; + Поля.Вставить(Command , "APPEND"); + Поля.Вставить("media_key" , KeyИнициализации); + Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик)); + Поля.Вставить("media" , Часть); + + Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Новый Структура, ВидЗапроса, URL); + + OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация); + + Счетчик = Счетчик + 1; + + КонецЦикла; + + Поля = Новый Структура; + Поля.Вставить(Command , "FINALIZE"); + Поля.Вставить("media_id", IDИнициализации); + + СтатусОбработки = ПолучитьСтатусОбработки(Параметры, Поля, URL); + + Если Не ТипЗнч(СтатусОбработки) = Тип("Строка") Тогда + Возврат СтатусОбработки; + КонецЕсли; + + Ответ = ОжидатьЗавершенияОбработки(СтатусОбработки, IDИнициализации, URL, Параметры); + + Возврат Ответ; + +КонецФункции + +Функция ОжидатьЗавершенияОбработки(Знач СтатусОбработки, Знач IDИнициализации, Знач URL, Знач Параметры) + + ProcessingInfo = "processing_info"; + Command = "command"; + Поля = Новый Структура; + + Поля.Вставить(Command , "STATUS"); + Поля.Вставить("media_id", IDИнициализации); + + Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл + + Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "GET", URL); + Ответ = OPI_Инструменты.Get(URL, Поля, Авторизация); + Информация = Ответ[ProcessingInfo]; + + Если Не ЗначениеЗаполнено(Информация) Тогда + Возврат Ответ; + КонецЕсли; + + СтатусОбработки = Информация["state"]; + + Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда + Возврат Ответ; + КонецЕсли; + + КонецЦикла; + + Если СтатусОбработки = "failed" Тогда + ВызватьИсключение "Твиттер не смог обработать загруженное вами видео"; + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ПолучитьСтандартныеПараметры(Знач Параметры = "") + + // Здесь собрано определение данных, необходимых для работы. + // Для Twitter это довольно значительный набор, что обсуловлено наличием сразу 2-х API, + // которые, при этом, созданы не для разныз задач, но просто являются версиями друг друга. + // Актуальной версией API является v2 и она требует получения временных токенов. Несмотря на то, + // что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести + // механизм загрузки файлов и некоторые другие из старой версии - v1.1. Поэтому что-то нужно делать + // на версии 1.1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1.1, + // но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные + + // Мировая гигокорпорация Илона Маска, кстати, напоминаю ;) + + // P.S Далее часто упоминается "страница настроек Twitter Developer" - это + // https://developer.twitter.com/en/portal/dashboard и выбор конкретного проекта из списка (значек c ключем) + + Параметры_ = Новый Соответствие; + Разрешения = "tweet.read tweet.write tweet.moderate.write users.read " + + "follows.read follows.write offline.access space.read mute.read " + + "mute.write like.read like.write list.read list.write block.read " + + "block.write bookmark.read bookmark.write"; + + // Данные для API v2 + + // redirect_uri - URL вашего http-сервиса (или другого обработчика запросов) для авторизации + // scope - набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен + // client_id - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer + // client_secret - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer + // access_token - ПолучитьСсылкуАвторизации() -> Браузер -> code придет на redirect_uri -> ПолучитьТокен(code) + // refresh_token - Приходит вместе с access_token и используется для его обновления (время жизни access_token - 2 ч) + // Обновление происходит методом ОбновитьТокен с новыми access_token и refresh_token. + // При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить + // не получится (access_token тоже не получится) + + // |--> ОбновитьТокен() ->|access_token --> Используется в т-нии 2-х часов для запросов + // | |refresh_token --| + // |--------[через 2 ч.]-------------------| + + // Данные для API v1.1 + + // oauth_token - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer + // oauth_token_secret - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer + // oauth_consumer_key - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer + // oauth_consumer_secret - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer + + // Эти токены обновлять не надо + + Параметры_.Вставить("redirect_uri" , ""); + Параметры_.Вставить("scope" , Разрешения); + Параметры_.Вставить("client_id" , ""); + Параметры_.Вставить("client_secret" , ""); + Параметры_.Вставить("access_token" , ""); // Должно быть нечто вроде Константы.TwitterToken.Получить() + Параметры_.Вставить("refresh_token" , ""); // Должно быть нечто вроде Константы.TwitterRefresh.Получить() + Параметры_.Вставить("oauth_token" , ""); + Параметры_.Вставить("oauth_token_secret" , ""); + Параметры_.Вставить("oauth_consumer_key" , ""); + Параметры_.Вставить("oauth_consumer_secret", ""); + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры); + + Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда + Для Каждого ПереданныйПараметр Из Параметры Цикл + Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение)); + КонецЦикла; + КонецЕсли; + + Возврат Параметры_; + +КонецФункции + +Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL) + + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + ЗаголовокАвторизации = ""; + МетодХэширования = "HMAC-SHA1"; + ВерсияАпи = "1.0"; + СтрокаСигнатуры = ""; + Подпись = ""; + OCK = "oauth_consumer_key"; + OTK = "oauth_token"; + ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДата); + ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX); + ТаблицаПараметров = Новый ТаблицаЗначений; + ТаблицаПараметров.Колонки.Добавить("Ключ"); + ТаблицаПараметров.Колонки.Добавить("Значение"); + + Для Каждого Поле Из Поля Цикл + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = Поле.Ключ; + НоваяСтрока.Значение = Поле.Значение; + + КонецЦикла; + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = OCK; + НоваяСтрока.Значение = Параметры[OCK]; + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = OTK; + НоваяСтрока.Значение = Параметры[OTK]; + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = "oauth_version"; + НоваяСтрока.Значение = ВерсияАпи; + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = "oauth_signature_method"; + НоваяСтрока.Значение = МетодХэширования; + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = "oauth_timestamp"; + НоваяСтрока.Значение = ТекущаяДатаUNIX; + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = "oauth_nonce"; + НоваяСтрока.Значение = ТекущаяДатаUNIX; + + Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл + + СтрокаТаблицы.Ключ = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL); + СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL); + + КонецЦикла; + + ТаблицаПараметров.Сортировать("Ключ"); + + Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл + + СтрокаСигнатуры = СтрокаСигнатуры + + СтрокаТаблицы.Ключ + + "=" + + СтрокаТаблицы.Значение + + "&"; + + КонецЦикла; + + СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1); + СтрокаСигнатуры = вРег(ВидЗапроса) + + "&" + + КодироватьСтроку(URL, СпособКодированияСтроки.КодировкаURL) + + "&" + + КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL); + + Подпись = КодироватьСтроку(Параметры["oauth_consumer_secret"], СпособКодированияСтроки.КодировкаURL) + + "&" + + КодироватьСтроку(Параметры["oauth_token_secret"], СпособКодированияСтроки.КодировкаURL); + + Сигнатура = OPI_Криптография.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Подпись) + , ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры) + , ХешФункция.SHA1 + , 64); + + Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL); + + Разделитель = ""","; + ЗаголовокАвторизации = ЗаголовокАвторизации + + "OAuth " + + "oauth_consumer_key=""" + Параметры[OCK] + Разделитель + + "oauth_token=""" + Параметры[OTK] + Разделитель + + "oauth_signature_method=""" + МетодХэширования + Разделитель + + "oauth_timestamp=""" + ТекущаяДатаUNIX + Разделитель + + "oauth_nonce=""" + ТекущаяДатаUNIX + Разделитель + + "oauth_version=""" + ВерсияАпи + Разделитель + + "oauth_signature=""" + Сигнатура; + + СоответствиеЗаголовка = Новый Соответствие; + СоответствиеЗаголовка.Вставить("authorization", ЗаголовокАвторизации); + + Возврат СоответствиеЗаголовка; + +КонецФункции + +Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры) + + СоответствиеВозврата = Новый Соответствие; + СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]); + + Возврат СоответствиеВозврата; + +КонецФункции + +Функция ПолучитьСтатусОбработки(Знач Параметры, Знач Поля, Знач URL) + + ProcessingInfo = "processing_info"; + Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "POST", URL); + + Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); + Информация = Ответ[ProcessingInfo]; + + Если Не ЗначениеЗаполнено(Информация) Тогда + Возврат Ответ; + КонецЕсли; + + СтатусОбработки = Информация["state"]; + + Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда + Возврат Ответ; + Иначе + Возврат СтатусОбработки; + КонецЕсли; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_VK.os b/ru/OInt/core/Modules/OPI_VK.os index 067ed51ce6..deab0f9880 100644 --- a/ru/OInt/core/Modules/OPI_VK.os +++ b/ru/OInt/core/Modules/OPI_VK.os @@ -1,2190 +1,2190 @@ -// Расположение OS: ./OInt/core/Modules/OPI_VK.os -// Библиотека: VK -// Команда CLI: vk - -// 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:NumberOfOptionalParams-off -// BSLLS:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:NumberOfOptionalParams-off -// BSLLS:UsingServiceTag-off -// BSLLS:UnusedLocalVariable-off - -//@skip-check method-too-many-params -//@skip-check wrong-string-literal-content - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область ПолучениеТокена - -// Создать ссылку получения токена -// Получение ссылки для интерактивного получения токена (access_token), который необходим -// для дальнейших действий -// -// Параметры: -// app_id - Строка,Число - app_id из настроек приложения - app -// -// Возвращаемое значение: -// Строка - URL, по которому необходимо перейти в браузере -Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(App_id); - - // access_token нужно будет забрать из параметра в строке адреса браузера - Возврат "https://oauth.vk.com/authorize?client_id=" + App_id - + "&scope=offline,wall,groups,photos,stats,stories,ads,market,video" - + "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html"; - -КонецФункции - -#КонецОбласти - -#Область РаботаСГруппой - -// Создать пост -// Создает пост с картинками -// -// Параметры: -// Текст - Строка - Текст поста - text -// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив картинок - pictures -// Реклама - Булево - Признак ""Это реклама"" - ad -// СсылкаПодЗаписью - Строка - Ссылка (URL) под записью - url -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьПост(Знач Текст - , Знач МассивКартинок - , Знач Реклама = Ложь - , Знач СсылкаПодЗаписью = "" - , Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКартинок); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - МассивВложений = Новый Массив; - - Для Каждого КартинкаПоста Из МассивКартинок Цикл - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - ОтветСоответствие = ПолучитьСоответствиеКартинки(КартинкаПоста, Параметры_, "Пост"); - - OwnerId = ОтветСоответствие.Получить("owner_id"); - ObjectId = ОтветСоответствие.Получить("id"); - - Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда - Возврат ОтветСоответствие; - КонецЕсли; - - OwnerId = OPI_Инструменты.ЧислоВСтроку(OwnerId); - ObjectId = OPI_Инструменты.ЧислоВСтроку(ObjectId); - - ФотоID = "photo" + OwnerId + "_" + ObjectId; - - МассивВложений.Добавить(ФотоID); - - КонецЦикла; - - Ответ = СоздатьСоставнойПост(Текст, МассивВложений, Реклама, СсылкаПодЗаписью, Параметры); - - Возврат Ответ; - -КонецФункции - -// Создать составной пост -// Создает пост на основе массива идетификаторов объектов (картинок, видео и др.) -// -// Параметры: -// Текст - Строка - Текст поста - text -// Объекты - Массив из Строка - Массив идентификаторов вида photo123_123 - objects -// Реклама - Булево - Признак ""Это реклама"" - ad -// СсылкаПодЗаписью - Строка - Ссылка (URL) под записью - url -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьСоставнойПост(Знач Текст - , Знач Объекты - , Знач Реклама = Ложь - , Знач СсылкаПодЗаписью = "" - , Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - OPI_ПреобразованиеТипов.ПолучитьСтроку(СсылкаПодЗаписью); - OPI_ПреобразованиеТипов.ПолучитьБулево(Реклама); - - Параметры = ПолучитьСтандартныеПараметры(Параметры); - СтрокаВложений = СтрСоединить(Объекты, ","); - СтрокаВложений = СтрокаВложений + СсылкаПодЗаписью; - - Параметры.Вставить("message" , Текст); - Параметры.Вставить("attachments" , СтрокаВложений); - Параметры.Вставить("mark_as_ads" , ?(Реклама, 1, 0)); - Параметры.Вставить("close_comments" , ?(Реклама, 1, 0)); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры); - - Возврат Ответ; - -КонецФункции - -// Удалить пост -// Удаляет пост по id -// -// Параметры: -// IDПоста - Строка,Число - ID поста - post -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьПост(Знач IDПоста, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("post_id", IDПоста); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.delete", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Создать опрос -// Создает опрос с вариантами ответа -// -// Параметры: -// Вопрос - Строка - Вопрос опроса - question -// МассивОтветов - Массив из Строка - Массив вариантов ответа - options -// Картинка - Строка,ДвоичныеДанные - Картинка опроса - picture -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьОпрос(Знач Вопрос, Знач МассивОтветов, Знач Картинка = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Вопрос); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Response = "response"; - - Если ЗначениеЗаполнено(Картинка) Тогда - - Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Опрос"); - - Фото = Ответ.Получить(Response); - - Если ЗначениеЗаполнено(Фото) Тогда - - IDФото = Фото["id"]; - - Если Не ЗначениеЗаполнено(IDФото) Тогда - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - - КонецЕсли; - - Параметры_.Вставить("is_anonymous", 1); - Параметры_.Вставить("is_multiple" , 0); - - Ответы = СтрСоединить(МассивОтветов, ""","""); - Ответы = "[""" + Ответы + """]"; - - Параметры_.Вставить("add_answers", Ответы); - Параметры_.Вставить("photo_id" , OPI_Инструменты.ЧислоВСтроку(IDФото)); - Параметры_.Вставить("question" , Вопрос); - - Опрос = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_); - ОпросСоответствие = Опрос.Получить(Response); - - Если Не ЗначениеЗаполнено(ОпросСоответствие) Тогда - Возврат Опрос; - КонецЕсли; - - OwnerId = ОпросСоответствие.Получить("owner_id"); - ObjectId = ОпросСоответствие.Получить("id"); - - Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда - Возврат Опрос; - КонецЕсли; - - ОпросID = "poll" - + OPI_Инструменты.ЧислоВСтроку(OwnerId) - + "_" - + OPI_Инструменты.ЧислоВСтроку(ObjectId); - - Параметры_.Вставить("attachments", ОпросID); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Создать альбом -// Создает альбом для хранения картинок -// -// Параметры: -// Наименование - Строка - Наименование альбома - title -// Описание - Строка - Описание альбома - description -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьАльбом(Знач Наименование, Знач Описание = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - Параметры_.Вставить("title" , Наименование); - Параметры_.Вставить("description" , Описание); - Параметры_.Вставить("upload_by_admins_only", 1); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.createAlbum", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Удалить альбом -// Удаляет ранее созданный альбом -// -// Параметры: -// IDАльбома - Строка,Число - ID альбома - album -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьАльбом(Знач IDАльбома, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("album_id", OPI_Инструменты.ЧислоВСтроку(IDАльбома)); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.deleteAlbum", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Создать историю -// Создает историю из картинки -// -// Параметры: -// Картинка - Строка,ДвоичныеДанные - Фон истории - picture -// URL - Строка - URL для кнопки под историей - url -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьИсторию(Знач Картинка, Знач URL = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("link_text" , "more"); - Параметры_.Вставить("link_url" , URL); - Параметры_.Вставить("add_to_news", "1"); - - Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "История"); - Возврат Ответ; - -КонецФункции - -// Сохранить картинку в альбом -// Сохраняет картинку в альбом сообщества -// -// Параметры: -// IDАльбома - Строка,Число - ID альбома - album -// Картинка - ДвоичныеДанные,Строка - Файл картинки - picture -// Описание - Строка - Описание картинки - description -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СохранитьКартинкуВАльбом(Знач IDАльбома, Знач Картинка, Знач Описание = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - Параметры_.Вставить("album_id", IDАльбома); - Параметры_.Вставить("caption" , Описание); - - Возврат ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Альбом"); - -КонецФункции - -// Удалить картинку -// Удалить картинку из альбома -// -// Параметры: -// IDКартинки - Строка,Число - ID картинки - pictureid -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьКартинку(Знач IDКартинки, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКартинки); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("photo_id", IDКартинки); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.delete", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Загрузить видео на сервер -// Загружает видео в группу с возможностью его дальнейшего использования -// -// Параметры: -// Видео - Строка, ДвоичныеДанные - Файл видео - file -// Наименование - Строка - Наименование видео - title -// Описание - Строка - Описание видео - description -// Альбом - Строка - ID альбома, если необходимо - album -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ЗагрузитьВидеоНаСервер(Знач Видео - , Знач Наименование - , Знач Описание = "" - , Знач Альбом = "" - , Знач Параметры = "") Экспорт - - Строка_ = "Строка"; - Параметры = ПолучитьСтандартныеПараметры(Параметры); - - OPI_Инструменты.ДобавитьПоле("name" , Наименование, Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("description", Описание , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("album_id" , Альбом , Строка_, Параметры); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/video.save", Параметры); - - Результат = Ответ["response"]; - - Если Не ЗначениеЗаполнено(Результат) Тогда - Возврат Ответ; - КонецЕсли; - - URL = Результат["upload_url"]; - - Если Не ЗначениеЗаполнено(URL) Тогда - Возврат Ответ; - КонецЕсли; - - СоответствиеФайлов = Новый Соответствие; - OPI_Инструменты.ДобавитьПоле("video_file.mp4", Видео, "ДвоичныеДанные", СоответствиеФайлов); - - РазмерДанных = СоответствиеФайлов["video_file.mp4"].Размер(); - РазмерДанных = OPI_Инструменты.ЧислоВСтроку(РазмерДанных); - - Ответ = OPI_Инструменты.PostMultipart(URL, , СоответствиеФайлов, "video/mp4"); - - Возврат Ответ; - -КонецФункции - -// Загрузить фото на сервер -// Загружает фото на сервер для его дальнейшего использования -// -// Параметры: -// Картинка - Строка, ДвоичныеДанные - Файл картинки - file -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// Вид - Строка - Вид загрузки (Пост, Товар, История, Опрос, Прочее) - type -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ЗагрузитьФотоНаСервер(Знач Картинка, Знач Параметры = "", Знач Вид = "Пост") Экспорт - - Параметры = ПолучитьСтандартныеПараметры(Параметры); - Метод = ОпределитьМетодЗагрузкиИзображений(Вид); - Файлы = Новый Соответствие; - - Response = "response"; - URL = "api.vk.com/method/"; - Загрузка = URL + Метод["Загрузка"]; - Сохранение = URL + Метод["Сохранение"]; - - Если ТипЗнч(Картинка) = Тип("Строка") Тогда - КлючКартинка = СтрЗаменить(Картинка, ".", "___"); - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка); - Иначе - КлючКартинка = "image___jpeg"; - КонецЕсли; - - Файлы.Вставить(КлючКартинка, Картинка); - - Для Н = 1 По 5 Цикл - - Ответ = OPI_Инструменты.Get(Загрузка, Параметры); - Результат = Ответ[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - - URL = Результат["upload_url"]; - - Если Не ЗначениеЗаполнено(URL) Тогда - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - - Параметры.Вставить("upload_url", URL); - Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, Файлы); - - Если ТипЗнч(Ответ) = Тип("Соответствие") Тогда - Прервать; - КонецЕсли; - - КонецЦикла; - - Если ТипЗнч(Ответ) <> Тип("Соответствие") Тогда - Возврат ПолучитьСтрокуИзДвоичныхДанных(Ответ); - КонецЕсли; - - ЗаполнитьПараметрыЗагрузкиФото(Метод, Ответ, Параметры); - - Ответ = OPI_Инструменты.Get(Сохранение, Параметры); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСОбсуждениями - -// Создать обсуждение -// Создает новое обсуждение -// -// Параметры: -// Наименование - Строка - Наименование обсуждения - title -// ТекстПервогоСообщения - Строка - Текст первого сообщения - text -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьОбсуждение(Знач Наименование, Знач ТекстПервогоСообщения, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстПервогоСообщения); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("title", Наименование); - Параметры_.Вставить("text" , ТекстПервогоСообщения); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/board.addTopic", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Закрыть обсуждение -// Закрывает или удаляет обсуждение -// -// Параметры: -// IDОбсуждения - Строка,Число - ID обсуждения - topic -// УдалитьПолностью - Булево - Удалить полностью (Истина) или закрыть - remove -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ЗакрытьОбсуждение(Знач IDОбсуждения, Знач УдалитьПолностью = Ложь, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения); - OPI_ПреобразованиеТипов.ПолучитьБулево(УдалитьПолностью); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("topic_id", IDОбсуждения); - - Метод = ?(УдалитьПолностью, "deleteTopic", "closeTopic"); - Ответ = OPI_Инструменты.Get("api.vk.com/method/board." + Метод, Параметры_); - - Возврат Ответ; - -КонецФункции - -// Открыть обсуждение -// Открывает ранее закрытое обсуждение -// -// Параметры: -// IDОбсуждения - Строка,Число - ID обсуждения - topic -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ОткрытьОбсуждение(Знач IDОбсуждения, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("topic_id", IDОбсуждения); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/board.openTopic", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Написать в обсуждение -// Добавляет сообщение в обсуждение от имени группы -// -// Параметры: -// IDОбсуждения - Строка,Число - ID обсуждения - topic -// Текст - Строка - Текст сообщения - text -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция НаписатьВОбсуждение(Знач IDОбсуждения, Знач Текст, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("topic_id", IDОбсуждения); - Параметры_.Вставить("message" , Текст); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/board.createComment", Параметры_); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область ИнтерактивныеДействия - -// Поставить лайк -// Ставит лайк на пост -// -// Параметры: -// IDПоста - Строка,Число - ID поста - post -// IDСтены - Строка,Число - ID стены расположения поста - wall -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПоставитьЛайк(Знач IDПоста, Знач IDСтены = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - IDСтены = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]); - ОбъектВК = "wall" + IDСтены + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста); - - Параметры_.Вставить("type" , "post"); - Параметры_.Вставить("object" , ОбъектВК); - Параметры_.Вставить("item_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста)); - Параметры_.Вставить("owner_id" , OPI_Инструменты.ЧислоВСтроку(IDСтены)); - Параметры_.Вставить("from_group" , 0); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Сделать репост -// Делает репост записи -// -// Параметры: -// IDПоста - Строка,Число - ID поста - post -// IDСтены - Строка,Число - ID стены расположения поста - from -// ЦелеваяСтена - Строка,Число - ID целевой стены или группы - to -// Рекламный - Булево - Признак рекламного поста - ad -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СделатьРепост(Знач IDПоста - , Знач IDСтены = "" - , Знач ЦелеваяСтена = "" - , Знач Рекламный = Ложь - , Знач Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - GroupId = Параметры_["group_id"]; - - OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦелеваяСтена); - OPI_ПреобразованиеТипов.ПолучитьБулево(Рекламный); - - Источник = ?(ЗначениеЗаполнено(IDСтены), IDСтены, GroupId); - Приемник = ?(ЗначениеЗаполнено(ЦелеваяСтена), ЦелеваяСтена, GroupId); - - Параметры_.Вставить("object" , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста)); - Параметры_.Вставить("group_id" , СтрЗаменить(Приемник, "-", "")); - Параметры_.Вставить("mark_as_ads" , ?(Рекламный, 1, 0)); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.repost", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Написать сообщение -// Написать сообщение пользователю в диалоге сообщества -// -// Параметры: -// Текст - Строка - Текст сообщения - text -// IDПользователя - Строка - ID пользователя адресата - user -// Communitytoken - Строка - Токен бота чата сообщества, котрый можно получить в настройках - ct -// Клавиатура - Строка - JSON клавиатуры. См.СформироватьКлавиатуру - keyboard -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция НаписатьСообщение(Знач Текст - , Знач IDПользователя - , Знач Communitytoken - , Знач Клавиатура = "" - , Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Communitytoken); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("access_token", Communitytoken); - - Параметры_.Вставить("user_id" , IDПользователя); - Параметры_.Вставить("peer_id" , IDПользователя); - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("random_id" , 0); - Параметры_.Вставить("message" , Текст); - - Если ЗначениеЗаполнено(Клавиатура) Тогда - Параметры_.Вставить("keyboard", Клавиатура); - КонецЕсли; - - Ответ = OPI_Инструменты.Get("api.vk.com/method/messages.send", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Написать комментарий -// Создает комментарий под выбранной записью -// -// Параметры: -// IDПоста - Строка,Число - ID целевого поста - post -// IDСтены - Строка,Число - ID стены расположения поста - wall -// Текст - Строка - Текст комментария - text -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция НаписатьКомментарий(Знач IDПоста, Знач IDСтены, Знач Текст, Знач Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - GroupId = Параметры_["group_id"]; - - OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - - Параметры_.Вставить("owner_id" , IDСтены); - Параметры_.Вставить("from_group" , GroupId); - Параметры_.Вставить("post_id" , IDПоста); - Параметры_.Вставить("message" , Текст); - - Параметры_.Удалить("group_id"); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.createComment", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Сократить ссылку -// Создает сокращенный URL из обычного -// -// Параметры: -// URL - Строка - URL для сокращения - url -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Строка - Сокращенный URL -Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); - - Response = "response"; - Параметры_ = Новый Структура; - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("url", URL); - - Ответ = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_); - Результат = Ответ[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - - URL = Результат["short_url"]; - - Если ЗначениеЗаполнено(URL) Тогда - Возврат URL; - Иначе - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - -КонецФункции - -#КонецОбласти - -#Область Статистика - -// Получить статистику -// Получает общую статистику сообщества за период -// -// Параметры: -// ДатаНачала - Дата - Дата начала периода - datefrom -// ДатаОкончания - Дата - Дата окончания периода - dateto -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПолучитьСтатистику(Знач ДатаНачала, Знач ДатаОкончания, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьДату(ДатаНачала); - OPI_ПреобразованиеТипов.ПолучитьДату(ДатаОкончания); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - ДатаНачала = OPI_Инструменты.UNIXTime(ДатаНачала); - ДатаОкончания = OPI_Инструменты.UNIXTime(ДатаОкончания); - - Параметры_.Вставить("timestamp_from", ДатаНачала); - Параметры_.Вставить("timestamp_to" , ДатаОкончания); - Параметры_.Вставить("stats_groups" , "visitors, reach, activity"); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/stats.get", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Получить статистику по постам -// Получает статистику в разрезе постов -// -// Параметры: -// МассивИДПостов - Массив из Строка,Число - Массив ID постов - posts -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Массив из Произвольный - Массив данных статистики по постам -Функция ПолучитьСтатистикуПостов(Знач МассивИДПостов, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИДПостов); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - МассивОтветов = Новый Массив; - МассивНабора = Новый Массив; - МаксимумПостов = 30; - Response = "response"; - - Для Каждого Пост Из МассивИДПостов Цикл - - МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост)); - - Если МассивНабора.Количество() = МаксимумПостов Тогда - - СтрокаНомеров = СтрСоединить(МассивНабора, ","); - Параметры_.Вставить("post_ids", СтрокаНомеров); - - Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_); - МассивСтатистики = Статистика[Response]; - - Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл - МассивОтветов.Добавить(ЭлементСтатистики); - КонецЦикла; - - МассивНабора = Новый Массив; - - КонецЕсли; - - КонецЦикла; - - СтрокаНомеров = СтрСоединить(МассивНабора, ","); - Параметры_.Вставить("post_ids", СтрокаНомеров); - - Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_); - МассивСтатистики = Статистика[Response]; - - Если ТипЗнч(МассивСтатистики) = Тип("Массив") Тогда - Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл - МассивОтветов.Добавить(ЭлементСтатистики); - КонецЦикла; - КонецЕсли; - - Возврат МассивОтветов; - -КонецФункции - -#КонецОбласти - -#Область РаботаСРекламнымКабинетом - -// Создать рекламную кампанию -// Создает кампанию в выбранном рекламном кабинете -// -// Параметры: -// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet -// Наименование - Строка - Наименование кампании - title -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьРекламнуюКампанию(Знач IDКабинета, Знач Наименование, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - - ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); - КонечнаяДата = ДобавитьМесяц(ТекущаяДата, 24); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("account_id", IDКабинета); - - МассивСтруктур = Новый Массив; - ДатаСтарт = OPI_Инструменты.UNIXTime(ТекущаяДата); - ДатаСтоп = OPI_Инструменты.UNIXTime(КонечнаяДата); - - СтруктураКампании = Новый Структура; - СтруктураКампании.Вставить("type" , "promoted_posts"); - СтруктураКампании.Вставить("name" , Наименование); - СтруктураКампании.Вставить("day_limit" , 0); - СтруктураКампании.Вставить("all_limit" , 0); - СтруктураКампании.Вставить("start_time" , ДатаСтарт); - СтруктураКампании.Вставить("stop_time" , ДатаСтоп); - СтруктураКампании.Вставить("status" , 1); - - МассивСтруктур.Добавить(СтруктураКампании); - - JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур); - - Параметры_.Вставить("data", JSONДата); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createCampaigns", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Создать рекламное объявление -// Создает рекламное объявление на основе поста -// -// Параметры: -// НомерКампании - Строка,Число - ID рекламной кампании - campaign -// ДневнойЛимит - Строка,Число - Дневной лимит в рублях - limit -// НомерКатегории - Строка,Число - Номер рекламной категории - category -// IDПоста - Строка,Число - ID поста, используемого в качетсве рекламы - post -// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьРекламноеОбъявление(Знач НомерКампании - , Знач ДневнойЛимит - , Знач НомерКатегории - , Знач IDПоста - , Знач IDКабинета - , Знач Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - GroupId = Параметры_["group_id"]; - - OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId); - OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКампании); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ДневнойЛимит); - OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКатегории); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета); - - Линк = "https://vk.com/wall-" + GroupId + "_" + IDПоста; - - МассивСтруктур = Новый Массив; - СтруктураКампании = Новый Структура; - СтруктураКампании.Вставить("campaign_id" , НомерКампании); - СтруктураКампании.Вставить("ad_format" , 9); - СтруктураКампании.Вставить("conversion_event_id" , 1); - СтруктураКампании.Вставить("autobidding" , 1); - СтруктураКампании.Вставить("cost_type" , 3); - СтруктураКампании.Вставить("goal_type" , 2); - СтруктураКампании.Вставить("ad_platform" , "all"); - СтруктураКампании.Вставить("publisher_platforms" , "vk"); - СтруктураКампании.Вставить("publisher_platforms_auto" , "1"); - СтруктураКампании.Вставить("day_limit" , ДневнойЛимит); - СтруктураКампании.Вставить("all_limit" , "0"); - СтруктураКампании.Вставить("category1_id" , НомерКатегории); - СтруктураКампании.Вставить("age_restriction" , 0); - СтруктураКампании.Вставить("status" , 1); - СтруктураКампании.Вставить("name" , "Объявление"); - СтруктураКампании.Вставить("link_url" , Линк); - - МассивСтруктур.Добавить(СтруктураКампании); - - OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина); - - Параметры_.Вставить("data" , МассивСтруктур); - Параметры_.Вставить("account_id" , IDКабинета); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createAds", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Приостановить рекламное объявление -// Приостанавливает показ рекламного объявления -// -// Параметры: -// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet -// IDОбъявления - Строка,Число - ID объявления - adv -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПриостановитьРекламноеОбъявление(Знач IDКабинета, Знач IDОбъявления, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбъявления); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - Параметры_.Вставить("account_id", IDКабинета); - - МассивСтруктур = Новый Массив; - СтруктураКампании = Новый Структура; - - СтруктураКампании.Вставить("ad_id" , IDОбъявления); - СтруктураКампании.Вставить("status" , 0); - - МассивСтруктур.Добавить(СтруктураКампании); - - OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина); - - Параметры_.Вставить("data", МассивСтруктур); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.updateAds", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Получить список рекламных категорий -// Получает список id рекламных категорий для создания рекламного объявления -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПолучитьСписокРекламныхКатегорий(Знач Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСТоварами - -// Получить список категорий товаров -// Получает список ID товарных категорий для указания при создании товара -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из Строка - Ключ - ID, Значение - Имя -Функция ПолучитьСписокКатегорийТоваров(Знач Параметры = "") Экспорт - - Response = "response"; - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_); - Результат = Ответ[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - - Количество = Результат["count"]; - - Если Не ЗначениеЗаполнено(Количество) Тогда - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - - Параметры_.Вставить("count", Количество); - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_); - Результат = Ответ[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - - Категории = Результат["items"]; - - Если Не ЗначениеЗаполнено(Категории) Тогда - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - - СоответствиеКатегорий = Новый Соответствие; - - Для Каждого Категория Из Категории Цикл - СоответствиеКатегорий.Вставить(Категория["id"], Категория["name"]); - КонецЦикла; - - Возврат СоответствиеКатегорий; - -КонецФункции - -// Получить список товаров -// Получает список товаров сообщества -// -// Параметры: -// Подборка - Строка,Число - ID подборки, если нужен отбор - sel -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Массив соответствий товаров -Функция ПолучитьСписокТоваров(Знач Подборка = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("count" , 200); - Параметры_.Вставить("extended" , 1); - Параметры_.Вставить("with_disabled", 1); - - Если ЗначениеЗаполнено(Подборка) Тогда - Параметры_.Вставить("album_id", Подборка); - КонецЕсли; - - МассивТоваров = Новый Массив; - ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры_); - - Возврат МассивТоваров; - -КонецФункции - -// Получить товары по ID -// Получает информацию о товарах по массиву ID -// -// Параметры: -// Товары - Строка, Массив Из Строка - Массив ID товаров - items -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПолучитьТоварыПоИД(Знач Товары, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Товары); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - СтрокаТоваров = ""; - Owner = "owner_id"; - - Для Каждого Товар Из Товары Цикл - ТекущийТовар = Параметры_[Owner] + "_" + Товар; - ТекущийТовар = OPI_Инструменты.ЧислоВСтроку(ТекущийТовар); - СтрокаТоваров = СтрокаТоваров + ТекущийТовар + ","; - КонецЦикла; - - СтрокаТоваров = Лев(СтрокаТоваров, СтрДлина(СтрокаТоваров) - 1); - Параметры_.Вставить("item_ids", СтрокаТоваров); - Параметры_.Вставить("extended", 1); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getById", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Добавить товар -// Добавляет новый товар в каталог сообщества -// -// Параметры: -// ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь -// Подборка - Строка - ID подборка для помещения товара, если необходимо - sel -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ДобавитьТовар(Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт - Возврат УправлениеТоваром(ОписаниеТовара, , Подборка, Параметры); -КонецФункции - -// Изменить товар -// Изменяет ранее созданный товар -// -// Параметры: -// Товар - Число,Строка - Идентификатор изменяемого товара - item -// ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь -// Подборка - Строка - Идентификатор новой подборки, если необходимо - sel -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ИзменитьТовар(Знач Товар, Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт - Возврат УправлениеТоваром(ОписаниеТовара, Товар, Подборка, Параметры); -КонецФункции - -// Удалить товар -// Удаляет ранее созданный товар -// -// Параметры: -// Товар - Строка,Число - ID товара - item -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьТовар(Знач Товар, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("item_id", Товар); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.delete", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Сгруппировать товары -// Группирует товары на основе одинаковых наборов свойств -// -// Параметры: -// МассивТоваров - Массив Из Строка - Массив ID товаров - items -// СуществующаяГруппа - Строка - ID существующей группы, если необходимо - sellgroup -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СгруппироватьТовары(Знач МассивТоваров, Знач СуществующаяГруппа = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(СуществующаяГруппа); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - МассивТоваров_ = Новый Массив; - - Для Каждого Товар Из МассивТоваров Цикл - МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар)); - КонецЦикла; - - Товары = СтрСоединить(МассивТоваров_, ","); - - Параметры_.Вставить("item_ids", Товары); - - Если ЗначениеЗаполнено(СуществующаяГруппа) Тогда - Параметры_.Вставить("item_group_id", СуществующаяГруппа); - КонецЕсли; - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.groupItems", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Получить описание товара. !NOCLI -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Пустое описание товара: -// *Имя - Строка - Имя товара -// *Описание - Строка - Описание товара -// *Категория - Строка - См. ПолучитьСписокКатегорийТоваров -// *Цена - Число - Цена товара -// *СтараяЦена - Число - Для отображения скидки/изменения цены -// *ОсновноеФото - Строка,ДвоичныеДанные - Двоичные данные или путь к фото -// *URL - Строка - Ссылка на страницу сайта магазина -// *ДополнительныеФото - Массив Из Строка - Двоичные данные или пути к фото -// *ЗначенияСвойств - Массив Из Строка - См.ДобавитьВариантСвойстваТовара -// *ГлавныйВГруппе - Булево - Главный в группе, если есть в группе -// *Ширина - Число - Ширина товара в мм. -// *Высота - Число - Высота товара в мм. -// *Глубина - Число - Глубина товара в мм. -// *Вес - Число - Вес в гр. -// *SKU - Строка - SKU -// *ДоступныйОстаток - Число - Остаток. -1 - не ограничено -Функция ПолучитьОписаниеТовара() Экспорт - - Товар = Новый Соответствие(); - Товар.Вставить("Имя" , "Новый товар"); // Имя товара - Товар.Вставить("Описание" , "Описание товара"); // Описание товара - Товар.Вставить("Категория" , "20173"); // См ПолучитьСписокКатегорийТоваров() - Товар.Вставить("Цена" , 1); // Цена. - Товар.Вставить("СтараяЦена" , Неопределено); // Для отражения изменения цены - Товар.Вставить("ОсновноеФото" , Неопределено); // ДД или путь к осн. фото - Товар.Вставить("URL" , Неопределено); // Ссылка на страницу магазина - Товар.Вставить("ДополнительныеФото" , Новый Массив); // Массив путей или ДД для доп. фото - Товар.Вставить("ЗначенияСвойств" , Новый Массив); // Значения свойств (варианты). Максимум 2 - Товар.Вставить("ГлавныйВГруппе" , Ложь); // Сделать главным в своей группе - Товар.Вставить("Ширина" , Неопределено); // В миллиметрах - Товар.Вставить("Высота" , Неопределено); // В миллиметрах - Товар.Вставить("Глубина" , Неопределено); // В миллиметрах - Товар.Вставить("Вес" , Неопределено); // В граммах - Товар.Вставить("SKU" , Неопределено); // Артикул - Товар.Вставить("ДоступныйОстаток" , 1); - - Возврат Товар; - -КонецФункции - -#КонецОбласти - -#Область РаботаСПодборкамиТоваров - -// Получить список подборок -// Получает список подборок товаров -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Массив соответствий подборок -Функция ПолучитьСписокПодборок(Знач Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("count", 100); - - МассивАльбомов = Новый Массив; - ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры_); - - Возврат МассивАльбомов; - -КонецФункции - -// Получить подборки по ID -// Получить список подборок по массиву ID -// -// Параметры: -// Подборки - Строка, Массив Из Строка - ID подборок - sels -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПолучитьПодборкиПоИД(Знач Подборки, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Подборки); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Подборки_ = Новый Массив; - СтрокаПодборок = ""; - - Для Каждого Подборка Из Подборки Цикл - Подборки_.Добавить(OPI_Инструменты.ЧислоВСтроку(Подборка)); - КонецЦикла; - - СтрокаПодборок = СтрСоединить(Подборки_, ","); - - Параметры_.Вставить("album_ids", СтрокаПодборок); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbumById", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Создать подборку товаров -// Создает пустую подборку товаров -// -// Параметры: -// Название - Строка - Название подборки - title -// Картинка - Строка,ДвоичныеДанные - Файл картинки - picture -// Основная - Булево - Основная - main -// Скрытая - Булево - Скрытая - hidden -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьПодборкуТоваров(Знач Название - , Знач Картинка - , Знач Основная = Ложь - , Знач Скрытая = Ложь - , Знач Параметры = "") Экспорт - - Возврат УправлениеПодборкой(Название, Картинка, , Основная, Скрытая, Параметры); - -КонецФункции - -// Изменить подборку товаров -// Изменяет свойства подборки товаров -// -// Параметры: -// Название - Строка - Новое название подборки - title -// Подборка - Строка - ID подборки - sel -// Картинка - Строка,ДвоичныеДанные - Новая картинка подборки - picture -// Основная - Булево - Основная - main -// Скрытая - Булево - Скрытая - hidden -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ИзменитьПодборкуТоваров(Знач Название - , Знач Подборка - , Знач Картинка = "" - , Знач Основная = Ложь - , Знач Скрытая = Ложь - , Знач Параметры = "") Экспорт - - Возврат УправлениеПодборкой(Название, Картинка, Подборка, Основная, Скрытая, Параметры); - -КонецФункции - -// Добавить товар в подборку -// Добавляет товар в подборку -// -// Параметры: -// МассивТоваров - Массив из Строка, Число - Массив товаров или товар - items -// Подборка - Строка - ID подборки - sel -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ДобавитьТоварВПодборку(Знач МассивТоваров, Знач Подборка, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - МассивТоваров_ = Новый Массив; - - Для Каждого Товар Из МассивТоваров Цикл - МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар)); - КонецЦикла; - - СписокТоваров = СтрСоединить(МассивТоваров_, ","); - - Параметры_.Вставить("item_ids" , СписокТоваров); - Параметры_.Вставить("album_ids", Подборка); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addToAlbum", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Удалить товар из подборки -// Удаляет ранее добавленный товар из подборки -// -// Параметры: -// Товар - Строка - ID товара - item -// Подборка - Строка - ID подборки - sel -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьТоварИзПодборки(Знач Товар, Знач Подборка, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - Параметры_.Вставить("item_id" , Товар); - Параметры_.Вставить("album_ids", Подборка); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.removeFromAlbum", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Удалить подборку -// Удаляет подборку по ID -// -// Параметры: -// Подборка - Строка - ID подборки - sel -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьПодборку(Знач Подборка, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("album_id", Подборка); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteAlbum", Параметры_); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСоСвойствамиТоваров - -// Получить список свойств -// Получает список свойств товаров группы -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПолучитьСписокСвойств(Знач Параметры = "") Экспорт - - Response = "response"; - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getProperties", Параметры_); - Свойства = Ответ[Response]["items"]; - - Возврат Свойства; - -КонецФункции - -// Создать свойство товара -// Создает новое свойство для использования в товарах -// -// Параметры: -// Название - Строка - Название свойства - title -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьСвойствоТовара(Знач Название, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Название); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("title", Название); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addProperty", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Изменить свойство товара -// Изменяет существующее свойство товара -// -// Параметры: -// Название - Строка - Новое название - title -// Свойство - Строка,Число - ID свойства - prop -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ИзменитьСвойствоТовара(Знач Название, Знач Свойство, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Название); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("title" , Название); - Параметры_.Вставить("property_id", Свойство); - Параметры_.Вставить("type" , "text"); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editProperty", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Удалить свойство товара -// Удаляет существующее свойство товара -// -// Параметры: -// Свойство - Строка,Число - ID свойства - prop -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьСвойствоТовара(Знач Свойство, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("property_id", Свойство); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteProperty", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Добавить вариант свойства товара -// Добавляет вариант для существующего свойства -// -// Параметры: -// Значение - Строка - Значение свойства - value -// Свойство - Строка,Число - ID свойства, куда добавляется вариант - prop -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ДобавитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("property_id", Свойство); - Параметры_.Вставить("title" , Значение); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addPropertyVariant", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Изменить вариант свойства товара -// Изменяет значение варианта существующего свойства товара -// -// Параметры: -// Значение - Строка - Новое значение свойства - value -// Свойство - Строка,Число - ID свойства - prop -// Вариант - Строка,Число - ID варианта - option -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ИзменитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Вариант, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("property_id", Свойство); - Параметры_.Вставить("variant_id" , Вариант); - Параметры_.Вставить("title" , Значение); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editPropertyVariant", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Удалить вариант свойства товара -// Удаляет ранее созданный вариант свойства -// -// Параметры: -// Вариант - Строка,Число - ID варианта - option -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьВариантСвойстваТовара(Знач Вариант, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("variant_id", Вариант); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deletePropertyVariant", Параметры_); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСЗаказами - -// Получить список заказов -// Возвращает список заказов сообщества -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПолучитьСписокЗаказов(Знач Параметры = "") Экспорт - - Параметры = ПолучитьСтандартныеПараметры(Параметры); - Параметры.Вставить("count", 50); - - МассивЗаказов = Новый Массив; - ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры); - - Возврат МассивЗаказов; - -КонецФункции - -#КонецОбласти - -#Область Прочие - -// Сформировать клавиатуру -// Формирует клавиатуру по массиву кнопок -// -// Параметры: -// МассивКнопок - Массив из Строка - Массив заголовков кнопок - buttons -// -// Возвращаемое значение: -// Строка - JSON клавиатуры -Функция СформироватьКлавиатуру(Знач МассивКнопок) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); - - Клавиатура = Новый Структура; - МассивКлавиатуры = Новый Массив; - МассивБлока = Новый Массив; - - Для Каждого Действие Из МассивКнопок Цикл - - Кнопка = Новый Структура; - Выражение = Новый Структура; - - Выражение.Вставить("type" , "text"); - Выражение.Вставить("label", Действие); - - Кнопка.Вставить("action", Выражение); - МассивБлока.Добавить(Кнопка); - - КонецЦикла; - - МассивКлавиатуры.Добавить(МассивБлока); - - Клавиатура.Вставить("buttons" , МассивКлавиатуры); - Клавиатура.Вставить("one_time", Ложь); - - Возврат OPI_Инструменты.JSONСтрокой(Клавиатура); - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ПолучитьСтандартныеПараметры(Знач Параметры = "") - - // Здесь собрано определение данных для работы с VK API - // Вы можете переопределять их, передавая в качестве параметра - // Совпадающие поля будут перезаписаны с приоритетом параметра функции - - Параметры_ = Новый Структура; - - // access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена() - // from_group - действия будут выполняться от лица группы - // owner_id - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был - // установлен свой - // app_id - id приложения, которое необходимо создать в профиле на странице для разработчиков - // group_id - owner_id, но без "-" - - Параметры_.Вставить("access_token" , ""); - Параметры_.Вставить("from_group" , "1"); - Параметры_.Вставить("owner_id" , ""); - Параметры_.Вставить("v" , "5.131"); - Параметры_.Вставить("app_id" , ""); - Параметры_.Вставить("group_id" , ""); - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры); - - Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда - Для Каждого ПереданныйПараметр Из Параметры Цикл - Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение)); - КонецЦикла; - КонецЕсли; - - Возврат Параметры_; - -КонецФункции - -Функция ПолучитьИДКартинки(Знач Картинка, Знач Параметры, Знач Вид) - - Response = "response"; - Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид); - Результат = Ответ[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - ИДФото = Результат["photo_id"]; - - Если Не ЗначениеЗаполнено(ИДФото) Тогда - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - - ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото); - Возврат ИДФото; - -КонецФункции - -Функция ПолучитьСоответствиеКартинки(Знач Картинка, Знач Параметры, Знач Вид) - - Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид); - ОтветМассив = Ответ.Получить("response"); - - Если Не ЗначениеЗаполнено(ОтветМассив) Или Не ТипЗнч(ОтветМассив) = Тип("Массив") Тогда - Возврат Ответ; - Иначе - Если ОтветМассив.Количество() = 0 Тогда - Возврат Ответ; - Иначе - ОтветСоответствие = ОтветМассив[0]; - КонецЕсли; - КонецЕсли; - - Возврат ОтветСоответствие; - -КонецФункции - -Функция ПолучитьМассивПодборок(Знач Подборки, Знач Параметры = "") - - Response = "response"; - Подборки = ПолучитьПодборкиПоИД(Подборки, Параметры); - Результат = Подборки[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - - МассивПодборок = Результат["items"]; - - Если Не ЗначениеЗаполнено(МассивПодборок) Тогда - Возврат Подборки; - КонецЕсли; - - Иначе - Возврат Подборки; - КонецЕсли; - - Возврат МассивПодборок; - -КонецФункции - -Функция ОпределитьМетодЗагрузкиИзображений(Знач Вид) - - СоответствиеМетодов = Новый Соответствие; - Загрузка = "Загрузка"; - Сохранение = "Сохранение"; - Способ = "Способ"; - Фото = "Фото"; - - Если Вид = "Пост" Тогда - - СоответствиеМетодов.Вставить(Загрузка , "photos.getWallUploadServer"); - СоответствиеМетодов.Вставить(Сохранение, "photos.saveWallPhoto"); - СоответствиеМетодов.Вставить(Фото , "photo"); - СоответствиеМетодов.Вставить(Способ , 1); - - ИначеЕсли Вид = "Товар" Тогда - - СоответствиеМетодов.Вставить(Загрузка , "market.getProductPhotoUploadServer"); - СоответствиеМетодов.Вставить(Сохранение, "market.saveProductPhoto"); - СоответствиеМетодов.Вставить(Способ , 2); - - ИначеЕсли Вид = "История" Тогда - - СоответствиеМетодов.Вставить(Загрузка , "stories.getPhotoUploadServer"); - СоответствиеМетодов.Вставить(Сохранение, "stories.save"); - СоответствиеМетодов.Вставить(Способ , 3); - - ИначеЕсли Вид = "Опрос" Тогда - - СоответствиеМетодов.Вставить(Загрузка , "polls.getPhotoUploadServer"); - СоответствиеМетодов.Вставить(Сохранение, "polls.savePhoto"); - СоответствиеМетодов.Вставить(Фото , "photo"); - СоответствиеМетодов.Вставить(Способ , 1); - - Иначе - - СоответствиеМетодов.Вставить(Загрузка , "photos.getUploadServer"); - СоответствиеМетодов.Вставить(Сохранение, "photos.save"); - СоответствиеМетодов.Вставить(Фото , "photos_list"); - СоответствиеМетодов.Вставить(Способ , 1); - - КонецЕсли; - - Возврат СоответствиеМетодов; - -КонецФункции - -Функция ПолучитьСоответствиеПараметровТовара() - - Поля = Новый Соответствие(); - Поля.Вставить("Имя" , "name"); - Поля.Вставить("Описание" , "description"); - Поля.Вставить("Категория" , "category_id"); - Поля.Вставить("Цена" , "price"); - Поля.Вставить("СтараяЦена" , "old_price"); - Поля.Вставить("URL" , "url"); - Поля.Вставить("ГлавныйВГруппе" , "is_main_variant"); - Поля.Вставить("Ширина" , "dimension_width"); - Поля.Вставить("Высота" , "dimension_height"); - Поля.Вставить("Глубина" , "dimension_length"); - Поля.Вставить("Вес" , "weight"); - Поля.Вставить("SKU" , "sku"); - Поля.Вставить("ДоступныйОстаток" , "stock_amount"); - - Возврат Поля; - -КонецФункции - -Функция УправлениеТоваром(Знач ОписаниеТовара, Знач ИДТовара = "", Знач Подборка = "", Знач Параметры = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДТовара); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеТовара); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("v", "5.199"); - - Response = "response"; - - ЗаполнитьПоляЗапросаТовара(ОписаниеТовара, Параметры_); - - Если ЗначениеЗаполнено(ИДТовара) Тогда - Параметры_.Вставить("item_id", ИДТовара); - Метод = "edit"; - Иначе - Метод = "add"; - КонецЕсли; - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_); - Результат = Ответ[Response]; - - Если Не ЗначениеЗаполнено(ИДТовара) И ЗначениеЗаполнено(Результат) Тогда - - ИДТовара = Результат["market_item_id"]; - - Если Не ЗначениеЗаполнено(ИДТовара) Тогда - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - - Если ЗначениеЗаполнено(Подборка) И ЗначениеЗаполнено(ИДТовара) Тогда - ДобавитьТоварВПодборку(ИДТовара, Подборка, Параметры_); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция УправлениеПодборкой(Знач Название - , Знач Картинка = "" - , Знач ИДПодборки = "" - , Знач Основная = Ложь - , Знач Скрытая = Ложь - , Знач Параметры = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Название); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПодборки); - OPI_ПреобразованиеТипов.ПолучитьБулево(Основная); - OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытая); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Ответ = ДобавитьПараметрКартинки(Картинка, ИДПодборки, Параметры_); - - Если ЗначениеЗаполнено(Ответ) Тогда - Возврат Ответ; - КонецЕсли; - - Параметры_.Вставить("title" , Название); - Параметры_.Вставить("main_album" , ?(Основная, 1, 0)); - Параметры_.Вставить("is_hidden" , ?(Скрытая, 1, 0)); - - Если ЗначениеЗаполнено(ИДПодборки) Тогда - Параметры_.Вставить("album_id", ИДПодборки); - Метод = "editAlbum"; - Иначе - Метод = "addAlbum"; - КонецЕсли; - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_); - - Возврат Ответ; - -КонецФункции - -Функция ДобавитьПараметрКартинки(Знач Картинка, Знач ИДПодборки, Параметры) - - PhotoID = "photo_id"; - - Если ЗначениеЗаполнено(Картинка) Тогда - - ИДФото = ПолучитьИДКартинки(Картинка, Параметры, "Товар"); - - Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда - Возврат ИДФото; - КонецЕсли; - - Параметры.Вставить(PhotoID, ИДФото); - - Иначе - - Если ЗначениеЗаполнено(ИДПодборки) Тогда - - Подборки = ПолучитьМассивПодборок(ИДПодборки, Параметры); - - Если Не ТипЗнч(Подборки) = Тип("Массив") Тогда - Возврат Подборки; - КонецЕсли; - - Если Не Подборки.Количество() = 0 Тогда - ИДФото = Подборки[0]["photo"]["id"]; - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДФото); - Параметры.Вставить(PhotoID, ИДФото); - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - - Возврат ""; - -КонецФункции - -Процедура ЗаполнитьПараметрыЗагрузкиФото(Знач Метод, Знач Ответ, Параметры) - - Response = "response"; - Способ = Метод["Способ"]; - СтандартныйСпособ = 1; - НовыйСпособ = 2; - - Если Способ = СтандартныйСпособ Тогда - - Hash = "hash"; - Serv = "server"; - Aid = "aid"; - Фото = Метод["Фото"]; - - Параметры.Вставить(Hash, Ответ[Hash]); - Параметры.Вставить(Фото, Ответ[Фото]); - - СерверФото = Ответ.Получить(Serv); - - Если ЗначениеЗаполнено(СерверФото) Тогда - СерверФото = OPI_Инструменты.ЧислоВСтроку(СерверФото); - Параметры.Вставить(Serv, СерверФото); - КонецЕсли; - - Идентификатор = Ответ.Получить(Aid); - - Если ЗначениеЗаполнено(Идентификатор) Тогда - Идентификатор = OPI_Инструменты.ЧислоВСтроку(Идентификатор); - Параметры.Вставить(Aid , Идентификатор); - КонецЕсли; - - ИначеЕсли Способ = НовыйСпособ Тогда - - ОтветСтрокой = OPI_Инструменты.JSONСтрокой(Ответ); - Параметры.Вставить("upload_response", ОтветСтрокой); - - Иначе - - Параметры.Вставить("upload_results", Ответ[Response]["upload_result"]); - - КонецЕсли; - -КонецПроцедуры - -Процедура ЗаполнитьПоляЗапросаТовара(Знач ОписаниеТовара, Параметры) - - Response = "response"; - ОсновноеФото = ОписаниеТовара["ОсновноеФото"]; - ДопФото = ОписаниеТовара["ДополнительныеФото"]; - Свойства = ОписаниеТовара["ЗначенияСвойств"]; - - Если ЗначениеЗаполнено(ОсновноеФото) Тогда - - Ответ = ЗагрузитьФотоНаСервер(ОсновноеФото, Параметры, "Товар"); - Результат = Ответ[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - ИДФото = Результат["photo_id"]; - - Если Не ЗначениеЗаполнено(ИДФото) Тогда - Возврат; - КонецЕсли; - - Иначе - Возврат; - КонецЕсли; - - ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото); - Параметры.Вставить("main_photo_id", ИДФото); - - КонецЕсли; - - Если ТипЗнч(Свойства) = Тип("Массив") Тогда - - Свойства_ = Новый Массив; - - Для Каждого Свойство Из Свойства Цикл - Свойства_.Добавить(OPI_Инструменты.ЧислоВСтроку(Свойство)); - КонецЦикла; - - Свойства = СтрСоединить(Свойства_, ","); - - КонецЕсли; - - Если ЗначениеЗаполнено(Свойства) Тогда - Параметры.Вставить("variant_ids", OPI_Инструменты.ЧислоВСтроку(Свойства)); - КонецЕсли; - - ДобавитьДополнительныеФотоТовара(ДопФото, Параметры); - - Для Каждого Поле Из ПолучитьСоответствиеПараметровТовара() Цикл - - Значение = ОписаниеТовара[Поле.Ключ]; - - Если Значение <> Неопределено Тогда - Параметры.Вставить(Поле.Значение, ОписаниеТовара[Поле.Ключ]); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Процедура ДобавитьДополнительныеФотоТовара(Знач МассивФото, Параметры) - - Если ТипЗнч(МассивФото) = Тип("Массив") Тогда - Если МассивФото.Количество() > 0 Тогда - - СтрокаФотографий = ""; - - Для Каждого Фото Из МассивФото Цикл - - ИДФото = ПолучитьИДКартинки(Фото, Параметры, "Товар"); - - Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда - Возврат; - КонецЕсли; - - СтрокаФотографий = СтрокаФотографий + ИДФото + ","; - - КонецЦикла; - - СтрокаФотографий = Лев(СтрокаФотографий, СтрДлина(СтрокаФотографий) - 1); - Параметры.Вставить("photo_ids", СтрокаФотографий); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -Процедура ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг = 0) - - Response = "response"; - МаксимумВЗапросе = 200; - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.get", Параметры); - Товары = Ответ[Response]["items"]; - - Если Товары.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Для Каждого Товар Из Товары Цикл - МассивТоваров.Добавить(Товар); - КонецЦикла; - - Сдвиг = Сдвиг + МаксимумВЗапросе; - Параметры.Вставить("offset", Сдвиг); - ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг); - -КонецПроцедуры - -Процедура ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг = 0) - - Response = "response"; - МаксимумВЗапросе = 100; - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbums", Параметры); - Альбомы = Ответ[Response]["items"]; - - Если Альбомы.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Для Каждого Альбом Из Альбомы Цикл - МассивАльбомов.Добавить(Альбом); - КонецЦикла; - - Сдвиг = Сдвиг + МаксимумВЗапросе; - Параметры.Вставить("offset", Сдвиг); - ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг); - -КонецПроцедуры - -Процедура ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг = 0) - - Response = "response"; - МаксимумВЗапросе = 50; - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getGroupOrders", Параметры); - Заказы = Ответ[Response]["items"]; - - Если Заказы.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Для Каждого Заказ Из Заказы Цикл - МассивЗаказов.Добавить(Заказ); - КонецЦикла; - - Сдвиг = Сдвиг + МаксимумВЗапросе; - Параметры.Вставить("offset", Сдвиг); - ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг); - -КонецПроцедуры - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_VK.os +// Библиотека: VK +// Команда CLI: vk + +// 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:NumberOfOptionalParams-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off +// BSLLS:UnusedLocalVariable-off + +//@skip-check method-too-many-params +//@skip-check wrong-string-literal-content + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область ПолучениеТокена + +// Создать ссылку получения токена +// Получение ссылки для интерактивного получения токена (access_token), который необходим +// для дальнейших действий +// +// Параметры: +// app_id - Строка,Число - app_id из настроек приложения - app +// +// Возвращаемое значение: +// Строка - URL, по которому необходимо перейти в браузере +Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(App_id); + + // access_token нужно будет забрать из параметра в строке адреса браузера + Возврат "https://oauth.vk.com/authorize?client_id=" + App_id + + "&scope=offline,wall,groups,photos,stats,stories,ads,market,video" + + "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html"; + +КонецФункции + +#КонецОбласти + +#Область РаботаСГруппой + +// Создать пост +// Создает пост с картинками +// +// Параметры: +// Текст - Строка - Текст поста - text +// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив картинок - pictures +// Реклама - Булево - Признак ""Это реклама"" - ad +// СсылкаПодЗаписью - Строка - Ссылка (URL) под записью - url +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьПост(Знач Текст + , Знач МассивКартинок + , Знач Реклама = Ложь + , Знач СсылкаПодЗаписью = "" + , Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКартинок); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + МассивВложений = Новый Массив; + + Для Каждого КартинкаПоста Из МассивКартинок Цикл + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + ОтветСоответствие = ПолучитьСоответствиеКартинки(КартинкаПоста, Параметры_, "Пост"); + + OwnerId = ОтветСоответствие.Получить("owner_id"); + ObjectId = ОтветСоответствие.Получить("id"); + + Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда + Возврат ОтветСоответствие; + КонецЕсли; + + OwnerId = OPI_Инструменты.ЧислоВСтроку(OwnerId); + ObjectId = OPI_Инструменты.ЧислоВСтроку(ObjectId); + + ФотоID = "photo" + OwnerId + "_" + ObjectId; + + МассивВложений.Добавить(ФотоID); + + КонецЦикла; + + Ответ = СоздатьСоставнойПост(Текст, МассивВложений, Реклама, СсылкаПодЗаписью, Параметры); + + Возврат Ответ; + +КонецФункции + +// Создать составной пост +// Создает пост на основе массива идетификаторов объектов (картинок, видео и др.) +// +// Параметры: +// Текст - Строка - Текст поста - text +// Объекты - Массив из Строка - Массив идентификаторов вида photo123_123 - objects +// Реклама - Булево - Признак ""Это реклама"" - ad +// СсылкаПодЗаписью - Строка - Ссылка (URL) под записью - url +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьСоставнойПост(Знач Текст + , Знач Объекты + , Знач Реклама = Ложь + , Знач СсылкаПодЗаписью = "" + , Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + OPI_ПреобразованиеТипов.ПолучитьСтроку(СсылкаПодЗаписью); + OPI_ПреобразованиеТипов.ПолучитьБулево(Реклама); + + Параметры = ПолучитьСтандартныеПараметры(Параметры); + СтрокаВложений = СтрСоединить(Объекты, ","); + СтрокаВложений = СтрокаВложений + СсылкаПодЗаписью; + + Параметры.Вставить("message" , Текст); + Параметры.Вставить("attachments" , СтрокаВложений); + Параметры.Вставить("mark_as_ads" , ?(Реклама, 1, 0)); + Параметры.Вставить("close_comments" , ?(Реклама, 1, 0)); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры); + + Возврат Ответ; + +КонецФункции + +// Удалить пост +// Удаляет пост по id +// +// Параметры: +// IDПоста - Строка,Число - ID поста - post +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьПост(Знач IDПоста, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("post_id", IDПоста); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.delete", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Создать опрос +// Создает опрос с вариантами ответа +// +// Параметры: +// Вопрос - Строка - Вопрос опроса - question +// МассивОтветов - Массив из Строка - Массив вариантов ответа - options +// Картинка - Строка,ДвоичныеДанные - Картинка опроса - picture +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьОпрос(Знач Вопрос, Знач МассивОтветов, Знач Картинка = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Вопрос); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Response = "response"; + + Если ЗначениеЗаполнено(Картинка) Тогда + + Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Опрос"); + + Фото = Ответ.Получить(Response); + + Если ЗначениеЗаполнено(Фото) Тогда + + IDФото = Фото["id"]; + + Если Не ЗначениеЗаполнено(IDФото) Тогда + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + + КонецЕсли; + + Параметры_.Вставить("is_anonymous", 1); + Параметры_.Вставить("is_multiple" , 0); + + Ответы = СтрСоединить(МассивОтветов, ""","""); + Ответы = "[""" + Ответы + """]"; + + Параметры_.Вставить("add_answers", Ответы); + Параметры_.Вставить("photo_id" , OPI_Инструменты.ЧислоВСтроку(IDФото)); + Параметры_.Вставить("question" , Вопрос); + + Опрос = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_); + ОпросСоответствие = Опрос.Получить(Response); + + Если Не ЗначениеЗаполнено(ОпросСоответствие) Тогда + Возврат Опрос; + КонецЕсли; + + OwnerId = ОпросСоответствие.Получить("owner_id"); + ObjectId = ОпросСоответствие.Получить("id"); + + Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда + Возврат Опрос; + КонецЕсли; + + ОпросID = "poll" + + OPI_Инструменты.ЧислоВСтроку(OwnerId) + + "_" + + OPI_Инструменты.ЧислоВСтроку(ObjectId); + + Параметры_.Вставить("attachments", ОпросID); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Создать альбом +// Создает альбом для хранения картинок +// +// Параметры: +// Наименование - Строка - Наименование альбома - title +// Описание - Строка - Описание альбома - description +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьАльбом(Знач Наименование, Знач Описание = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + Параметры_.Вставить("title" , Наименование); + Параметры_.Вставить("description" , Описание); + Параметры_.Вставить("upload_by_admins_only", 1); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.createAlbum", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Удалить альбом +// Удаляет ранее созданный альбом +// +// Параметры: +// IDАльбома - Строка,Число - ID альбома - album +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьАльбом(Знач IDАльбома, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("album_id", OPI_Инструменты.ЧислоВСтроку(IDАльбома)); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.deleteAlbum", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Создать историю +// Создает историю из картинки +// +// Параметры: +// Картинка - Строка,ДвоичныеДанные - Фон истории - picture +// URL - Строка - URL для кнопки под историей - url +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьИсторию(Знач Картинка, Знач URL = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("link_text" , "more"); + Параметры_.Вставить("link_url" , URL); + Параметры_.Вставить("add_to_news", "1"); + + Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "История"); + Возврат Ответ; + +КонецФункции + +// Сохранить картинку в альбом +// Сохраняет картинку в альбом сообщества +// +// Параметры: +// IDАльбома - Строка,Число - ID альбома - album +// Картинка - ДвоичныеДанные,Строка - Файл картинки - picture +// Описание - Строка - Описание картинки - description +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СохранитьКартинкуВАльбом(Знач IDАльбома, Знач Картинка, Знач Описание = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + Параметры_.Вставить("album_id", IDАльбома); + Параметры_.Вставить("caption" , Описание); + + Возврат ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Альбом"); + +КонецФункции + +// Удалить картинку +// Удалить картинку из альбома +// +// Параметры: +// IDКартинки - Строка,Число - ID картинки - pictureid +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьКартинку(Знач IDКартинки, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКартинки); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("photo_id", IDКартинки); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.delete", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Загрузить видео на сервер +// Загружает видео в группу с возможностью его дальнейшего использования +// +// Параметры: +// Видео - Строка, ДвоичныеДанные - Файл видео - file +// Наименование - Строка - Наименование видео - title +// Описание - Строка - Описание видео - description +// Альбом - Строка - ID альбома, если необходимо - album +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ЗагрузитьВидеоНаСервер(Знач Видео + , Знач Наименование + , Знач Описание = "" + , Знач Альбом = "" + , Знач Параметры = "") Экспорт + + Строка_ = "Строка"; + Параметры = ПолучитьСтандартныеПараметры(Параметры); + + OPI_Инструменты.ДобавитьПоле("name" , Наименование, Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("description", Описание , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("album_id" , Альбом , Строка_, Параметры); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/video.save", Параметры); + + Результат = Ответ["response"]; + + Если Не ЗначениеЗаполнено(Результат) Тогда + Возврат Ответ; + КонецЕсли; + + URL = Результат["upload_url"]; + + Если Не ЗначениеЗаполнено(URL) Тогда + Возврат Ответ; + КонецЕсли; + + СоответствиеФайлов = Новый Соответствие; + OPI_Инструменты.ДобавитьПоле("video_file.mp4", Видео, "ДвоичныеДанные", СоответствиеФайлов); + + РазмерДанных = СоответствиеФайлов["video_file.mp4"].Размер(); + РазмерДанных = OPI_Инструменты.ЧислоВСтроку(РазмерДанных); + + Ответ = OPI_Инструменты.PostMultipart(URL, , СоответствиеФайлов, "video/mp4"); + + Возврат Ответ; + +КонецФункции + +// Загрузить фото на сервер +// Загружает фото на сервер для его дальнейшего использования +// +// Параметры: +// Картинка - Строка, ДвоичныеДанные - Файл картинки - file +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// Вид - Строка - Вид загрузки (Пост, Товар, История, Опрос, Прочее) - type +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ЗагрузитьФотоНаСервер(Знач Картинка, Знач Параметры = "", Знач Вид = "Пост") Экспорт + + Параметры = ПолучитьСтандартныеПараметры(Параметры); + Метод = ОпределитьМетодЗагрузкиИзображений(Вид); + Файлы = Новый Соответствие; + + Response = "response"; + URL = "api.vk.com/method/"; + Загрузка = URL + Метод["Загрузка"]; + Сохранение = URL + Метод["Сохранение"]; + + Если ТипЗнч(Картинка) = Тип("Строка") Тогда + КлючКартинка = СтрЗаменить(Картинка, ".", "___"); + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка); + Иначе + КлючКартинка = "image___jpeg"; + КонецЕсли; + + Файлы.Вставить(КлючКартинка, Картинка); + + Для Н = 1 По 5 Цикл + + Ответ = OPI_Инструменты.Get(Загрузка, Параметры); + Результат = Ответ[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + + URL = Результат["upload_url"]; + + Если Не ЗначениеЗаполнено(URL) Тогда + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + + Параметры.Вставить("upload_url", URL); + Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, Файлы); + + Если ТипЗнч(Ответ) = Тип("Соответствие") Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Если ТипЗнч(Ответ) <> Тип("Соответствие") Тогда + Возврат ПолучитьСтрокуИзДвоичныхДанных(Ответ); + КонецЕсли; + + ЗаполнитьПараметрыЗагрузкиФото(Метод, Ответ, Параметры); + + Ответ = OPI_Инструменты.Get(Сохранение, Параметры); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСОбсуждениями + +// Создать обсуждение +// Создает новое обсуждение +// +// Параметры: +// Наименование - Строка - Наименование обсуждения - title +// ТекстПервогоСообщения - Строка - Текст первого сообщения - text +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьОбсуждение(Знач Наименование, Знач ТекстПервогоСообщения, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстПервогоСообщения); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("title", Наименование); + Параметры_.Вставить("text" , ТекстПервогоСообщения); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/board.addTopic", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Закрыть обсуждение +// Закрывает или удаляет обсуждение +// +// Параметры: +// IDОбсуждения - Строка,Число - ID обсуждения - topic +// УдалитьПолностью - Булево - Удалить полностью (Истина) или закрыть - remove +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ЗакрытьОбсуждение(Знач IDОбсуждения, Знач УдалитьПолностью = Ложь, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения); + OPI_ПреобразованиеТипов.ПолучитьБулево(УдалитьПолностью); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("topic_id", IDОбсуждения); + + Метод = ?(УдалитьПолностью, "deleteTopic", "closeTopic"); + Ответ = OPI_Инструменты.Get("api.vk.com/method/board." + Метод, Параметры_); + + Возврат Ответ; + +КонецФункции + +// Открыть обсуждение +// Открывает ранее закрытое обсуждение +// +// Параметры: +// IDОбсуждения - Строка,Число - ID обсуждения - topic +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ОткрытьОбсуждение(Знач IDОбсуждения, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("topic_id", IDОбсуждения); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/board.openTopic", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Написать в обсуждение +// Добавляет сообщение в обсуждение от имени группы +// +// Параметры: +// IDОбсуждения - Строка,Число - ID обсуждения - topic +// Текст - Строка - Текст сообщения - text +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция НаписатьВОбсуждение(Знач IDОбсуждения, Знач Текст, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("topic_id", IDОбсуждения); + Параметры_.Вставить("message" , Текст); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/board.createComment", Параметры_); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область ИнтерактивныеДействия + +// Поставить лайк +// Ставит лайк на пост +// +// Параметры: +// IDПоста - Строка,Число - ID поста - post +// IDСтены - Строка,Число - ID стены расположения поста - wall +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПоставитьЛайк(Знач IDПоста, Знач IDСтены = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + IDСтены = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]); + ОбъектВК = "wall" + IDСтены + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста); + + Параметры_.Вставить("type" , "post"); + Параметры_.Вставить("object" , ОбъектВК); + Параметры_.Вставить("item_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста)); + Параметры_.Вставить("owner_id" , OPI_Инструменты.ЧислоВСтроку(IDСтены)); + Параметры_.Вставить("from_group" , 0); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Сделать репост +// Делает репост записи +// +// Параметры: +// IDПоста - Строка,Число - ID поста - post +// IDСтены - Строка,Число - ID стены расположения поста - from +// ЦелеваяСтена - Строка,Число - ID целевой стены или группы - to +// Рекламный - Булево - Признак рекламного поста - ad +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СделатьРепост(Знач IDПоста + , Знач IDСтены = "" + , Знач ЦелеваяСтена = "" + , Знач Рекламный = Ложь + , Знач Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + GroupId = Параметры_["group_id"]; + + OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦелеваяСтена); + OPI_ПреобразованиеТипов.ПолучитьБулево(Рекламный); + + Источник = ?(ЗначениеЗаполнено(IDСтены), IDСтены, GroupId); + Приемник = ?(ЗначениеЗаполнено(ЦелеваяСтена), ЦелеваяСтена, GroupId); + + Параметры_.Вставить("object" , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста)); + Параметры_.Вставить("group_id" , СтрЗаменить(Приемник, "-", "")); + Параметры_.Вставить("mark_as_ads" , ?(Рекламный, 1, 0)); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.repost", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Написать сообщение +// Написать сообщение пользователю в диалоге сообщества +// +// Параметры: +// Текст - Строка - Текст сообщения - text +// IDПользователя - Строка - ID пользователя адресата - user +// Communitytoken - Строка - Токен бота чата сообщества, котрый можно получить в настройках - ct +// Клавиатура - Строка - JSON клавиатуры. См.СформироватьКлавиатуру - keyboard +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция НаписатьСообщение(Знач Текст + , Знач IDПользователя + , Знач Communitytoken + , Знач Клавиатура = "" + , Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Communitytoken); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("access_token", Communitytoken); + + Параметры_.Вставить("user_id" , IDПользователя); + Параметры_.Вставить("peer_id" , IDПользователя); + Параметры_.Вставить("parse_mode" , "Markdown"); + Параметры_.Вставить("random_id" , 0); + Параметры_.Вставить("message" , Текст); + + Если ЗначениеЗаполнено(Клавиатура) Тогда + Параметры_.Вставить("keyboard", Клавиатура); + КонецЕсли; + + Ответ = OPI_Инструменты.Get("api.vk.com/method/messages.send", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Написать комментарий +// Создает комментарий под выбранной записью +// +// Параметры: +// IDПоста - Строка,Число - ID целевого поста - post +// IDСтены - Строка,Число - ID стены расположения поста - wall +// Текст - Строка - Текст комментария - text +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция НаписатьКомментарий(Знач IDПоста, Знач IDСтены, Знач Текст, Знач Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + GroupId = Параметры_["group_id"]; + + OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + + Параметры_.Вставить("owner_id" , IDСтены); + Параметры_.Вставить("from_group" , GroupId); + Параметры_.Вставить("post_id" , IDПоста); + Параметры_.Вставить("message" , Текст); + + Параметры_.Удалить("group_id"); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.createComment", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Сократить ссылку +// Создает сокращенный URL из обычного +// +// Параметры: +// URL - Строка - URL для сокращения - url +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Строка - Сокращенный URL +Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); + + Response = "response"; + Параметры_ = Новый Структура; + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("url", URL); + + Ответ = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_); + Результат = Ответ[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + + URL = Результат["short_url"]; + + Если ЗначениеЗаполнено(URL) Тогда + Возврат URL; + Иначе + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + +КонецФункции + +#КонецОбласти + +#Область Статистика + +// Получить статистику +// Получает общую статистику сообщества за период +// +// Параметры: +// ДатаНачала - Дата - Дата начала периода - datefrom +// ДатаОкончания - Дата - Дата окончания периода - dateto +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПолучитьСтатистику(Знач ДатаНачала, Знач ДатаОкончания, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьДату(ДатаНачала); + OPI_ПреобразованиеТипов.ПолучитьДату(ДатаОкончания); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + ДатаНачала = OPI_Инструменты.UNIXTime(ДатаНачала); + ДатаОкончания = OPI_Инструменты.UNIXTime(ДатаОкончания); + + Параметры_.Вставить("timestamp_from", ДатаНачала); + Параметры_.Вставить("timestamp_to" , ДатаОкончания); + Параметры_.Вставить("stats_groups" , "visitors, reach, activity"); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/stats.get", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Получить статистику по постам +// Получает статистику в разрезе постов +// +// Параметры: +// МассивИДПостов - Массив из Строка,Число - Массив ID постов - posts +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Массив из Произвольный - Массив данных статистики по постам +Функция ПолучитьСтатистикуПостов(Знач МассивИДПостов, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИДПостов); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + МассивОтветов = Новый Массив; + МассивНабора = Новый Массив; + МаксимумПостов = 30; + Response = "response"; + + Для Каждого Пост Из МассивИДПостов Цикл + + МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост)); + + Если МассивНабора.Количество() = МаксимумПостов Тогда + + СтрокаНомеров = СтрСоединить(МассивНабора, ","); + Параметры_.Вставить("post_ids", СтрокаНомеров); + + Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_); + МассивСтатистики = Статистика[Response]; + + Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл + МассивОтветов.Добавить(ЭлементСтатистики); + КонецЦикла; + + МассивНабора = Новый Массив; + + КонецЕсли; + + КонецЦикла; + + СтрокаНомеров = СтрСоединить(МассивНабора, ","); + Параметры_.Вставить("post_ids", СтрокаНомеров); + + Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_); + МассивСтатистики = Статистика[Response]; + + Если ТипЗнч(МассивСтатистики) = Тип("Массив") Тогда + Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл + МассивОтветов.Добавить(ЭлементСтатистики); + КонецЦикла; + КонецЕсли; + + Возврат МассивОтветов; + +КонецФункции + +#КонецОбласти + +#Область РаботаСРекламнымКабинетом + +// Создать рекламную кампанию +// Создает кампанию в выбранном рекламном кабинете +// +// Параметры: +// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet +// Наименование - Строка - Наименование кампании - title +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьРекламнуюКампанию(Знач IDКабинета, Знач Наименование, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + КонечнаяДата = ДобавитьМесяц(ТекущаяДата, 24); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("account_id", IDКабинета); + + МассивСтруктур = Новый Массив; + ДатаСтарт = OPI_Инструменты.UNIXTime(ТекущаяДата); + ДатаСтоп = OPI_Инструменты.UNIXTime(КонечнаяДата); + + СтруктураКампании = Новый Структура; + СтруктураКампании.Вставить("type" , "promoted_posts"); + СтруктураКампании.Вставить("name" , Наименование); + СтруктураКампании.Вставить("day_limit" , 0); + СтруктураКампании.Вставить("all_limit" , 0); + СтруктураКампании.Вставить("start_time" , ДатаСтарт); + СтруктураКампании.Вставить("stop_time" , ДатаСтоп); + СтруктураКампании.Вставить("status" , 1); + + МассивСтруктур.Добавить(СтруктураКампании); + + JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур); + + Параметры_.Вставить("data", JSONДата); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createCampaigns", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Создать рекламное объявление +// Создает рекламное объявление на основе поста +// +// Параметры: +// НомерКампании - Строка,Число - ID рекламной кампании - campaign +// ДневнойЛимит - Строка,Число - Дневной лимит в рублях - limit +// НомерКатегории - Строка,Число - Номер рекламной категории - category +// IDПоста - Строка,Число - ID поста, используемого в качетсве рекламы - post +// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьРекламноеОбъявление(Знач НомерКампании + , Знач ДневнойЛимит + , Знач НомерКатегории + , Знач IDПоста + , Знач IDКабинета + , Знач Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + GroupId = Параметры_["group_id"]; + + OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId); + OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКампании); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ДневнойЛимит); + OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКатегории); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета); + + Линк = "https://vk.com/wall-" + GroupId + "_" + IDПоста; + + МассивСтруктур = Новый Массив; + СтруктураКампании = Новый Структура; + СтруктураКампании.Вставить("campaign_id" , НомерКампании); + СтруктураКампании.Вставить("ad_format" , 9); + СтруктураКампании.Вставить("conversion_event_id" , 1); + СтруктураКампании.Вставить("autobidding" , 1); + СтруктураКампании.Вставить("cost_type" , 3); + СтруктураКампании.Вставить("goal_type" , 2); + СтруктураКампании.Вставить("ad_platform" , "all"); + СтруктураКампании.Вставить("publisher_platforms" , "vk"); + СтруктураКампании.Вставить("publisher_platforms_auto" , "1"); + СтруктураКампании.Вставить("day_limit" , ДневнойЛимит); + СтруктураКампании.Вставить("all_limit" , "0"); + СтруктураКампании.Вставить("category1_id" , НомерКатегории); + СтруктураКампании.Вставить("age_restriction" , 0); + СтруктураКампании.Вставить("status" , 1); + СтруктураКампании.Вставить("name" , "Объявление"); + СтруктураКампании.Вставить("link_url" , Линк); + + МассивСтруктур.Добавить(СтруктураКампании); + + OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина); + + Параметры_.Вставить("data" , МассивСтруктур); + Параметры_.Вставить("account_id" , IDКабинета); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createAds", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Приостановить рекламное объявление +// Приостанавливает показ рекламного объявления +// +// Параметры: +// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet +// IDОбъявления - Строка,Число - ID объявления - adv +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПриостановитьРекламноеОбъявление(Знач IDКабинета, Знач IDОбъявления, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбъявления); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + Параметры_.Вставить("account_id", IDКабинета); + + МассивСтруктур = Новый Массив; + СтруктураКампании = Новый Структура; + + СтруктураКампании.Вставить("ad_id" , IDОбъявления); + СтруктураКампании.Вставить("status" , 0); + + МассивСтруктур.Добавить(СтруктураКампании); + + OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина); + + Параметры_.Вставить("data", МассивСтруктур); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.updateAds", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Получить список рекламных категорий +// Получает список id рекламных категорий для создания рекламного объявления +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПолучитьСписокРекламныхКатегорий(Знач Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСТоварами + +// Получить список категорий товаров +// Получает список ID товарных категорий для указания при создании товара +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из Строка - Ключ - ID, Значение - Имя +Функция ПолучитьСписокКатегорийТоваров(Знач Параметры = "") Экспорт + + Response = "response"; + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_); + Результат = Ответ[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + + Количество = Результат["count"]; + + Если Не ЗначениеЗаполнено(Количество) Тогда + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + + Параметры_.Вставить("count", Количество); + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_); + Результат = Ответ[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + + Категории = Результат["items"]; + + Если Не ЗначениеЗаполнено(Категории) Тогда + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + + СоответствиеКатегорий = Новый Соответствие; + + Для Каждого Категория Из Категории Цикл + СоответствиеКатегорий.Вставить(Категория["id"], Категория["name"]); + КонецЦикла; + + Возврат СоответствиеКатегорий; + +КонецФункции + +// Получить список товаров +// Получает список товаров сообщества +// +// Параметры: +// Подборка - Строка,Число - ID подборки, если нужен отбор - sel +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Массив соответствий товаров +Функция ПолучитьСписокТоваров(Знач Подборка = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("count" , 200); + Параметры_.Вставить("extended" , 1); + Параметры_.Вставить("with_disabled", 1); + + Если ЗначениеЗаполнено(Подборка) Тогда + Параметры_.Вставить("album_id", Подборка); + КонецЕсли; + + МассивТоваров = Новый Массив; + ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры_); + + Возврат МассивТоваров; + +КонецФункции + +// Получить товары по ID +// Получает информацию о товарах по массиву ID +// +// Параметры: +// Товары - Строка, Массив Из Строка - Массив ID товаров - items +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПолучитьТоварыПоИД(Знач Товары, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Товары); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + СтрокаТоваров = ""; + Owner = "owner_id"; + + Для Каждого Товар Из Товары Цикл + ТекущийТовар = Параметры_[Owner] + "_" + Товар; + ТекущийТовар = OPI_Инструменты.ЧислоВСтроку(ТекущийТовар); + СтрокаТоваров = СтрокаТоваров + ТекущийТовар + ","; + КонецЦикла; + + СтрокаТоваров = Лев(СтрокаТоваров, СтрДлина(СтрокаТоваров) - 1); + Параметры_.Вставить("item_ids", СтрокаТоваров); + Параметры_.Вставить("extended", 1); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getById", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Добавить товар +// Добавляет новый товар в каталог сообщества +// +// Параметры: +// ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь +// Подборка - Строка - ID подборка для помещения товара, если необходимо - sel +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ДобавитьТовар(Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт + Возврат УправлениеТоваром(ОписаниеТовара, , Подборка, Параметры); +КонецФункции + +// Изменить товар +// Изменяет ранее созданный товар +// +// Параметры: +// Товар - Число,Строка - Идентификатор изменяемого товара - item +// ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь +// Подборка - Строка - Идентификатор новой подборки, если необходимо - sel +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ИзменитьТовар(Знач Товар, Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт + Возврат УправлениеТоваром(ОписаниеТовара, Товар, Подборка, Параметры); +КонецФункции + +// Удалить товар +// Удаляет ранее созданный товар +// +// Параметры: +// Товар - Строка,Число - ID товара - item +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьТовар(Знач Товар, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("item_id", Товар); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.delete", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Сгруппировать товары +// Группирует товары на основе одинаковых наборов свойств +// +// Параметры: +// МассивТоваров - Массив Из Строка - Массив ID товаров - items +// СуществующаяГруппа - Строка - ID существующей группы, если необходимо - sellgroup +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СгруппироватьТовары(Знач МассивТоваров, Знач СуществующаяГруппа = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(СуществующаяГруппа); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + МассивТоваров_ = Новый Массив; + + Для Каждого Товар Из МассивТоваров Цикл + МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар)); + КонецЦикла; + + Товары = СтрСоединить(МассивТоваров_, ","); + + Параметры_.Вставить("item_ids", Товары); + + Если ЗначениеЗаполнено(СуществующаяГруппа) Тогда + Параметры_.Вставить("item_group_id", СуществующаяГруппа); + КонецЕсли; + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.groupItems", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Получить описание товара. !NOCLI +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Пустое описание товара: +// *Имя - Строка - Имя товара +// *Описание - Строка - Описание товара +// *Категория - Строка - См. ПолучитьСписокКатегорийТоваров +// *Цена - Число - Цена товара +// *СтараяЦена - Число - Для отображения скидки/изменения цены +// *ОсновноеФото - Строка,ДвоичныеДанные - Двоичные данные или путь к фото +// *URL - Строка - Ссылка на страницу сайта магазина +// *ДополнительныеФото - Массив Из Строка - Двоичные данные или пути к фото +// *ЗначенияСвойств - Массив Из Строка - См.ДобавитьВариантСвойстваТовара +// *ГлавныйВГруппе - Булево - Главный в группе, если есть в группе +// *Ширина - Число - Ширина товара в мм. +// *Высота - Число - Высота товара в мм. +// *Глубина - Число - Глубина товара в мм. +// *Вес - Число - Вес в гр. +// *SKU - Строка - SKU +// *ДоступныйОстаток - Число - Остаток. -1 - не ограничено +Функция ПолучитьОписаниеТовара() Экспорт + + Товар = Новый Соответствие(); + Товар.Вставить("Имя" , "Новый товар"); // Имя товара + Товар.Вставить("Описание" , "Описание товара"); // Описание товара + Товар.Вставить("Категория" , "20173"); // См ПолучитьСписокКатегорийТоваров() + Товар.Вставить("Цена" , 1); // Цена. + Товар.Вставить("СтараяЦена" , Неопределено); // Для отражения изменения цены + Товар.Вставить("ОсновноеФото" , Неопределено); // ДД или путь к осн. фото + Товар.Вставить("URL" , Неопределено); // Ссылка на страницу магазина + Товар.Вставить("ДополнительныеФото" , Новый Массив); // Массив путей или ДД для доп. фото + Товар.Вставить("ЗначенияСвойств" , Новый Массив); // Значения свойств (варианты). Максимум 2 + Товар.Вставить("ГлавныйВГруппе" , Ложь); // Сделать главным в своей группе + Товар.Вставить("Ширина" , Неопределено); // В миллиметрах + Товар.Вставить("Высота" , Неопределено); // В миллиметрах + Товар.Вставить("Глубина" , Неопределено); // В миллиметрах + Товар.Вставить("Вес" , Неопределено); // В граммах + Товар.Вставить("SKU" , Неопределено); // Артикул + Товар.Вставить("ДоступныйОстаток" , 1); + + Возврат Товар; + +КонецФункции + +#КонецОбласти + +#Область РаботаСПодборкамиТоваров + +// Получить список подборок +// Получает список подборок товаров +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Массив соответствий подборок +Функция ПолучитьСписокПодборок(Знач Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("count", 100); + + МассивАльбомов = Новый Массив; + ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры_); + + Возврат МассивАльбомов; + +КонецФункции + +// Получить подборки по ID +// Получить список подборок по массиву ID +// +// Параметры: +// Подборки - Строка, Массив Из Строка - ID подборок - sels +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПолучитьПодборкиПоИД(Знач Подборки, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Подборки); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Подборки_ = Новый Массив; + СтрокаПодборок = ""; + + Для Каждого Подборка Из Подборки Цикл + Подборки_.Добавить(OPI_Инструменты.ЧислоВСтроку(Подборка)); + КонецЦикла; + + СтрокаПодборок = СтрСоединить(Подборки_, ","); + + Параметры_.Вставить("album_ids", СтрокаПодборок); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbumById", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Создать подборку товаров +// Создает пустую подборку товаров +// +// Параметры: +// Название - Строка - Название подборки - title +// Картинка - Строка,ДвоичныеДанные - Файл картинки - picture +// Основная - Булево - Основная - main +// Скрытая - Булево - Скрытая - hidden +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьПодборкуТоваров(Знач Название + , Знач Картинка + , Знач Основная = Ложь + , Знач Скрытая = Ложь + , Знач Параметры = "") Экспорт + + Возврат УправлениеПодборкой(Название, Картинка, , Основная, Скрытая, Параметры); + +КонецФункции + +// Изменить подборку товаров +// Изменяет свойства подборки товаров +// +// Параметры: +// Название - Строка - Новое название подборки - title +// Подборка - Строка - ID подборки - sel +// Картинка - Строка,ДвоичныеДанные - Новая картинка подборки - picture +// Основная - Булево - Основная - main +// Скрытая - Булево - Скрытая - hidden +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ИзменитьПодборкуТоваров(Знач Название + , Знач Подборка + , Знач Картинка = "" + , Знач Основная = Ложь + , Знач Скрытая = Ложь + , Знач Параметры = "") Экспорт + + Возврат УправлениеПодборкой(Название, Картинка, Подборка, Основная, Скрытая, Параметры); + +КонецФункции + +// Добавить товар в подборку +// Добавляет товар в подборку +// +// Параметры: +// МассивТоваров - Массив из Строка, Число - Массив товаров или товар - items +// Подборка - Строка - ID подборки - sel +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ДобавитьТоварВПодборку(Знач МассивТоваров, Знач Подборка, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + МассивТоваров_ = Новый Массив; + + Для Каждого Товар Из МассивТоваров Цикл + МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар)); + КонецЦикла; + + СписокТоваров = СтрСоединить(МассивТоваров_, ","); + + Параметры_.Вставить("item_ids" , СписокТоваров); + Параметры_.Вставить("album_ids", Подборка); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addToAlbum", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Удалить товар из подборки +// Удаляет ранее добавленный товар из подборки +// +// Параметры: +// Товар - Строка - ID товара - item +// Подборка - Строка - ID подборки - sel +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьТоварИзПодборки(Знач Товар, Знач Подборка, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + Параметры_.Вставить("item_id" , Товар); + Параметры_.Вставить("album_ids", Подборка); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.removeFromAlbum", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Удалить подборку +// Удаляет подборку по ID +// +// Параметры: +// Подборка - Строка - ID подборки - sel +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьПодборку(Знач Подборка, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("album_id", Подборка); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteAlbum", Параметры_); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСоСвойствамиТоваров + +// Получить список свойств +// Получает список свойств товаров группы +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПолучитьСписокСвойств(Знач Параметры = "") Экспорт + + Response = "response"; + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getProperties", Параметры_); + Свойства = Ответ[Response]["items"]; + + Возврат Свойства; + +КонецФункции + +// Создать свойство товара +// Создает новое свойство для использования в товарах +// +// Параметры: +// Название - Строка - Название свойства - title +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьСвойствоТовара(Знач Название, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Название); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("title", Название); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addProperty", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Изменить свойство товара +// Изменяет существующее свойство товара +// +// Параметры: +// Название - Строка - Новое название - title +// Свойство - Строка,Число - ID свойства - prop +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ИзменитьСвойствоТовара(Знач Название, Знач Свойство, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Название); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("title" , Название); + Параметры_.Вставить("property_id", Свойство); + Параметры_.Вставить("type" , "text"); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editProperty", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Удалить свойство товара +// Удаляет существующее свойство товара +// +// Параметры: +// Свойство - Строка,Число - ID свойства - prop +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьСвойствоТовара(Знач Свойство, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("property_id", Свойство); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteProperty", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Добавить вариант свойства товара +// Добавляет вариант для существующего свойства +// +// Параметры: +// Значение - Строка - Значение свойства - value +// Свойство - Строка,Число - ID свойства, куда добавляется вариант - prop +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ДобавитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("property_id", Свойство); + Параметры_.Вставить("title" , Значение); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addPropertyVariant", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Изменить вариант свойства товара +// Изменяет значение варианта существующего свойства товара +// +// Параметры: +// Значение - Строка - Новое значение свойства - value +// Свойство - Строка,Число - ID свойства - prop +// Вариант - Строка,Число - ID варианта - option +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ИзменитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Вариант, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("property_id", Свойство); + Параметры_.Вставить("variant_id" , Вариант); + Параметры_.Вставить("title" , Значение); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editPropertyVariant", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Удалить вариант свойства товара +// Удаляет ранее созданный вариант свойства +// +// Параметры: +// Вариант - Строка,Число - ID варианта - option +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьВариантСвойстваТовара(Знач Вариант, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("variant_id", Вариант); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deletePropertyVariant", Параметры_); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСЗаказами + +// Получить список заказов +// Возвращает список заказов сообщества +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПолучитьСписокЗаказов(Знач Параметры = "") Экспорт + + Параметры = ПолучитьСтандартныеПараметры(Параметры); + Параметры.Вставить("count", 50); + + МассивЗаказов = Новый Массив; + ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры); + + Возврат МассивЗаказов; + +КонецФункции + +#КонецОбласти + +#Область Прочие + +// Сформировать клавиатуру +// Формирует клавиатуру по массиву кнопок +// +// Параметры: +// МассивКнопок - Массив из Строка - Массив заголовков кнопок - buttons +// +// Возвращаемое значение: +// Строка - JSON клавиатуры +Функция СформироватьКлавиатуру(Знач МассивКнопок) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); + + Клавиатура = Новый Структура; + МассивКлавиатуры = Новый Массив; + МассивБлока = Новый Массив; + + Для Каждого Действие Из МассивКнопок Цикл + + Кнопка = Новый Структура; + Выражение = Новый Структура; + + Выражение.Вставить("type" , "text"); + Выражение.Вставить("label", Действие); + + Кнопка.Вставить("action", Выражение); + МассивБлока.Добавить(Кнопка); + + КонецЦикла; + + МассивКлавиатуры.Добавить(МассивБлока); + + Клавиатура.Вставить("buttons" , МассивКлавиатуры); + Клавиатура.Вставить("one_time", Ложь); + + Возврат OPI_Инструменты.JSONСтрокой(Клавиатура); + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьСтандартныеПараметры(Знач Параметры = "") + + // Здесь собрано определение данных для работы с VK API + // Вы можете переопределять их, передавая в качестве параметра + // Совпадающие поля будут перезаписаны с приоритетом параметра функции + + Параметры_ = Новый Структура; + + // access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена() + // from_group - действия будут выполняться от лица группы + // owner_id - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был + // установлен свой + // app_id - id приложения, которое необходимо создать в профиле на странице для разработчиков + // group_id - owner_id, но без "-" + + Параметры_.Вставить("access_token" , ""); + Параметры_.Вставить("from_group" , "1"); + Параметры_.Вставить("owner_id" , ""); + Параметры_.Вставить("v" , "5.131"); + Параметры_.Вставить("app_id" , ""); + Параметры_.Вставить("group_id" , ""); + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры); + + Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда + Для Каждого ПереданныйПараметр Из Параметры Цикл + Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение)); + КонецЦикла; + КонецЕсли; + + Возврат Параметры_; + +КонецФункции + +Функция ПолучитьИДКартинки(Знач Картинка, Знач Параметры, Знач Вид) + + Response = "response"; + Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид); + Результат = Ответ[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + ИДФото = Результат["photo_id"]; + + Если Не ЗначениеЗаполнено(ИДФото) Тогда + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + + ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото); + Возврат ИДФото; + +КонецФункции + +Функция ПолучитьСоответствиеКартинки(Знач Картинка, Знач Параметры, Знач Вид) + + Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид); + ОтветМассив = Ответ.Получить("response"); + + Если Не ЗначениеЗаполнено(ОтветМассив) Или Не ТипЗнч(ОтветМассив) = Тип("Массив") Тогда + Возврат Ответ; + Иначе + Если ОтветМассив.Количество() = 0 Тогда + Возврат Ответ; + Иначе + ОтветСоответствие = ОтветМассив[0]; + КонецЕсли; + КонецЕсли; + + Возврат ОтветСоответствие; + +КонецФункции + +Функция ПолучитьМассивПодборок(Знач Подборки, Знач Параметры = "") + + Response = "response"; + Подборки = ПолучитьПодборкиПоИД(Подборки, Параметры); + Результат = Подборки[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + + МассивПодборок = Результат["items"]; + + Если Не ЗначениеЗаполнено(МассивПодборок) Тогда + Возврат Подборки; + КонецЕсли; + + Иначе + Возврат Подборки; + КонецЕсли; + + Возврат МассивПодборок; + +КонецФункции + +Функция ОпределитьМетодЗагрузкиИзображений(Знач Вид) + + СоответствиеМетодов = Новый Соответствие; + Загрузка = "Загрузка"; + Сохранение = "Сохранение"; + Способ = "Способ"; + Фото = "Фото"; + + Если Вид = "Пост" Тогда + + СоответствиеМетодов.Вставить(Загрузка , "photos.getWallUploadServer"); + СоответствиеМетодов.Вставить(Сохранение, "photos.saveWallPhoto"); + СоответствиеМетодов.Вставить(Фото , "photo"); + СоответствиеМетодов.Вставить(Способ , 1); + + ИначеЕсли Вид = "Товар" Тогда + + СоответствиеМетодов.Вставить(Загрузка , "market.getProductPhotoUploadServer"); + СоответствиеМетодов.Вставить(Сохранение, "market.saveProductPhoto"); + СоответствиеМетодов.Вставить(Способ , 2); + + ИначеЕсли Вид = "История" Тогда + + СоответствиеМетодов.Вставить(Загрузка , "stories.getPhotoUploadServer"); + СоответствиеМетодов.Вставить(Сохранение, "stories.save"); + СоответствиеМетодов.Вставить(Способ , 3); + + ИначеЕсли Вид = "Опрос" Тогда + + СоответствиеМетодов.Вставить(Загрузка , "polls.getPhotoUploadServer"); + СоответствиеМетодов.Вставить(Сохранение, "polls.savePhoto"); + СоответствиеМетодов.Вставить(Фото , "photo"); + СоответствиеМетодов.Вставить(Способ , 1); + + Иначе + + СоответствиеМетодов.Вставить(Загрузка , "photos.getUploadServer"); + СоответствиеМетодов.Вставить(Сохранение, "photos.save"); + СоответствиеМетодов.Вставить(Фото , "photos_list"); + СоответствиеМетодов.Вставить(Способ , 1); + + КонецЕсли; + + Возврат СоответствиеМетодов; + +КонецФункции + +Функция ПолучитьСоответствиеПараметровТовара() + + Поля = Новый Соответствие(); + Поля.Вставить("Имя" , "name"); + Поля.Вставить("Описание" , "description"); + Поля.Вставить("Категория" , "category_id"); + Поля.Вставить("Цена" , "price"); + Поля.Вставить("СтараяЦена" , "old_price"); + Поля.Вставить("URL" , "url"); + Поля.Вставить("ГлавныйВГруппе" , "is_main_variant"); + Поля.Вставить("Ширина" , "dimension_width"); + Поля.Вставить("Высота" , "dimension_height"); + Поля.Вставить("Глубина" , "dimension_length"); + Поля.Вставить("Вес" , "weight"); + Поля.Вставить("SKU" , "sku"); + Поля.Вставить("ДоступныйОстаток" , "stock_amount"); + + Возврат Поля; + +КонецФункции + +Функция УправлениеТоваром(Знач ОписаниеТовара, Знач ИДТовара = "", Знач Подборка = "", Знач Параметры = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДТовара); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеТовара); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("v", "5.199"); + + Response = "response"; + + ЗаполнитьПоляЗапросаТовара(ОписаниеТовара, Параметры_); + + Если ЗначениеЗаполнено(ИДТовара) Тогда + Параметры_.Вставить("item_id", ИДТовара); + Метод = "edit"; + Иначе + Метод = "add"; + КонецЕсли; + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_); + Результат = Ответ[Response]; + + Если Не ЗначениеЗаполнено(ИДТовара) И ЗначениеЗаполнено(Результат) Тогда + + ИДТовара = Результат["market_item_id"]; + + Если Не ЗначениеЗаполнено(ИДТовара) Тогда + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + + Если ЗначениеЗаполнено(Подборка) И ЗначениеЗаполнено(ИДТовара) Тогда + ДобавитьТоварВПодборку(ИДТовара, Подборка, Параметры_); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция УправлениеПодборкой(Знач Название + , Знач Картинка = "" + , Знач ИДПодборки = "" + , Знач Основная = Ложь + , Знач Скрытая = Ложь + , Знач Параметры = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Название); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПодборки); + OPI_ПреобразованиеТипов.ПолучитьБулево(Основная); + OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытая); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Ответ = ДобавитьПараметрКартинки(Картинка, ИДПодборки, Параметры_); + + Если ЗначениеЗаполнено(Ответ) Тогда + Возврат Ответ; + КонецЕсли; + + Параметры_.Вставить("title" , Название); + Параметры_.Вставить("main_album" , ?(Основная, 1, 0)); + Параметры_.Вставить("is_hidden" , ?(Скрытая, 1, 0)); + + Если ЗначениеЗаполнено(ИДПодборки) Тогда + Параметры_.Вставить("album_id", ИДПодборки); + Метод = "editAlbum"; + Иначе + Метод = "addAlbum"; + КонецЕсли; + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_); + + Возврат Ответ; + +КонецФункции + +Функция ДобавитьПараметрКартинки(Знач Картинка, Знач ИДПодборки, Параметры) + + PhotoID = "photo_id"; + + Если ЗначениеЗаполнено(Картинка) Тогда + + ИДФото = ПолучитьИДКартинки(Картинка, Параметры, "Товар"); + + Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда + Возврат ИДФото; + КонецЕсли; + + Параметры.Вставить(PhotoID, ИДФото); + + Иначе + + Если ЗначениеЗаполнено(ИДПодборки) Тогда + + Подборки = ПолучитьМассивПодборок(ИДПодборки, Параметры); + + Если Не ТипЗнч(Подборки) = Тип("Массив") Тогда + Возврат Подборки; + КонецЕсли; + + Если Не Подборки.Количество() = 0 Тогда + ИДФото = Подборки[0]["photo"]["id"]; + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДФото); + Параметры.Вставить(PhotoID, ИДФото); + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Возврат ""; + +КонецФункции + +Процедура ЗаполнитьПараметрыЗагрузкиФото(Знач Метод, Знач Ответ, Параметры) + + Response = "response"; + Способ = Метод["Способ"]; + СтандартныйСпособ = 1; + НовыйСпособ = 2; + + Если Способ = СтандартныйСпособ Тогда + + Hash = "hash"; + Serv = "server"; + Aid = "aid"; + Фото = Метод["Фото"]; + + Параметры.Вставить(Hash, Ответ[Hash]); + Параметры.Вставить(Фото, Ответ[Фото]); + + СерверФото = Ответ.Получить(Serv); + + Если ЗначениеЗаполнено(СерверФото) Тогда + СерверФото = OPI_Инструменты.ЧислоВСтроку(СерверФото); + Параметры.Вставить(Serv, СерверФото); + КонецЕсли; + + Идентификатор = Ответ.Получить(Aid); + + Если ЗначениеЗаполнено(Идентификатор) Тогда + Идентификатор = OPI_Инструменты.ЧислоВСтроку(Идентификатор); + Параметры.Вставить(Aid , Идентификатор); + КонецЕсли; + + ИначеЕсли Способ = НовыйСпособ Тогда + + ОтветСтрокой = OPI_Инструменты.JSONСтрокой(Ответ); + Параметры.Вставить("upload_response", ОтветСтрокой); + + Иначе + + Параметры.Вставить("upload_results", Ответ[Response]["upload_result"]); + + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаполнитьПоляЗапросаТовара(Знач ОписаниеТовара, Параметры) + + Response = "response"; + ОсновноеФото = ОписаниеТовара["ОсновноеФото"]; + ДопФото = ОписаниеТовара["ДополнительныеФото"]; + Свойства = ОписаниеТовара["ЗначенияСвойств"]; + + Если ЗначениеЗаполнено(ОсновноеФото) Тогда + + Ответ = ЗагрузитьФотоНаСервер(ОсновноеФото, Параметры, "Товар"); + Результат = Ответ[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + ИДФото = Результат["photo_id"]; + + Если Не ЗначениеЗаполнено(ИДФото) Тогда + Возврат; + КонецЕсли; + + Иначе + Возврат; + КонецЕсли; + + ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото); + Параметры.Вставить("main_photo_id", ИДФото); + + КонецЕсли; + + Если ТипЗнч(Свойства) = Тип("Массив") Тогда + + Свойства_ = Новый Массив; + + Для Каждого Свойство Из Свойства Цикл + Свойства_.Добавить(OPI_Инструменты.ЧислоВСтроку(Свойство)); + КонецЦикла; + + Свойства = СтрСоединить(Свойства_, ","); + + КонецЕсли; + + Если ЗначениеЗаполнено(Свойства) Тогда + Параметры.Вставить("variant_ids", OPI_Инструменты.ЧислоВСтроку(Свойства)); + КонецЕсли; + + ДобавитьДополнительныеФотоТовара(ДопФото, Параметры); + + Для Каждого Поле Из ПолучитьСоответствиеПараметровТовара() Цикл + + Значение = ОписаниеТовара[Поле.Ключ]; + + Если Значение <> Неопределено Тогда + Параметры.Вставить(Поле.Значение, ОписаниеТовара[Поле.Ключ]); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьДополнительныеФотоТовара(Знач МассивФото, Параметры) + + Если ТипЗнч(МассивФото) = Тип("Массив") Тогда + Если МассивФото.Количество() > 0 Тогда + + СтрокаФотографий = ""; + + Для Каждого Фото Из МассивФото Цикл + + ИДФото = ПолучитьИДКартинки(Фото, Параметры, "Товар"); + + Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда + Возврат; + КонецЕсли; + + СтрокаФотографий = СтрокаФотографий + ИДФото + ","; + + КонецЦикла; + + СтрокаФотографий = Лев(СтрокаФотографий, СтрДлина(СтрокаФотографий) - 1); + Параметры.Вставить("photo_ids", СтрокаФотографий); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг = 0) + + Response = "response"; + МаксимумВЗапросе = 200; + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.get", Параметры); + Товары = Ответ[Response]["items"]; + + Если Товары.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого Товар Из Товары Цикл + МассивТоваров.Добавить(Товар); + КонецЦикла; + + Сдвиг = Сдвиг + МаксимумВЗапросе; + Параметры.Вставить("offset", Сдвиг); + ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг); + +КонецПроцедуры + +Процедура ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг = 0) + + Response = "response"; + МаксимумВЗапросе = 100; + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbums", Параметры); + Альбомы = Ответ[Response]["items"]; + + Если Альбомы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого Альбом Из Альбомы Цикл + МассивАльбомов.Добавить(Альбом); + КонецЦикла; + + Сдвиг = Сдвиг + МаксимумВЗапросе; + Параметры.Вставить("offset", Сдвиг); + ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг); + +КонецПроцедуры + +Процедура ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг = 0) + + Response = "response"; + МаксимумВЗапросе = 50; + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getGroupOrders", Параметры); + Заказы = Ответ[Response]["items"]; + + Если Заказы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого Заказ Из Заказы Цикл + МассивЗаказов.Добавить(Заказ); + КонецЦикла; + + Сдвиг = Сдвиг + МаксимумВЗапросе; + Параметры.Вставить("offset", Сдвиг); + ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг); + +КонецПроцедуры + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_Viber.os b/ru/OInt/core/Modules/OPI_Viber.os index 7443cbf692..1d2dd91c96 100644 --- a/ru/OInt/core/Modules/OPI_Viber.os +++ b/ru/OInt/core/Modules/OPI_Viber.os @@ -1,414 +1,414 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Viber.os -// Библиотека: Viber -// Команда CLI: viber - -// 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:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область НастройкиИИнформация - -// Установить Webhook -// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL, -// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована -// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях -// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать -// -// Параметры: -// Токен - Строка - Токен Viber - token -// URL - Строка - URL для установки Webhook - url -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber -Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("url" , URL , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("auth_token" , Токен, "Строка", Параметры); - - Возврат OPI_Инструменты.Post("https://chatapi.viber.com/pa/set_webhook", Параметры); - -КонецФункции - -// Получить информацию о канале -// Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook -// ID пользователя из информации о канале не подойдет для отправки сообщений через бота - они разные -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber -Функция ПолучитьИнформациюОКанале(Знач Токен) Экспорт - - URL = "https://chatapi.viber.com/pa/get_account_info"; - Возврат OPI_Инструменты.Get(URL, , ТокенВЗаголовки(Токен)); - -КонецФункции - -// Получить данные пользователя -// Получает информацию о пользователе по ID -// -// Параметры: -// Токен - Строка - Токен - token -// IDПользователя - Строка, Число - ID пользователя Viber - user -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber -Функция ПолучитьДанныеПользователя(Знач Токен, Знач IDПользователя) Экспорт - - URL = "https://chatapi.viber.com/pa/get_user_details"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("id", IDПользователя, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен)); - - Возврат Ответ; - -КонецФункции - -// Получить онлайн пользователей -// Получает статус пользователя или нескольких пользователей по ID -// -// Параметры: -// Токен - Строка - Токен Viber - token -// IDПользователей - Строка,Число,Массив из Строка,Число - ID пользователей(я) Viber - users -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber -Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт - - URL = "https://chatapi.viber.com/pa/get_online"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("ids", IDПользователей, "Коллекция", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен)); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область ОтправкаСообщений - -// Отправить текстовое сообщение -// Отправляет текстовое сообщение в чат или канал -// -// Параметры: -// Токен - Строка - Токен - token -// Текст - Строка - Текст сообщения - text -// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user -// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel -// Клавиатура - Структура из Строка - См. СформироватьКлавиатуруИзМассиваКнопок - keyboard -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber -Функция ОтправитьТекстовоеСообщение(Знач Токен - , Знач Текст - , Знач IDПользователя - , Знач ОтправкаВКанал - , Знач Клавиатура = "") Экспорт - - Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура); - -КонецФункции - -// Отправить картинку -// Отправляет картинку в чат или канал -// -// Параметры: -// Токен - Строка - Токен - token -// URL - Строка - URL картинки - picture -// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user -// ОтправкаВКанал - булево - Отправка в канал или в чат бота - ischannel -// Описание - Строка - Аннотация к картинке - description -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber -Функция ОтправитьКартинку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Описание = "") Экспорт - - Возврат ОтправитьСообщение(Токен, "picture", IDПользователя, ОтправкаВКанал, URL, Описание); - -КонецФункции - -// Отправить файл -// Отправляет файл (документ) в чат или канал -// -// Параметры: -// Токен - Строка - Токен - token -// URL - Строка - URL файла - file -// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user -// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel -// Расширение - Строка - Расширение файла - ext -// Размер - Число - Размер файла. Если не заполнен > определяется автоматически скачиванием файла - size -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber -Функция ОтправитьФайл(Знач Токен - , Знач URL - , Знач IDПользователя - , Знач ОтправкаВКанал - , Знач Расширение - , Знач Размер = "") Экспорт - - Если Не ЗначениеЗаполнено(Размер) Тогда - - Ответ = OPI_Инструменты.Get(URL); - Размер = Ответ.Размер(); - - КонецЕсли; - - Строка_ = "Строка"; - Расширение = СтрЗаменить(Расширение, ".", ""); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("URL" , URL , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("Размер" , Размер , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("Расширение", Расширение, Строка_, Параметры); - - Возврат ОтправитьСообщение(Токен, "file", IDПользователя, ОтправкаВКанал, Параметры); - -КонецФункции - -// Отправить контакт -// Отправляет контакт с номером телефона в чат или канал -// -// Параметры: -// Токен - Строка - Токен - token -// ИмяКонтакта - Строка - Имя контакта - name -// НомерТелефона - Строка - Номер телефона - phone -// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user -// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber -Функция ОтправитьКонтакт(Знач Токен - , Знач ИмяКонтакта - , Знач НомерТелефона - , Знач IDПользователя - , Знач ОтправкаВКанал) Экспорт - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("name" , ИмяКонтакта , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("phone_number", НомерТелефона, "Строка", Параметры); - - Возврат ОтправитьСообщение(Токен, "contact", IDПользователя, ОтправкаВКанал, Параметры); - -КонецФункции - -// Отправить локацию -// Отправляет географические координаты в чат или канал -// -// Параметры: -// Токен - Строка - Токен - token -// Широта - Строка,Число - Географическая широта - lat -// Долгота - Строка,Число - Географическая долгота - long -// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user -// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber -Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("lat", Широта , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("lon", Долгота, "Строка", Параметры); - - Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, Параметры); - -КонецФункции - -// Отправить ссылку -// Отправляет URL с предпросмотром в чат или канал -// -// Параметры: -// Токен - Строка - Токен - token -// URL - Строка - Отправляемая ссылка - url -// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user -// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber -Функция ОтправитьСсылку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт - - Возврат ОтправитьСообщение(Токен, "url", IDПользователя, ОтправкаВКанал, URL); - -КонецФункции - -// Сформировать клавиатуру из массива кнопок -// Возвращает структура клавиатуры для сообщений -// -// Параметры: -// МассивКнопок - Массив из Строка - Массив кнопок - buttons -// ЦветКнопок - Строка - HEX цвет кнопок с # в начале - color -// -// Возвращаемое значение: -// Структура - Сформировать клавиатуру из массива кнопок: -// * Buttons - Массив из Структура - Массив сформированных кнопок -// * Type - Строка - Тип клавиатуры -Функция СформироватьКлавиатуруИзМассиваКнопок(Знач МассивКнопок, Знач ЦветКнопок = "#2db9b9") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦветКнопок); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); - - МассивСтруктурКнопок = Новый Массив; - СтруктураКлавиатуры = Новый Структура; - - Для Каждого ТекстКнопки Из МассивКнопок Цикл - - СтруктураКнопки = Новый Структура; - СтруктураКнопки.Вставить("ActionType", "reply"); - СтруктураКнопки.Вставить("ActionBody", ТекстКнопки); - СтруктураКнопки.Вставить("Text" , ТекстКнопки); - СтруктураКнопки.Вставить("BgColor" , ЦветКнопок); - СтруктураКнопки.Вставить("Coloumns" , 3); - - МассивСтруктурКнопок.Добавить(СтруктураКнопки); - - КонецЦикла; - - СтруктураКлавиатуры.Вставить("Buttons", МассивСтруктурКнопок); - СтруктураКлавиатуры.Вставить("Type" , "keyboard"); - - Возврат СтруктураКлавиатуры; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Отправить сообщение. -// -// Параметры: -// Токен - Строка - Токен -// Тип - Строка - Тип отправляемого сообщения -// IDПользователя - Строка,Число - ID пользователя Viber -// ЭтоКанал - Булево - Отправка в канал или чат с ботом -// Значение - Строка, Структура - Значение: -// * URL - Строка - При отправке URL -// * Размер - Число, Строка - Размер файла в случае отправке -// * Расширение - Строка - Расширение файла в случае отправки -// Текст - Строка - Текст сообщения -// Клавиатура - Структура из Строка - Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок -// -// Возвращаемое значение: -// Произвольный, HTTPОтвет - Отправить сообщение -Функция ОтправитьСообщение(Знач Токен - , Знач Тип - , Знач IDПользователя - , Знач ЭтоКанал - , Знач Значение = "" - , Знач Текст = "" - , Знач Клавиатура = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоКанал); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Клавиатура); - - СтруктураПараметров = ВернутьСтандартныеПараметры(); - СтруктураПараметров.Вставить("type", Тип); - - Если (Тип = "text" Или Тип = "picture") И ЗначениеЗаполнено(Текст) Тогда - СтруктураПараметров.Вставить("text", Текст); - КонецЕсли; - - Если ТипЗнч(Клавиатура) = Тип("Структура") Тогда - СтруктураПараметров.Вставить("keyboard", Клавиатура); - КонецЕсли; - - Если ЗначениеЗаполнено(Значение) Тогда - - Если Тип = "file" Тогда - СтруктураПараметров.Вставить("media" , Значение["URL"]); - СтруктураПараметров.Вставить("size" , Значение["Размер"]); - СтруктураПараметров.Вставить("file_name", "Файл." + Значение["Расширение"]); - ИначеЕсли Тип = "contact" Тогда - СтруктураПараметров.Вставить("contact" , Значение); - ИначеЕсли Тип = "location" Тогда - СтруктураПараметров.Вставить("location" , Значение); - Иначе - СтруктураПараметров.Вставить("media" , Значение); - КонецЕсли; - - КонецЕсли; - - Если ЭтоКанал Тогда - СтруктураПараметров.Вставить("from", IDПользователя); - URL = "https://chatapi.viber.com/pa/post"; - Иначе - СтруктураПараметров.Вставить("receiver", IDПользователя); - URL = "https://chatapi.viber.com/pa/send_message"; - КонецЕсли; - - Ответ = OPI_Инструменты.Post(URL, СтруктураПараметров, ТокенВЗаголовки(Токен)); - - Попытка - Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные()); - Исключение - Возврат Ответ; - КонецПопытки; - -КонецФункции - -Функция ВернутьСтандартныеПараметры() - - СтруктураОтправителя = Новый Структура; - СтруктураОтправителя.Вставить("name" , "Bot"); - СтруктураОтправителя.Вставить("avatar", ""); - - СтруктураПараметров = Новый Структура; - СтруктураПараметров.Вставить("sender", СтруктураОтправителя); - СтруктураПараметров.Вставить("min_api_version", 1); - - Возврат СтруктураПараметров; - -КонецФункции - -Функция ТокенВЗаголовки(Знач Токен) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - СтруктураЗаголовков = Новый Соответствие; - СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен); - Возврат СтруктураЗаголовков; - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Viber.os +// Библиотека: Viber +// Команда CLI: viber + +// 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:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область НастройкиИИнформация + +// Установить Webhook +// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL, +// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована +// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях +// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать +// +// Параметры: +// Токен - Строка - Токен Viber - token +// URL - Строка - URL для установки Webhook - url +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber +Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("url" , URL , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("auth_token" , Токен, "Строка", Параметры); + + Возврат OPI_Инструменты.Post("https://chatapi.viber.com/pa/set_webhook", Параметры); + +КонецФункции + +// Получить информацию о канале +// Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook +// ID пользователя из информации о канале не подойдет для отправки сообщений через бота - они разные +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber +Функция ПолучитьИнформациюОКанале(Знач Токен) Экспорт + + URL = "https://chatapi.viber.com/pa/get_account_info"; + Возврат OPI_Инструменты.Get(URL, , ТокенВЗаголовки(Токен)); + +КонецФункции + +// Получить данные пользователя +// Получает информацию о пользователе по ID +// +// Параметры: +// Токен - Строка - Токен - token +// IDПользователя - Строка, Число - ID пользователя Viber - user +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber +Функция ПолучитьДанныеПользователя(Знач Токен, Знач IDПользователя) Экспорт + + URL = "https://chatapi.viber.com/pa/get_user_details"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("id", IDПользователя, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен)); + + Возврат Ответ; + +КонецФункции + +// Получить онлайн пользователей +// Получает статус пользователя или нескольких пользователей по ID +// +// Параметры: +// Токен - Строка - Токен Viber - token +// IDПользователей - Строка,Число,Массив из Строка,Число - ID пользователей(я) Viber - users +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber +Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт + + URL = "https://chatapi.viber.com/pa/get_online"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("ids", IDПользователей, "Коллекция", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен)); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область ОтправкаСообщений + +// Отправить текстовое сообщение +// Отправляет текстовое сообщение в чат или канал +// +// Параметры: +// Токен - Строка - Токен - token +// Текст - Строка - Текст сообщения - text +// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user +// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel +// Клавиатура - Структура из Строка - См. СформироватьКлавиатуруИзМассиваКнопок - keyboard +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber +Функция ОтправитьТекстовоеСообщение(Знач Токен + , Знач Текст + , Знач IDПользователя + , Знач ОтправкаВКанал + , Знач Клавиатура = "") Экспорт + + Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура); + +КонецФункции + +// Отправить картинку +// Отправляет картинку в чат или канал +// +// Параметры: +// Токен - Строка - Токен - token +// URL - Строка - URL картинки - picture +// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user +// ОтправкаВКанал - булево - Отправка в канал или в чат бота - ischannel +// Описание - Строка - Аннотация к картинке - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber +Функция ОтправитьКартинку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Описание = "") Экспорт + + Возврат ОтправитьСообщение(Токен, "picture", IDПользователя, ОтправкаВКанал, URL, Описание); + +КонецФункции + +// Отправить файл +// Отправляет файл (документ) в чат или канал +// +// Параметры: +// Токен - Строка - Токен - token +// URL - Строка - URL файла - file +// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user +// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel +// Расширение - Строка - Расширение файла - ext +// Размер - Число - Размер файла. Если не заполнен > определяется автоматически скачиванием файла - size +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber +Функция ОтправитьФайл(Знач Токен + , Знач URL + , Знач IDПользователя + , Знач ОтправкаВКанал + , Знач Расширение + , Знач Размер = "") Экспорт + + Если Не ЗначениеЗаполнено(Размер) Тогда + + Ответ = OPI_Инструменты.Get(URL); + Размер = Ответ.Размер(); + + КонецЕсли; + + Строка_ = "Строка"; + Расширение = СтрЗаменить(Расширение, ".", ""); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("URL" , URL , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("Размер" , Размер , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("Расширение", Расширение, Строка_, Параметры); + + Возврат ОтправитьСообщение(Токен, "file", IDПользователя, ОтправкаВКанал, Параметры); + +КонецФункции + +// Отправить контакт +// Отправляет контакт с номером телефона в чат или канал +// +// Параметры: +// Токен - Строка - Токен - token +// ИмяКонтакта - Строка - Имя контакта - name +// НомерТелефона - Строка - Номер телефона - phone +// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user +// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber +Функция ОтправитьКонтакт(Знач Токен + , Знач ИмяКонтакта + , Знач НомерТелефона + , Знач IDПользователя + , Знач ОтправкаВКанал) Экспорт + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("name" , ИмяКонтакта , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("phone_number", НомерТелефона, "Строка", Параметры); + + Возврат ОтправитьСообщение(Токен, "contact", IDПользователя, ОтправкаВКанал, Параметры); + +КонецФункции + +// Отправить локацию +// Отправляет географические координаты в чат или канал +// +// Параметры: +// Токен - Строка - Токен - token +// Широта - Строка,Число - Географическая широта - lat +// Долгота - Строка,Число - Географическая долгота - long +// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user +// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber +Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("lat", Широта , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("lon", Долгота, "Строка", Параметры); + + Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, Параметры); + +КонецФункции + +// Отправить ссылку +// Отправляет URL с предпросмотром в чат или канал +// +// Параметры: +// Токен - Строка - Токен - token +// URL - Строка - Отправляемая ссылка - url +// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user +// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber +Функция ОтправитьСсылку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт + + Возврат ОтправитьСообщение(Токен, "url", IDПользователя, ОтправкаВКанал, URL); + +КонецФункции + +// Сформировать клавиатуру из массива кнопок +// Возвращает структура клавиатуры для сообщений +// +// Параметры: +// МассивКнопок - Массив из Строка - Массив кнопок - buttons +// ЦветКнопок - Строка - HEX цвет кнопок с # в начале - color +// +// Возвращаемое значение: +// Структура - Сформировать клавиатуру из массива кнопок: +// * Buttons - Массив из Структура - Массив сформированных кнопок +// * Type - Строка - Тип клавиатуры +Функция СформироватьКлавиатуруИзМассиваКнопок(Знач МассивКнопок, Знач ЦветКнопок = "#2db9b9") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦветКнопок); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); + + МассивСтруктурКнопок = Новый Массив; + СтруктураКлавиатуры = Новый Структура; + + Для Каждого ТекстКнопки Из МассивКнопок Цикл + + СтруктураКнопки = Новый Структура; + СтруктураКнопки.Вставить("ActionType", "reply"); + СтруктураКнопки.Вставить("ActionBody", ТекстКнопки); + СтруктураКнопки.Вставить("Text" , ТекстКнопки); + СтруктураКнопки.Вставить("BgColor" , ЦветКнопок); + СтруктураКнопки.Вставить("Coloumns" , 3); + + МассивСтруктурКнопок.Добавить(СтруктураКнопки); + + КонецЦикла; + + СтруктураКлавиатуры.Вставить("Buttons", МассивСтруктурКнопок); + СтруктураКлавиатуры.Вставить("Type" , "keyboard"); + + Возврат СтруктураКлавиатуры; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Отправить сообщение. +// +// Параметры: +// Токен - Строка - Токен +// Тип - Строка - Тип отправляемого сообщения +// IDПользователя - Строка,Число - ID пользователя Viber +// ЭтоКанал - Булево - Отправка в канал или чат с ботом +// Значение - Строка, Структура - Значение: +// * URL - Строка - При отправке URL +// * Размер - Число, Строка - Размер файла в случае отправке +// * Расширение - Строка - Расширение файла в случае отправки +// Текст - Строка - Текст сообщения +// Клавиатура - Структура из Строка - Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок +// +// Возвращаемое значение: +// Произвольный, HTTPОтвет - Отправить сообщение +Функция ОтправитьСообщение(Знач Токен + , Знач Тип + , Знач IDПользователя + , Знач ЭтоКанал + , Знач Значение = "" + , Знач Текст = "" + , Знач Клавиатура = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоКанал); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Клавиатура); + + СтруктураПараметров = ВернутьСтандартныеПараметры(); + СтруктураПараметров.Вставить("type", Тип); + + Если (Тип = "text" Или Тип = "picture") И ЗначениеЗаполнено(Текст) Тогда + СтруктураПараметров.Вставить("text", Текст); + КонецЕсли; + + Если ТипЗнч(Клавиатура) = Тип("Структура") Тогда + СтруктураПараметров.Вставить("keyboard", Клавиатура); + КонецЕсли; + + Если ЗначениеЗаполнено(Значение) Тогда + + Если Тип = "file" Тогда + СтруктураПараметров.Вставить("media" , Значение["URL"]); + СтруктураПараметров.Вставить("size" , Значение["Размер"]); + СтруктураПараметров.Вставить("file_name", "Файл." + Значение["Расширение"]); + ИначеЕсли Тип = "contact" Тогда + СтруктураПараметров.Вставить("contact" , Значение); + ИначеЕсли Тип = "location" Тогда + СтруктураПараметров.Вставить("location" , Значение); + Иначе + СтруктураПараметров.Вставить("media" , Значение); + КонецЕсли; + + КонецЕсли; + + Если ЭтоКанал Тогда + СтруктураПараметров.Вставить("from", IDПользователя); + URL = "https://chatapi.viber.com/pa/post"; + Иначе + СтруктураПараметров.Вставить("receiver", IDПользователя); + URL = "https://chatapi.viber.com/pa/send_message"; + КонецЕсли; + + Ответ = OPI_Инструменты.Post(URL, СтруктураПараметров, ТокенВЗаголовки(Токен)); + + Попытка + Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные()); + Исключение + Возврат Ответ; + КонецПопытки; + +КонецФункции + +Функция ВернутьСтандартныеПараметры() + + СтруктураОтправителя = Новый Структура; + СтруктураОтправителя.Вставить("name" , "Bot"); + СтруктураОтправителя.Вставить("avatar", ""); + + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("sender", СтруктураОтправителя); + СтруктураПараметров.Вставить("min_api_version", 1); + + Возврат СтруктураПараметров; + +КонецФункции + +Функция ТокенВЗаголовки(Знач Токен) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + СтруктураЗаголовков = Новый Соответствие; + СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен); + Возврат СтруктураЗаголовков; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_YandexDisk.os b/ru/OInt/core/Modules/OPI_YandexDisk.os index bdef59a75d..2b3d69eed2 100644 --- a/ru/OInt/core/Modules/OPI_YandexDisk.os +++ b/ru/OInt/core/Modules/OPI_YandexDisk.os @@ -1,635 +1,635 @@ -// Расположение OS: ./OInt/core/Modules/OPI_YandexDisk.os -// Библиотека: Yandex Disk -// Команда CLI: yadisk - -// 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:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:NumberOfOptionalParams-off -// BSLLS:UsingServiceTag-off - -//@skip-check method-too-many-params - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область РаботаСФайламиИПапками - -// Получить информацию о диске -// Получает информацию о текущем диске -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьИнформациюОДиске(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = ЗаголовокАвторизации(Токен); - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk", , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать папку -// Создает каталог на диске -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к созаваемой папке - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - - Заголовки = ЗаголовокАвторизации(Токен); - URL = "https://cloud-api.yandex.net/v1/disk/resources"; - Href = "href"; - - Параметры = Новый Структура; - Параметры.Вставить("path", Путь); - - Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь); - - URLОтвета = Ответ[Href]; - - Если Не ЗначениеЗаполнено(URLОтвета) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить объект -// Получает информацию об объекте диска по заданному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к папке или файлу - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьОбъект(Знач Токен, Знач Путь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - - Заголовки = ЗаголовокАвторизации(Токен); - Параметры = Новый Структура; - Параметры.Вставить("path", Путь); - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить объект -// Удаляет объект по заданному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к удаляемой папке или файлу - path -// ВКорзину - Булево - В корзину - can -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач ВКорзину = Истина) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - OPI_ПреобразованиеТипов.ПолучитьБулево(ВКорзину); - - Заголовки = ЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - Параметры.Вставить("path" , Путь); - Параметры.Вставить("permanently", Не ВКорзину); - - Ответ = OPI_Инструменты.Delete("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать копию объекта -// Создает копию объекта по заданному пути и пути к оригиналу -// -// Параметры: -// Токен - Строка - Токен - token -// Оригинал - Строка - Путь к оригинальному файлу или каталогу - from -// Путь - Строка - Путь назначения для копии - to -// Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует - rewrite -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция СоздатьКопиюОбъекта(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); - - Заголовки = ЗаголовокАвторизации(Токен); - URL = "https://cloud-api.yandex.net/v1/disk/resources/copy"; - Href = "href"; - - Параметры = Новый Структура; - Параметры.Вставить("from" , Оригинал); - Параметры.Вставить("path" , Путь); - Параметры.Вставить("overwrite" , Перезаписывать); - - Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); - - URLОтвета = Ответ[Href]; - - Если Не ЗначениеЗаполнено(URLОтвета) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить ссылку для скачивания -// Получает ссылку для скачивания файла -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к файлу для скачивания - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьСсылкуДляСкачивания(Знач Токен, Знач Путь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - - Заголовки = ЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - Параметры.Вставить("path", Путь); - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/download", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Скачать файл -// Скачивает файл по указанному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к файлу для скачивания - path -// ПутьСохранения - Строка - Путь сохранения файла - out -// -// Возвращаемое значение: -// ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения -Функция СкачатьФайл(Знач Токен, Знач Путь, Знач ПутьСохранения = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ПутьСохранения); - Ответ = ПолучитьСсылкуДляСкачивания(Токен, Путь); - URL = Ответ["href"]; - - Если Не ЗначениеЗаполнено(URL) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URL, , , ПутьСохранения); - - Возврат Ответ; - -КонецФункции - -// Получить список файлов -// Получает список файлов с или без отбора по типу -// Список доступных типов: audio, backup, book, compressed, data, development, -// diskimage, document, encoded, executable, flash, font, -// mage, settings, spreadsheet, text, unknown, video, web -// -// Параметры: -// Токен - Строка - Токен - token -// Количество - Число,Строка - Количество возвращаемых объектов - amount -// СмещениеОтНачала - Число - Смещение для получение объектов не из начала списка - offset -// ОтборПоТипу - Строка - Отбор по типу файла - type -// СортироватьПоДате - Булево - Истина > сортировать по дате, Ложь > по алфавиту - datesort -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьСписокФайлов(Знач Токен - , Знач Количество = 0 - , Знач СмещениеОтНачала = 0 - , Знач ОтборПоТипу = "" - , Знач СортироватьПоДате = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество); - OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ОтборПоТипу); - OPI_ПреобразованиеТипов.ПолучитьБулево(СортироватьПоДате); - - Заголовки = ЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Количество) Тогда - Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество)); - КонецЕсли; - - Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда - Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала)); - КонецЕсли; - - Если ЗначениеЗаполнено(ОтборПоТипу) Тогда - Параметры.Вставить("media_type", ОтборПоТипу); - КонецЕсли; - - Если СортироватьПоДате Тогда - Назначение = "last-uploaded"; - Иначе - Назначение = "files"; - КонецЕсли; - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/" + Назначение, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Переместить объект -// Перемещает объект по заданному пути и пути к оригиналу -// -// Параметры: -// Токен - Строка - Токен - token -// Оригинал - Строка - Путь к оригинальному файлу или папке - from -// Путь - Строка - Путь назначение для перемещения - to -// Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует - rewrite -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПереместитьОбъект(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); - - Заголовки = ЗаголовокАвторизации(Токен); - URL = "https://cloud-api.yandex.net/v1/disk/resources/move"; - Href = "href"; - - Параметры = Новый Структура; - Параметры.Вставить("from" , Оригинал); - Параметры.Вставить("path" , Путь); - Параметры.Вставить("overwrite" , Перезаписывать); - - Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); - URLОтвета = Ответ[Href]; - - Если Не ЗначениеЗаполнено(URLОтвета) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Загрузить файл -// Загружает файл на диск по заданному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь для сохранение файла на Диске - path -// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file -// Перезаписывать - Булево - Перезаписывать, если файл с таким именем уже существует - rewrite -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ЗагрузитьФайл(Знач Токен, Знач Путь, Знач Файл, Знач Перезаписывать = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); - - Заголовки = ЗаголовокАвторизации(Токен); - Href = "href"; - Файл = Новый Структура("file", Файл); - - Параметры = Новый Структура; - Параметры.Вставить("path" , Путь); - Параметры.Вставить("overwrite" , Перезаписывать); - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/upload", Параметры, Заголовки); - URL = Ответ[Href]; - - Если Не ЗначениеЗаполнено(URL) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.PutMultipart(URL, Новый Структура(), Файл, "multipart", Заголовки); - - Возврат Ответ; - -КонецФункции - -// Загрузить файл по URL -// Загружает файл на диск, забирая его по заданному URL -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь помещения загруженного файла - path -// Адрес - Строка - URL файла - url -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ЗагрузитьФайлПоURL(Знач Токен, Знач Путь, Знач Адрес) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес); - - Заголовки = ЗаголовокАвторизации(Токен); - URL = "https://cloud-api.yandex.net/v1/disk/resources/upload"; - - Параметры = Новый Структура; - Параметры.Вставить("url" , КодироватьСтроку(Адрес, СпособКодированияСтроки.URLВКодировкеURL)); - Параметры.Вставить("path", Путь); - - Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область УправлениеПубличнымДоступом - -// Опубликовать объект -// Публикует объект диска в публичный доступ -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к публикуемому объекту - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ОпубликоватьОбъект(Знач Токен, Знач Путь) Экспорт - Возврат ПереключениеОбщегоДоступа(Токен, Путь, Истина); -КонецФункции - -// Отменить публикацию объекта -// Отменяет публикацию ранее опубликованного объекта -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к опубликованному ранее объекту - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ОтменитьПубликациюОбъекта(Знач Токен, Знач Путь) Экспорт - Возврат ПереключениеОбщегоДоступа(Токен, Путь, Ложь); -КонецФункции - -// Получить список опубликованных объектов. -// Получает список опубликованных объектов -// -// Параметры: -// Токен - Строка - Токен - token -// Количество - Число - Количество возвращаемых объектов - amount -// СмещениеОтНачала - Число - Смещение для получение объектов не из начала списка - offset -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьСписокОпубликованныхОбъектов(Знач Токен, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество); - OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала); - - Заголовки = ЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Количество) Тогда - Параметры.Вставить("limit", Количество); - КонецЕсли; - - Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда - Параметры.Вставить("offset", СмещениеОтНачала); - КонецЕсли; - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/public", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить публичный объект -// Получает информацию об опубликованном объекте по его URL -// -// Параметры: -// Токен - Строка - Токен - token -// URL - Строка - Адрес объекта - url -// Количество - Число - Количество возвращаемых вложенных объектов (для каталога) - amount -// СмещениеОтНачала - Число - Смещение для получение вложенных объектов не из начала списка - offset -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьПубличныйОбъект(Знач Токен, Знач URL, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество); - OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала); - - Заголовки = ЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Количество) Тогда - Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество)); - КонецЕсли; - - Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда - Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала)); - КонецЕсли; - - Параметры.Вставить("public_key", URL); - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить ссылку скачивания публичного объекта -// Получает прямую ссылку для скачивания публичного объекта -// -// Параметры: -// Токен - Строка - Токен - token -// URL - Строка - Адрес объекта - url -// Путь - Строка - Путь внутри объекта - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьСсылкуСкачиванияПубличногоОбъекта(Знач Токен, Знач URL, Знач Путь = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - - Заголовки = ЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Путь) Тогда - Параметры.Вставить("path", Путь); - КонецЕсли; - - Параметры.Вставить("public_key", URL); - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources/download", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Сохранить публичный объект на диск -// Сохраняет публичный объект на ваш диск -// -// Параметры: -// Токен - Строка - Токен - token -// URL - Строка - Адрес объекта - url -// Откуда - Строка - Путь внутри публичного каталога (только для папок) - from -// Куда - Строка - Путь сохранения файла - to -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция СохранитьПубличныйОбъектНаДиск(Знач Токен, Знач URL, Откуда = "", Куда = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда); - - Заголовки = ЗаголовокАвторизации(Токен); - Адрес = "https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk"; - Href = "href"; - - Параметры = Новый Структура; - Параметры.Вставить("public_key", URL); - - Если ЗначениеЗаполнено(Откуда) Тогда - Параметры.Вставить("path", Откуда); - КонецЕсли; - - Если ЗначениеЗаполнено(Куда) Тогда - Параметры.Вставить("save_path", Куда); - КонецЕсли; - - Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Ответ = OPI_Инструменты.Post(Адрес + Параметры, , Заголовки, Ложь); - - URLОтвета = Ответ[Href]; - - Если Не ЗначениеЗаполнено(URLОтвета) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ЗаголовокАвторизации(Знач Токен) - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Authorization", "OAuth " + Токен); - - Возврат Заголовки; - -КонецФункции - -Функция ПереключениеОбщегоДоступа(Знач Токен, Знач Путь, Знач ОбщийДоступ) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - OPI_ПреобразованиеТипов.ПолучитьБулево(ОбщийДоступ); - - Заголовки = ЗаголовокАвторизации(Токен); - Назначение = ?(ОбщийДоступ, "publish", "unpublish"); - Href = "href"; - - URL = "https://cloud-api.yandex.net/v1/disk/resources/" + Назначение; - - Параметры = Новый Структура; - Параметры.Вставить("path", Путь); - - Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь); - - URLОтвета = Ответ[Href]; - - Если Не ЗначениеЗаполнено(URLОтвета) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_YandexDisk.os +// Библиотека: Yandex Disk +// Команда CLI: yadisk + +// 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:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off + +//@skip-check method-too-many-params + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область РаботаСФайламиИПапками + +// Получить информацию о диске +// Получает информацию о текущем диске +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьИнформациюОДиске(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = ЗаголовокАвторизации(Токен); + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk", , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать папку +// Создает каталог на диске +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к созаваемой папке - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + + Заголовки = ЗаголовокАвторизации(Токен); + URL = "https://cloud-api.yandex.net/v1/disk/resources"; + Href = "href"; + + Параметры = Новый Структура; + Параметры.Вставить("path", Путь); + + Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь); + + URLОтвета = Ответ[Href]; + + Если Не ЗначениеЗаполнено(URLОтвета) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить объект +// Получает информацию об объекте диска по заданному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к папке или файлу - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьОбъект(Знач Токен, Знач Путь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + + Заголовки = ЗаголовокАвторизации(Токен); + Параметры = Новый Структура; + Параметры.Вставить("path", Путь); + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить объект +// Удаляет объект по заданному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к удаляемой папке или файлу - path +// ВКорзину - Булево - В корзину - can +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач ВКорзину = Истина) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + OPI_ПреобразованиеТипов.ПолучитьБулево(ВКорзину); + + Заголовки = ЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + Параметры.Вставить("path" , Путь); + Параметры.Вставить("permanently", Не ВКорзину); + + Ответ = OPI_Инструменты.Delete("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать копию объекта +// Создает копию объекта по заданному пути и пути к оригиналу +// +// Параметры: +// Токен - Строка - Токен - token +// Оригинал - Строка - Путь к оригинальному файлу или каталогу - from +// Путь - Строка - Путь назначения для копии - to +// Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует - rewrite +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция СоздатьКопиюОбъекта(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); + + Заголовки = ЗаголовокАвторизации(Токен); + URL = "https://cloud-api.yandex.net/v1/disk/resources/copy"; + Href = "href"; + + Параметры = Новый Структура; + Параметры.Вставить("from" , Оригинал); + Параметры.Вставить("path" , Путь); + Параметры.Вставить("overwrite" , Перезаписывать); + + Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); + + URLОтвета = Ответ[Href]; + + Если Не ЗначениеЗаполнено(URLОтвета) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить ссылку для скачивания +// Получает ссылку для скачивания файла +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к файлу для скачивания - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьСсылкуДляСкачивания(Знач Токен, Знач Путь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + + Заголовки = ЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + Параметры.Вставить("path", Путь); + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/download", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Скачать файл +// Скачивает файл по указанному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к файлу для скачивания - path +// ПутьСохранения - Строка - Путь сохранения файла - out +// +// Возвращаемое значение: +// ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения +Функция СкачатьФайл(Знач Токен, Знач Путь, Знач ПутьСохранения = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ПутьСохранения); + Ответ = ПолучитьСсылкуДляСкачивания(Токен, Путь); + URL = Ответ["href"]; + + Если Не ЗначениеЗаполнено(URL) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URL, , , ПутьСохранения); + + Возврат Ответ; + +КонецФункции + +// Получить список файлов +// Получает список файлов с или без отбора по типу +// Список доступных типов: audio, backup, book, compressed, data, development, +// diskimage, document, encoded, executable, flash, font, +// mage, settings, spreadsheet, text, unknown, video, web +// +// Параметры: +// Токен - Строка - Токен - token +// Количество - Число,Строка - Количество возвращаемых объектов - amount +// СмещениеОтНачала - Число - Смещение для получение объектов не из начала списка - offset +// ОтборПоТипу - Строка - Отбор по типу файла - type +// СортироватьПоДате - Булево - Истина > сортировать по дате, Ложь > по алфавиту - datesort +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьСписокФайлов(Знач Токен + , Знач Количество = 0 + , Знач СмещениеОтНачала = 0 + , Знач ОтборПоТипу = "" + , Знач СортироватьПоДате = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество); + OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ОтборПоТипу); + OPI_ПреобразованиеТипов.ПолучитьБулево(СортироватьПоДате); + + Заголовки = ЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Количество) Тогда + Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество)); + КонецЕсли; + + Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда + Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала)); + КонецЕсли; + + Если ЗначениеЗаполнено(ОтборПоТипу) Тогда + Параметры.Вставить("media_type", ОтборПоТипу); + КонецЕсли; + + Если СортироватьПоДате Тогда + Назначение = "last-uploaded"; + Иначе + Назначение = "files"; + КонецЕсли; + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/" + Назначение, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Переместить объект +// Перемещает объект по заданному пути и пути к оригиналу +// +// Параметры: +// Токен - Строка - Токен - token +// Оригинал - Строка - Путь к оригинальному файлу или папке - from +// Путь - Строка - Путь назначение для перемещения - to +// Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует - rewrite +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПереместитьОбъект(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); + + Заголовки = ЗаголовокАвторизации(Токен); + URL = "https://cloud-api.yandex.net/v1/disk/resources/move"; + Href = "href"; + + Параметры = Новый Структура; + Параметры.Вставить("from" , Оригинал); + Параметры.Вставить("path" , Путь); + Параметры.Вставить("overwrite" , Перезаписывать); + + Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); + URLОтвета = Ответ[Href]; + + Если Не ЗначениеЗаполнено(URLОтвета) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Загрузить файл +// Загружает файл на диск по заданному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь для сохранение файла на Диске - path +// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file +// Перезаписывать - Булево - Перезаписывать, если файл с таким именем уже существует - rewrite +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ЗагрузитьФайл(Знач Токен, Знач Путь, Знач Файл, Знач Перезаписывать = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + + Заголовки = ЗаголовокАвторизации(Токен); + Href = "href"; + Файл = Новый Структура("file", Файл); + + Параметры = Новый Структура; + Параметры.Вставить("path" , Путь); + Параметры.Вставить("overwrite" , Перезаписывать); + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/upload", Параметры, Заголовки); + URL = Ответ[Href]; + + Если Не ЗначениеЗаполнено(URL) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.PutMultipart(URL, Новый Структура(), Файл, "multipart", Заголовки); + + Возврат Ответ; + +КонецФункции + +// Загрузить файл по URL +// Загружает файл на диск, забирая его по заданному URL +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь помещения загруженного файла - path +// Адрес - Строка - URL файла - url +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ЗагрузитьФайлПоURL(Знач Токен, Знач Путь, Знач Адрес) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес); + + Заголовки = ЗаголовокАвторизации(Токен); + URL = "https://cloud-api.yandex.net/v1/disk/resources/upload"; + + Параметры = Новый Структура; + Параметры.Вставить("url" , КодироватьСтроку(Адрес, СпособКодированияСтроки.URLВКодировкеURL)); + Параметры.Вставить("path", Путь); + + Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область УправлениеПубличнымДоступом + +// Опубликовать объект +// Публикует объект диска в публичный доступ +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к публикуемому объекту - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ОпубликоватьОбъект(Знач Токен, Знач Путь) Экспорт + Возврат ПереключениеОбщегоДоступа(Токен, Путь, Истина); +КонецФункции + +// Отменить публикацию объекта +// Отменяет публикацию ранее опубликованного объекта +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к опубликованному ранее объекту - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ОтменитьПубликациюОбъекта(Знач Токен, Знач Путь) Экспорт + Возврат ПереключениеОбщегоДоступа(Токен, Путь, Ложь); +КонецФункции + +// Получить список опубликованных объектов. +// Получает список опубликованных объектов +// +// Параметры: +// Токен - Строка - Токен - token +// Количество - Число - Количество возвращаемых объектов - amount +// СмещениеОтНачала - Число - Смещение для получение объектов не из начала списка - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьСписокОпубликованныхОбъектов(Знач Токен, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество); + OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала); + + Заголовки = ЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Количество) Тогда + Параметры.Вставить("limit", Количество); + КонецЕсли; + + Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда + Параметры.Вставить("offset", СмещениеОтНачала); + КонецЕсли; + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/public", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить публичный объект +// Получает информацию об опубликованном объекте по его URL +// +// Параметры: +// Токен - Строка - Токен - token +// URL - Строка - Адрес объекта - url +// Количество - Число - Количество возвращаемых вложенных объектов (для каталога) - amount +// СмещениеОтНачала - Число - Смещение для получение вложенных объектов не из начала списка - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьПубличныйОбъект(Знач Токен, Знач URL, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество); + OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала); + + Заголовки = ЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Количество) Тогда + Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество)); + КонецЕсли; + + Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда + Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала)); + КонецЕсли; + + Параметры.Вставить("public_key", URL); + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить ссылку скачивания публичного объекта +// Получает прямую ссылку для скачивания публичного объекта +// +// Параметры: +// Токен - Строка - Токен - token +// URL - Строка - Адрес объекта - url +// Путь - Строка - Путь внутри объекта - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьСсылкуСкачиванияПубличногоОбъекта(Знач Токен, Знач URL, Знач Путь = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + + Заголовки = ЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Путь) Тогда + Параметры.Вставить("path", Путь); + КонецЕсли; + + Параметры.Вставить("public_key", URL); + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources/download", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Сохранить публичный объект на диск +// Сохраняет публичный объект на ваш диск +// +// Параметры: +// Токен - Строка - Токен - token +// URL - Строка - Адрес объекта - url +// Откуда - Строка - Путь внутри публичного каталога (только для папок) - from +// Куда - Строка - Путь сохранения файла - to +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция СохранитьПубличныйОбъектНаДиск(Знач Токен, Знач URL, Откуда = "", Куда = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда); + + Заголовки = ЗаголовокАвторизации(Токен); + Адрес = "https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk"; + Href = "href"; + + Параметры = Новый Структура; + Параметры.Вставить("public_key", URL); + + Если ЗначениеЗаполнено(Откуда) Тогда + Параметры.Вставить("path", Откуда); + КонецЕсли; + + Если ЗначениеЗаполнено(Куда) Тогда + Параметры.Вставить("save_path", Куда); + КонецЕсли; + + Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Ответ = OPI_Инструменты.Post(Адрес + Параметры, , Заголовки, Ложь); + + URLОтвета = Ответ[Href]; + + Если Не ЗначениеЗаполнено(URLОтвета) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ЗаголовокАвторизации(Знач Токен) + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization", "OAuth " + Токен); + + Возврат Заголовки; + +КонецФункции + +Функция ПереключениеОбщегоДоступа(Знач Токен, Знач Путь, Знач ОбщийДоступ) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + OPI_ПреобразованиеТипов.ПолучитьБулево(ОбщийДоступ); + + Заголовки = ЗаголовокАвторизации(Токен); + Назначение = ?(ОбщийДоступ, "publish", "unpublish"); + Href = "href"; + + URL = "https://cloud-api.yandex.net/v1/disk/resources/" + Назначение; + + Параметры = Новый Структура; + Параметры.Вставить("path", Путь); + + Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь); + + URLОтвета = Ответ[Href]; + + Если Не ЗначениеЗаполнено(URLОтвета) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_YandexID.os b/ru/OInt/core/Modules/OPI_YandexID.os index 10d9cc743b..053dc4e64e 100644 --- a/ru/OInt/core/Modules/OPI_YandexID.os +++ b/ru/OInt/core/Modules/OPI_YandexID.os @@ -1,112 +1,112 @@ -// Расположение OS: ./OInt/core/Modules/OPI_YandexID.os -// Библиотека: Yandex ID -// Команда CLI: yandex - -// 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:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -// Получить код подтверждения -// Получает код подтверждения и адрес страницы, на которой его необходимо ввести -// -// Параметры: -// ClientId - Строка - Client id - id -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьКодПодтверждения(Знач ClientId) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId); - - Параметры = Новый Структура("client_id", ClientId); - Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/device/code", Параметры, , Ложь); - - Возврат Ответ; - -КонецФункции - -// Преобразовать код в токен -// Преобразовывает код в токен после ввода кода при выполнении ПолучитьКодПодтверждения -// -// Параметры: -// ClientId - Строка - Client id - id -// ClientSecret - Строка - Client secret - secret -// КодУстройства - Строка - device_code из ПолучитьКодПодтверждения() - device -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПреобразоватьКодВТокен(Знач ClientId, Знач ClientSecret, Знач КодУстройства) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret); - OPI_ПреобразованиеТипов.ПолучитьСтроку(КодУстройства); - - Параметры = Новый Структура; - Параметры.Вставить("grant_type" , "device_code"); - Параметры.Вставить("code" , КодУстройства); - Параметры.Вставить("client_id" , ClientId); - Параметры.Вставить("client_secret" , ClientSecret); - - Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь); - - Возврат Ответ; - -КонецФункции - -// Обновить токен -// Обновляет токен по Refresh token -// -// Параметры: -// ClientId - Строка - Client id - id -// ClientSecret - Строка - Client secret - secret -// RefreshToken - Строка - Refresh token - refresh -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ОбновитьТокен(Знач ClientId, Знач ClientSecret, Знач RefreshToken) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret); - OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken); - - Параметры = Новый Структура; - Параметры.Вставить("grant_type" , "refresh_token"); - Параметры.Вставить("refresh_token" , RefreshToken); - Параметры.Вставить("client_id" , ClientId); - Параметры.Вставить("client_secret" , ClientSecret); - - Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_YandexID.os +// Библиотека: Yandex ID +// Команда CLI: yandex + +// 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:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +// Получить код подтверждения +// Получает код подтверждения и адрес страницы, на которой его необходимо ввести +// +// Параметры: +// ClientId - Строка - Client id - id +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьКодПодтверждения(Знач ClientId) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId); + + Параметры = Новый Структура("client_id", ClientId); + Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/device/code", Параметры, , Ложь); + + Возврат Ответ; + +КонецФункции + +// Преобразовать код в токен +// Преобразовывает код в токен после ввода кода при выполнении ПолучитьКодПодтверждения +// +// Параметры: +// ClientId - Строка - Client id - id +// ClientSecret - Строка - Client secret - secret +// КодУстройства - Строка - device_code из ПолучитьКодПодтверждения() - device +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПреобразоватьКодВТокен(Знач ClientId, Знач ClientSecret, Знач КодУстройства) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret); + OPI_ПреобразованиеТипов.ПолучитьСтроку(КодУстройства); + + Параметры = Новый Структура; + Параметры.Вставить("grant_type" , "device_code"); + Параметры.Вставить("code" , КодУстройства); + Параметры.Вставить("client_id" , ClientId); + Параметры.Вставить("client_secret" , ClientSecret); + + Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь); + + Возврат Ответ; + +КонецФункции + +// Обновить токен +// Обновляет токен по Refresh token +// +// Параметры: +// ClientId - Строка - Client id - id +// ClientSecret - Строка - Client secret - secret +// RefreshToken - Строка - Refresh token - refresh +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ОбновитьТокен(Знач ClientId, Знач ClientSecret, Знач RefreshToken) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret); + OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken); + + Параметры = Новый Структура; + Параметры.Вставить("grant_type" , "refresh_token"); + Параметры.Вставить("refresh_token" , RefreshToken); + Параметры.Вставить("client_id" , ClientId); + Параметры.Вставить("client_secret" , ClientSecret); + + Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/lib.config b/ru/OInt/lib.config index 90d17cd272..6747b15fc1 100644 --- a/ru/OInt/lib.config +++ b/ru/OInt/lib.config @@ -1,20 +1,20 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/ru/OInt/packagedef b/ru/OInt/packagedef index 9c0ce97c17..24c3199fdc 100644 --- a/ru/OInt/packagedef +++ b/ru/OInt/packagedef @@ -1,13 +1,13 @@ -Описание.Имя("oint") - .Версия("1.9.0") - .Автор("bayselonarrend") - .АдресАвтора("bayselonarrend@gmail.com") - .Описание("Открытый пакет интеграций с популярными API") - .ВерсияСреды("1.0.7") - .ВключитьФайл("core") - .ВключитьФайл("tools") - .ВключитьФайл("tests") - .ВключитьФайл("lib.config") - .ВключитьФайл("../README.MD") - .ВключитьФайл("../LICENSE") - .ЗависитОт("asserts", "1.3.0") +Описание.Имя("oint") + .Версия("1.9.0") + .Автор("bayselonarrend") + .АдресАвтора("bayselonarrend@gmail.com") + .Описание("Открытый пакет интеграций с популярными API") + .ВерсияСреды("1.0.7") + .ВключитьФайл("core") + .ВключитьФайл("tools") + .ВключитьФайл("tests") + .ВключитьФайл("lib.config") + .ВключитьФайл("../README.MD") + .ВключитьФайл("../LICENSE") + .ЗависитОт("asserts", "1.3.0") diff --git a/ru/OInt/tests/Modules/internal/OPI_Тесты.os b/ru/OInt/tests/Modules/internal/OPI_Тесты.os index e9233bdb73..b47c90b90c 100644 --- a/ru/OInt/tests/Modules/internal/OPI_Тесты.os +++ b/ru/OInt/tests/Modules/internal/OPI_Тесты.os @@ -1,5307 +1,5307 @@ -// Расположение OS: ./OInt/tests/Modules/internal/OPI_Тесты.os - -// 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 - -// Набор тестов для YAxUnit - -// BSLLS:Typo-off -// BSLLS:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:UsingServiceTag-off -// BSLLS:UnusedParameters-off -// BSLLS:DuplicateStringLiteral-off - -// @skip-check undefined-variable -// @skip-check wrong-string-literal-content - -// Раскомментировать, если выполняется OneScript -#Использовать oint -#Использовать asserts - -#Область СлужебныйПрограммныйИнтерфейс - -// Для YaxUnit - -Процедура ИсполняемыеСценарии() Экспорт - - OPI_ПолучениеДанныхТестов.СформироватьТестыЯкс(); - -КонецПроцедуры - -// Для Asserts - -Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт - - Возврат OPI_ПолучениеДанныхТестов.СформироватьТестыАссертс(); - -КонецФункции - -#Область ЗапускаемыеТесты - -#Область Telegram - -Процедура Телеграм_ПолучитьИнформациюБота() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); - - Telegram_ПолучитьИнформациюБота(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ПолучитьОбновления() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); - - Telegram_УдалитьWebhook(ПараметрыТеста); - Telegram_ПолучитьОбновления(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_УстановитьWebhook() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_URL" , ПараметрыТеста); - - Telegram_УстановитьWebhook(ПараметрыТеста); - Telegram_УдалитьWebhook(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьТекстовоеСообщение() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - - Telegram_ОтправитьТекстовоеСообщение(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьКартинку() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - - Telegram_ОтправитьКартинку(ПараметрыТеста); - Telegram_СкачатьФайл(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьВидео() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста); - - Telegram_ОтправитьВидео(ПараметрыТеста); - Telegram_СкачатьФайл(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьАудио() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Audio" , ПараметрыТеста); - - Telegram_ОтправитьАудио(ПараметрыТеста); - Telegram_СкачатьФайл(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьДокумент() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document" , ПараметрыТеста); - - Telegram_ОтправитьДокумент(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьГифку() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GIF" , ПараметрыТеста); - - Telegram_ОтправитьГифку(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьМедиагруппу() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста); - - Telegram_ОтправитьМеидагруппу(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьМестоположение() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Long" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Lat" , ПараметрыТеста); - - Telegram_ОтправитьМестоположение(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьКонтакт() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Name" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Surname" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Phone" , ПараметрыТеста); - - Telegram_ОтправитьКонтакт(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьОпрос() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - - Telegram_ОтправитьОпрос(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ПереслатьСообщение() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста); - - Telegram_ПереслатьСообщение(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_БанРазбан() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста); - - Telegram_Бан(ПараметрыТеста); - Telegram_Разбан(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_СоздатьСсылкуПриглашение() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - - Telegram_СоздатьСсылкуПриглашение(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ЗакрепитьОткрепитьСообщение() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста); - - Telegram_ЗакрепитьСообщение(ПараметрыТеста); - Telegram_ОткрепитьСообщение(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ПолучитьЧислоУчастников() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - - Telegram_ПолучитьЧислоУчастников(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ПолучитьСписокАватаровФорума() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); - - Telegram_ПолучитьСписокАватаровФорума(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_СоздатьУдалитьТемуФорума() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - - Telegram_СоздатьТемуФорума(ПараметрыТеста); - Telegram_ИзменитьТемуФорума(ПараметрыТеста); - Telegram_ЗакрытьТемуФорума(ПараметрыТеста); - Telegram_ОткрытьТемуФорума(ПараметрыТеста); - Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыТеста); - Telegram_УдалитьТемуФорума(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_СкрытьПоказатьГлавнуюТему() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста); - - Telegram_СкрытьГлавнуюТемуФорума(ПараметрыТеста); - Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ИзменитьИмяГлавнойТемы() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста); - - Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыТеста); - -КонецПроцедуры - -#КонецОбласти - -#Область VK - -Процедура ВК_СоздатьСсылкуТокена() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("VK_AppID", ПараметрыТеста); - - VK_СоздатьСсылкуПолученияТокена(ПараметрыТеста); - -КонецПроцедуры - -Процедура ВК_СоздатьУдалитьПост() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture2", ПараметрыТеста); - - VK_СоздатьПост(ПараметрыТеста); - VK_УдалитьПост(ПараметрыТеста); - -КонецПроцедуры - -Процедура ВК_СоздатьСоставнойПост() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста); - - VK_СоздатьСоставнойПост(ПараметрыТеста); - -КонецПроцедуры - -Процедура ВК_СоздатьОпрос() Экспорт - - VK_СоздатьОпрос(); - -КонецПроцедуры - -Процедура ВК_СохранитьУдалитьКартинку() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - - VK_СоздатьАльбом(ПараметрыТеста); - VK_СохранитьКартинкуВАльбом(ПараметрыТеста); - VK_УдалитьКартинку(ПараметрыТеста); - VK_УдалитьАльбом(ПараметрыТеста); - -КонецПроцедуры - -Процедура ВК_СоздатьИсторию() Экспорт - - ПараметрыТеста = Новый Соответствие; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - - VK_СоздатьИсторию(ПараметрыТеста); - -КонецПроцедуры - -Процедура ВК_МетодыОбсуждений() Экспорт - - ПараметрыТеста = Новый Структура; - Параметры = ПолучитьПараметрыВК(); - - VK_СоздатьОбсуждение(ПараметрыТеста); - VK_ЗакрытьОбсуждение(ПараметрыТеста); - VK_ОткрытьОбсуждение(ПараметрыТеста); - VK_НаписатьВОбсуждение(ПараметрыТеста); - - OPI_VK.ЗакрытьОбсуждение(ПараметрыТеста["VK_ConvID"], Истина, Параметры); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ЛайкРепостКоммент() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Текст = "Пост из автотеста"; - Сообщение = "Сообщение из автотеста"; - ТипСоответствие = Тип("Соответствие"); - ТипЧисло = Тип("Число"); - Response = "response"; - - Результат = OPI_VK.СоздатьПост(Текст, Новый Массив, , , Параметры); - - ИДПоста = Результат[Response]["post_id"]; - Результат = OPI_VK.ПоставитьЛайк(ИДПоста, , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоставитьЛайк"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["likes"]).ИмеетТип(ТипЧисло).Заполнено(); - - ВнешнийПост = 2571; - ВнешняяСтена = -218704372; - - Результат = OPI_VK.СделатьРепост(ВнешнийПост, ВнешняяСтена, , , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СделатьРепост"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["success"]).ИмеетТип(ТипЧисло).Равно(1); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["wall_repost_count"]).ИмеетТип(ТипЧисло).Равно(1); - - Результат = OPI_VK.НаписатьКомментарий(ИДПоста, Параметры["owner_id"], Сообщение, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьКомментарий"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["comment_id"]).ИмеетТип(ТипЧисло).Заполнено(); - - OPI_VK.УдалитьПост(ИДПоста, Параметры); - OPI_VK.УдалитьПост(Результат[Response]["post_id"], Параметры); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ПолучитьСтатистику() Экспорт - - ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); - Параметры = ПолучитьПараметрыВК(); - Дата0 = НачалоДня(ТекущаяДата); - Дата1 = КонецДня(Дата0); - ТипСоответствие = Тип("Соответствие"); - - Результат = OPI_VK.ПолучитьСтатистику(Дата0, Дата1, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистику"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["visitors"]).ИмеетТип(ТипСоответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["reach"]).ИмеетТип(ТипСоответствие).Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ПолучитьСтатистикуПостов() Экспорт - - Параметры = ПолучитьПараметрыВК(); - - МассивПостов = Новый Массив; - МассивПостов.Добавить(214); - МассивПостов.Добавить(215); - - Результат = OPI_VK.ПолучитьСтатистикуПостов(МассивПостов, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистикуПостов"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив").ИмеетДлину(2); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_СоздатьРекламнуюКампанию() Экспорт - - Параметры = ПолучитьПараметрыВК(); - ИДКабинета = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AdsCabinetID"); - Наименование = "Тестовая кампания"; - ТипСоответствие = Тип("Соответствие"); - ТипЧисло = Тип("Число"); - Response = "response"; - UID = "id"; - - Результат = OPI_VK.СоздатьРекламнуюКампанию(ИДКабинета, Наименование, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламнуюКампанию"); - - Результат = Результат[Response][0]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено(); - - ИДКампании = Результат[UID]; - ИДКатегории = 126; - Лимит = 150; - - Результат = OPI_VK.СоздатьПост(Наименование, Новый Массив, , , Параметры); - ИДПоста = Результат[Response]["post_id"]; - - Результат = OPI_VK.СоздатьРекламноеОбъявление(ИДКампании - , Лимит - , ИДКатегории - , ИДПоста - , ИДКабинета - , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламноеОбъявление"); - - Результат = Результат[Response][0]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено(); - - ИДОбъявления = Результат[UID]; - Результат = OPI_VK.ПриостановитьРекламноеОбъявление(ИДКабинета, ИДОбъявления, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПриостановитьРекламноеОбъявление"); - - Результат = Результат[Response][0]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено(); - - OPI_VK.УдалитьПост(ИДПоста, Параметры); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ОтправитьСообщение() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_UserID"); - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_CommunityToken"); - Текст = "Сообщение из автотеста"; - - МассивКнопок = Новый Массив; - МассивКнопок.Добавить("Кнопка 1"); - МассивКнопок.Добавить("Кнопка 2"); - - Клавиатура = OPI_VK.СформироватьКлавиатуру(МассивКнопок); - Результат = OPI_VK.НаписатьСообщение(Текст, Пользователь, Токен, Клавиатура, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьСообщение"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ПолучитьКатегорииТоваров() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Результат = OPI_VK.ПолучитьСписокКатегорийТоваров(Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКатегорийТоваров"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Соответствие") - .Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_СоздатьТоварПодборку() Экспорт - - Параметры = ПолучитьПараметрыВК(); - ТипСоответствие = Тип("Соответствие"); - ТипЧисло = Тип("Число"); - Response = "response"; - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - ИВФ = ПолучитьИмяВременногоФайла("png"); - Картинка.Записать(ИВФ); - - Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка" - , Картинка - , Истина - , Ложь - , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["albums_count"]).ИмеетТип(ТипЧисло).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_album_id"]).ИмеетТип(ТипЧисло).Заполнено(); - - ИДПодборки = Результат[Response]["market_album_id"]; - - Результат = OPI_VK.ИзменитьПодборкуТоваров("Измененная подборка", ИДПодборки, , , , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПодборкуТоваров"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Равно(1); - - МассивКартинок = Новый Массив; - МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture")); - МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2")); - - Товар = Новый Соответствие(); - Товар.Вставить("Имя" , "Тестовый товар"); - Товар.Вставить("Описание" , "Описание товара"); - Товар.Вставить("Категория" , "20173"); - Товар.Вставить("Цена" , 1); - Товар.Вставить("СтараяЦена" , 15); - Товар.Вставить("ОсновноеФото" , Картинка); - Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); - Товар.Вставить("ДополнительныеФото" , МассивКартинок); - Товар.Вставить("ГлавныйВГруппе" , Истина); - Товар.Вставить("Ширина" , 20); - Товар.Вставить("Высота" , 30); - Товар.Вставить("Глубина" , 40); - Товар.Вставить("Вес" , 100); - Товар.Вставить("SKU" , "12345"); - Товар.Вставить("ДоступныйОстаток" , "10"); - - Результат = OPI_VK.ДобавитьТовар(Товар, ИДПодборки, Параметры); // Добавление товара - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_item_id"]).ИмеетТип(ТипЧисло).Заполнено(); - - ИДТовара = Результат[Response]["market_item_id"]; - - Товар = Новый Соответствие; - Товар.Вставить("Имя", "Тестовый товар измененный"); - - Результат = OPI_VK.ИзменитьТовар(ИДТовара, Товар, , Параметры); // Изменение товара - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТовар"); - - Проверка_ВКИстина(Результат); - - Результат = OPI_VK.ДобавитьТоварВПодборку(ИДТовара, ИДПодборки, Параметры); // Добавление в подборку - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТоварВПодборку"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Заполнено(); - - Результат = OPI_VK.УдалитьТоварИзПодборки(ИДТовара, ИДПодборки, Параметры); // Удаляет из подборки - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТоварИзПодборки"); - - OPI_Инструменты.Пауза(5); - Проверка_ВКИстина(Результат); - - Результат = OPI_VK.УдалитьТовар(ИДТовара, Параметры); // Удаление товара - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТовар"); - - OPI_Инструменты.Пауза(5); - Проверка_ВКИстина(Результат); - - Результат = OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); // Уадление подборки - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПодборку"); - - OPI_Инструменты.Пауза(5); - Проверка_ВКИстина(Результат); - - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_СоздатьТоварСоСвойствами() Экспорт - - Параметры = ПолучитьПараметрыВК(); - ТипСоответствие = Тип("Соответствие"); - ТипЧисло = Тип("Число"); - MII = "market_item_id"; - Response = "response"; - Желтый = "Желтый"; - Красный = "Красный"; - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - ИВФ = ПолучитьИмяВременногоФайла("png"); - Картинка.Записать(ИВФ); - - МассивВариантов = Новый Массив; - МассивВариантов.Добавить(Желтый); - МассивВариантов.Добавить("Синий"); - МассивВариантов.Добавить(Красный); - - Результат = OPI_VK.СоздатьСвойствоТовара("Цвет", Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСвойствоТовара"); - - OPI_Инструменты.Пауза(5); - - Свойство = Результат[Response]["property_id"]; - Свойство = OPI_Инструменты.ЧислоВСтроку(Свойство); - - СоответствиеСвойств = Новый Соответствие; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["property_id"]).ИмеетТип(ТипЧисло).Заполнено(); - - Результат = OPI_VK.ИзменитьСвойствоТовара("Цвет (изм.)", Свойство, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойствоТовара"); - - OPI_Инструменты.Пауза(5); - - Проверка_ВКИстина(Результат); - - Для Каждого Вариант Из МассивВариантов Цикл - - Результат = OPI_VK.ДобавитьВариантСвойстваТовара(Вариант, Свойство, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВариантСвойстваТовара"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["variant_id"]).ИмеетТип(ТипЧисло).Заполнено(); - - ИДВарианта = Результат[Response]["variant_id"]; - СоответствиеСвойств.Вставить(Вариант, ИДВарианта); - - Результат = OPI_VK.ИзменитьВариантСвойстваТовара(Вариант + Строка(Новый УникальныйИдентификатор()) - , Свойство - , ИДВарианта - , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьВариантСвойстваТовара"); - - Проверка_ВКИстина(Результат); - - КонецЦикла; - - МассивКартинок = Новый Массив; - МассивКартинок.Добавить(ИВФ); - МассивКартинок.Добавить(Картинка); - - Товар = Новый Соответствие(); - Товар.Вставить("Имя" , "Тестовый товар (" + Желтый + ")"); - Товар.Вставить("Описание" , "Описание товара"); - Товар.Вставить("Категория" , "20173"); - Товар.Вставить("Цена" , 1); - Товар.Вставить("СтараяЦена" , 15); - Товар.Вставить("ОсновноеФото" , Картинка); - Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); - Товар.Вставить("ДополнительныеФото" , МассивКартинок); - Товар.Вставить("ГлавныйВГруппе" , Истина); - Товар.Вставить("НомерГруппы" , Неопределено); - Товар.Вставить("Ширина" , 20); - Товар.Вставить("Высота" , 30); - Товар.Вставить("Глубина" , 40); - Товар.Вставить("Вес" , 100); - Товар.Вставить("SKU" , 12345); - Товар.Вставить("ДоступныйОстаток" , "10"); - Товар.Вставить("ЗначенияСвойств" , СоответствиеСвойств[Желтый]); - - Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар"); - - OPI_Инструменты.Пауза(5); - - ИДЖелтого = Результат[Response]["market_item_id"]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено(); - - Товар.Вставить("Имя" , "Тестовый товар (" + Красный + ")"); - Товар.Вставить("ЗначенияСвойств", СоответствиеСвойств[Красный]); - - Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар"); - - OPI_Инструменты.Пауза(5); - - ИДКрасного = Результат[Response][MII]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено(); - - МассивТоваров = Новый Массив; - МассивТоваров.Добавить(ИДЖелтого); - МассивТоваров.Добавить(ИДКрасного); - - Результат = OPI_VK.ПолучитьТоварыПоИД(МассивТоваров, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТоварыПоИД"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["items"]).ИмеетТип("Массив").ИмеетДлину(2); - - Результат = OPI_VK.СгруппироватьТовары(МассивТоваров, , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СгруппироватьТовары"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["item_group_id"]).ИмеетТип(ТипЧисло).Заполнено(); - - OPI_VK.УдалитьТовар(ИДЖелтого , Параметры); - OPI_VK.УдалитьТовар(ИДКрасного, Параметры); - - Для Каждого Вариант Из СоответствиеСвойств Цикл - - Удаление = OPI_VK.УдалитьВариантСвойстваТовара(Вариант.Значение, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьВариантСвойстваТовара"); - - OPI_Инструменты.Пауза(5); - Проверка_ВКИстина(Удаление); - - КонецЦикла; - - Удаление = OPI_VK.УдалитьСвойствоТовара(Свойство, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСвойствоТовара"); - - OPI_Инструменты.Пауза(5); - - Проверка_ВКИстина(Удаление); - - УдалитьФайлы(ИВФ); - -КонецПроцедуры - -Процедура ВК_ПолучитьСписокТоваров() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - - МассивКартинок = Новый Массив; - МассивКартинок.Добавить(Картинка); - - Товар = Новый Соответствие(); - Товар.Вставить("Имя" , "Тестовый товар 2"); - Товар.Вставить("Описание" , "Описание товара"); - Товар.Вставить("Категория" , "20173"); - Товар.Вставить("Цена" , 1); - Товар.Вставить("СтараяЦена" , 15); - Товар.Вставить("ОсновноеФото" , Картинка); - Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); - Товар.Вставить("ДополнительныеФото" , МассивКартинок); - Товар.Вставить("ГлавныйВГруппе" , Истина); - Товар.Вставить("НомерГруппы" , Неопределено); - Товар.Вставить("Ширина" , 20); - Товар.Вставить("Высота" , 30); - Товар.Вставить("Глубина" , 40); - Товар.Вставить("Вес" , 100); - Товар.Вставить("SKU" , 12345); - Товар.Вставить("ДоступныйОстаток" , "10"); - - Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); - ИДТовара = Результат["response"]["market_item_id"]; - OPI_Инструменты.Пауза(5); - - Результат = OPI_VK.ПолучитьСписокТоваров(, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТоваров"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Массив").Заполнено(); - - OPI_VK.УдалитьТовар(ИДТовара, Параметры); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ПолучитьСписокПодборок() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка" - , Картинка - , Истина - , Ложь - , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров"); - - ИДПодборки = Результат["response"]["market_album_id"]; - Результат = OPI_VK.ПолучитьСписокПодборок(Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПодборок"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Массив").Заполнено(); - - OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ПолучитьСписокСвойств() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Результат = OPI_VK.ПолучитьСписокСвойств(Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСвойств"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Массив").Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ПолучитьСписокЗаказов() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Результат = OPI_VK.ПолучитьСписокЗаказов(Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Массив").Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ЗагрузитьВидео() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Видео = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Video"); - Наименование = "Новое видео"; - Описание = "Описание видео"; - - Результат = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, Наименование, Описание, , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_id"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_hash"]).Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -#КонецОбласти - -#Область YandexDisk - -Процедура ЯДиск_ПолучитьИнформациюОДиске() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Соответствие = "Соответствие"; - - Результат = OPI_YandexDisk.ПолучитьИнформациюОДиске(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОДиске"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["system_folders"]).ИмеетТип(Соответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user"]).ИмеетТип(Соответствие); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_СоздатьПапку() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Путь = "/" + Строка(Новый УникальныйИдентификатор); - - Результат = OPI_YandexDisk.СоздатьПапку(Токен, Путь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("dir"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь); - - OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; - - OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL); - OPI_Инструменты.Пауза(5); - - Результат = OPI_YandexDisk.ПолучитьОбъект(Токен, Путь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбъект"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь); - - OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_ЗагрузитьУдалитьФайл() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - ИВФ = ПолучитьИмяВременногоФайла("png"); - Картинка.Записать(ИВФ); - - Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, Картинка, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); - - Проверка_Пусто(Результат); - OPI_Инструменты.Пауза(5); - - Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект"); - - Проверка_Пусто(Результат); - - Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, ИВФ, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); - - Проверка_Пусто(Результат); - OPI_Инструменты.Пауза(5); - - Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект"); - - Проверка_Пусто(Результат); - - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_СоздатьКопиюОбъекта() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - ПутьОригинала = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - ПутьКопии = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - URL = "https://raw.githubusercontent.com/Bayselonarrend/" - + "OpenIntegrations/main/Media/logo.png"; - - OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL); - OPI_Инструменты.Пауза(5); - - Результат = OPI_YandexDisk.СоздатьКопиюОбъекта(Токен, ПутьОригинала, ПутьКопии, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКопиюОбъекта"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии); - - OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь); - OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_ПолучитьСсылкуНаСкачивание() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; - - OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL); - OPI_Инструменты.Пауза(5); - - Результат = OPI_YandexDisk.ПолучитьСсылкуДляСкачивания(Токен, Путь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуДляСкачивания"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено(); - - URL = Результат["href"]; - - Результат = OPI_YandexDisk.СкачатьФайл(Токен, Путь); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные").Заполнено(); - - OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); - -КонецПроцедуры - -Процедура ЯДиск_ПолучитьСписокФайлов() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Количество = 2; - Отступ = 1; - - Результат = OPI_YandexDisk.ПолучитьСписокФайлов(Токен, Количество, Отступ, "image"); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив"); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_ПереместитьОбъект() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - ПутьОригинала = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - ПутьКопии = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - URL = "https://raw.githubusercontent.com/Bayselonarrend/" - + "OpenIntegrations/main/Media/logo.png"; - - OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL); - OPI_Инструменты.Пауза(15); - - Результат = OPI_YandexDisk.ПереместитьОбъект(Токен, ПутьОригинала, ПутьКопии, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьОбъект"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии); - - OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь); - OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_ДействияПубличныхОбъектов() Экспорт - - PUrl = "public_url"; - Соответствие = "Соответствие"; - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; - - OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL); - OPI_Инструменты.Пауза(5); - - МассивРезультатов = Новый Массив; - - МассивРезультатов.Добавить(OPI_YandexDisk.ОпубликоватьОбъект(Токен, Путь)); - ПубличныйURL = МассивРезультатов[0][PUrl]; - - Результат = OPI_YandexDisk.ПолучитьСсылкуСкачиванияПубличногоОбъекта(Токен, ПубличныйURL); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияПубличногоОбъекта"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено(); - - Результат = OPI_YandexDisk.ПолучитьПубличныйОбъект(Токен, ПубличныйURL); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПубличныйОбъект"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("/"); - - МассивРезультатов.Добавить(OPI_YandexDisk.СохранитьПубличныйОбъектНаДиск(Токен, ПубличныйURL)); - - МассивРезультатов.Добавить(OPI_YandexDisk.ОтменитьПубликациюОбъекта(Токен, Путь)); - - Счетчик = 0; - Для Каждого Результат Из МассивРезультатов Цикл - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Изменение публикации"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Заполнено(); - - Если Счетчик = 0 Тогда - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Строка").Заполнено(); - Иначе - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Неопределено"); - КонецЕсли; - - Счетчик = Счетчик + 1; - - КонецЦикла; - - OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_ПолучитьСписокОпубликованных() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Количество = 2; - Отступ = 1; - - Результат = OPI_YandexDisk.ПолучитьСписокОпубликованныхОбъектов(Токен, Количество, Отступ); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОпубликованныхОбъектов"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив"); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -#КонецОбласти - -#Область Viber - -Процедура Вайбер_ПолучитьИнформациюОКанале() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - Результат = OPI_Viber.ПолучитьИнформациюОКанале(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОКанале"); - - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ПолучитьДанныеПользователя() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - Результат = OPI_Viber.ПолучитьДанныеПользователя(Токен, Пользователь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["chat_hostname"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Заполнено(); - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ПолучитьОнлайнПользователей() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Результат = OPI_Viber.ПолучитьОнлайнПользователей(Токен, Пользователь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОнлайнПользователей"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["users"]).ИмеетТип("Массив"); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ОтправитьТекстовоеСообщение() Экспорт - - Текст = "Тестовое сообщение"; - ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - - МассивКнопок = Новый Массив; - МассивКнопок.Добавить("Кнопка 1"); - МассивКнопок.Добавить("Кнопка 2"); - МассивКнопок.Добавить("Кнопка 3"); - - Клавиатура = OPI_Viber.СформироватьКлавиатуруИзМассиваКнопок(МассивКнопок); - - Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенБота, Текст, Пользователь, Ложь, Клавиатура); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенКанал, Текст, Администратор, Истина, Клавиатура); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ОтправитьКартинку() Экспорт - - Текст = "Тестовое сообщение"; - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"); - ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - - Результат = OPI_Viber.ОтправитьКартинку(ТокенБота, Картинка, Пользователь, Ложь, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - Результат = OPI_Viber.ОтправитьКартинку(ТокенКанал, Картинка, Администратор, Истина, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ОтправитьФайл() Экспорт - - Документ = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document"); - ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - - Результат = OPI_Viber.ОтправитьФайл(ТокенБота, Документ, Пользователь, Ложь, "docx"); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - Результат = OPI_Viber.ОтправитьФайл(ТокенКанал, Документ, Администратор, Истина, "docx"); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ОтправитьКонтакт() Экспорт - - Имя = "Петр Петров"; - Телефон = "+123456789"; - ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - - Результат = OPI_Viber.ОтправитьКонтакт(ТокенБота, Имя, Телефон, Пользователь, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - Результат = OPI_Viber.ОтправитьКонтакт(ТокенКанал, Имя, Телефон, Администратор, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ОтправитьЛокацию() Экспорт - - Широта = "48.87373649724122"; - Долгота = "2.2954639195323967"; - ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - - Результат = OPI_Viber.ОтправитьЛокацию(ТокенБота, Широта, Долгота, Пользователь, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - Результат = OPI_Viber.ОтправитьЛокацию(ТокенКанал, Широта, Долгота, Администратор, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ОтправитьСсылку() Экспорт - - URL = "https://github.com/Bayselonarrend/OpenIntegrations"; - ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - - Результат = OPI_Viber.ОтправитьСсылку(ТокенБота, URL, Пользователь, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - Результат = OPI_Viber.ОтправитьСсылку(ТокенКанал, URL, Администратор, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -#КонецОбласти - -#Область GoogleWorkspace - -Процедура ГВ_ПолучитьСсылкуАвторизации() Экспорт - - ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID"); - Результат = OPI_GoogleWorkspace.СформироватьСсылкуПолученияКода(ClientID); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Строка") - .Заполнено(); - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Link", Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГВ_ПолучитьТокен() Экспорт - - ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID"); - ClientSecret = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret"); - Code = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Code"); - - Результат = OPI_GoogleWorkspace.ПолучитьТокенПоКоду(ClientID, ClientSecret, Code); - - Если ЗначениеЗаполнено(Результат["access_token"]) - И ЗначениеЗаполнено(Результат["refresh_token"]) Тогда - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token" , Результат["access_token"]); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Refresh", Результат["refresh_token"]); - - КонецЕсли; - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГВ_ОбновитьТокен() Экспорт - - ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID"); - ClientSecret = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret"); - RefreshToken = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Refresh"); - - Результат = OPI_GoogleWorkspace.ОбновитьТокен(ClientID, ClientSecret, RefreshToken); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено(); - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token", Результат["access_token"]); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -#КонецОбласти - -#Область GoogleCalendar - -Процедура ГК_ПолучитьСписокКалендарей() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Результат = OPI_GoogleCalendar.ПолучитьСписокКалендарей(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКалендарей"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Массив"); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГК_СоздатьУдалитьКалендарь() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Наименование = "Тестовый календарь"; - Описание = "Тестовое описание"; - НаименованиеИзмененное = Наименование + " (изм.)"; - ТипСоответствие = Тип("Соответствие"); - ТипСтрока = Тип("Строка"); - Summary = "summary"; - Черный = "#000000"; - Желтый = "#ffd800"; - - Результат = OPI_GoogleCalendar.СоздатьКалендарь(Токен, Наименование); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКалендарь"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(Наименование); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип(ТипСтрока).Заполнено(); - - Календарь = Результат["id"]; - - Результат = OPI_GoogleCalendar.ИзменитьМетаданныеКалендаря(Токен - , Календарь - , НаименованиеИзмененное - , Описание); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьМетаданныеКалендаря"); - - Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание); - - Результат = OPI_GoogleCalendar.ПолучитьМетаданныеКалендаря(Токен, Календарь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьМетаданныеКалендаря"); - - Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание); - - Результат = OPI_GoogleCalendar.ДобавитьКалендарьВСписок(Токен, Календарь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьКалендарьВСписок"); - - Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание); - - Результат = OPI_GoogleCalendar.ИзменитьКалендарьСписка(Токен, Календарь, Черный, Желтый, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКалендарьСписка"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый); - - Результат = OPI_GoogleCalendar.ПолучитьКалендарьСписка(Токен, Календарь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКалендарьСписка"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый); - - Результат = OPI_GoogleCalendar.ОчиститьОсновнойКалендарь(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьОсновнойКалендарь"); - - Проверка_Пусто(Результат); - - Результат = OPI_GoogleCalendar.УдалитьКалендарьИзСписка(Токен, Календарь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарьИзСписка"); - - Проверка_Пусто(Результат); - - Результат = OPI_GoogleCalendar.УдалитьКалендарь(Токен, Календарь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарь"); - - Проверка_Пусто(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГК_СоздатьУдалитьСобытие() Экспорт - - ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID"); - Наименование = "Новое событие"; - Описание = "Описание тестового события"; - ОписаниеИзм = "Описание тестового события (изм.)"; - UID = "id"; - Час = 3600; - - Вложения = Новый Соответствие; - - Вложения.Вставить("Картинка1" - , "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png"); - Вложения.Вставить("Картинка2" - , "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"); - - СоответствиеСобытия = Новый Соответствие; - СоответствиеСобытия.Вставить("Описание" , Описание); - СоответствиеСобытия.Вставить("Заголовок" , Наименование); - СоответствиеСобытия.Вставить("МестоПроведения" , "В офисе"); - СоответствиеСобытия.Вставить("ДатаНачала" , ТекущаяДата); - СоответствиеСобытия.Вставить("ДатаОкончания" , СоответствиеСобытия["ДатаНачала"] + Час); - СоответствиеСобытия.Вставить("МассивURLФайловВложений" , Вложения); - СоответствиеСобытия.Вставить("ОтправлятьУведомления" , Истина); - - Результат = OPI_GoogleCalendar.СоздатьСобытие(Токен, Календарь, СоответствиеСобытия); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСобытие"); - - Событие = Результат[UID]; - - Проверка_ГКОбъект(Результат, Наименование, Описание); - - СоответствиеСобытия = Новый Соответствие; - СоответствиеСобытия.Вставить("Описание", ОписаниеИзм); - - Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСобытие"); - - Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм); - - Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСобытие"); - - Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм); - - Результат = OPI_GoogleCalendar.ПереместитьСобытие(Токен, Календарь, Календарь, Событие); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьСобытие"); - - Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм); - - Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСобытие"); - - Проверка_Пусто(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГК_ПолучитьСписокСобытий() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID"); - - Результат = OPI_GoogleCalendar.ПолучитьСписокСобытий(Токен, Календарь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСобытий"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив"); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -#КонецОбласти - -#Область GoogleDrive - -Процедура ГД_ПолучитьСписокКаталогов() Экспорт - - MimeType = "mimeType"; - Name = "name"; - Имя = "Тестовая папка"; - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Результат = OPI_GoogleDrive.ПолучитьСписокКаталогов(Токен, Имя, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаталогов"); - - Результат = Результат[0]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено(); - - OPI_Инструменты.Пауза(5); - Идентификатор = Результат["id"]; - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GD_Catalog", Идентификатор); - - Результат = OPI_GoogleDrive.ПолучитьИнформациюОбОбъекте(Токен, Идентификатор); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГД_ЗагрузитьУдалитьФайл() Экспорт - - ЛишниеБайты = 2; - - Kind = "kind"; - Content = "content"; - MIME = "MIME"; - MimeType = "mimeType"; - Name = "name"; - Id_ = "id"; - - МассивУдаляемых = Новый Массив; - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - КартинкаЗамены = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2"); - Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog"); - - Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла(); - Описание.Вставить("Родитель", Каталог); - - Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Описание["Имя"]); - - Идентификатор = Результат[Id_]; - МассивУдаляемых.Добавить(Идентификатор); - - НовоеИмя = "Скопированный файл.jpeg"; - Результат = OPI_GoogleDrive.СкопироватьОбъект(Токен, Идентификатор, НовоеИмя, "root"); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкоприроватьОбъект"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя); - - МассивУдаляемых.Добавить(Результат[Id_]); - - Результат = OPI_GoogleDrive.СкачатьФайл(Токен, Идентификатор); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Картинка.Размер() + ЛишниеБайты); - OPI_Инструменты.Пауза(5); - - НовоеИмя = "Обновленный файл.jpg"; - Результат = OPI_GoogleDrive.ОбновитьФайл(Токен, Идентификатор, КартинкаЗамены, НовоеИмя); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьФайл"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя); - - OPI_Инструменты.Пауза(5); - - Комментарий = "Yo"; - Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment"); - - OPI_Инструменты.Пауза(5); - - Для Каждого Удаляемый Из МассивУдаляемых Цикл - Результат = OPI_GoogleDrive.УдалитьОбъект(Токен, Удаляемый); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь); - OPI_Инструменты.Пауза(2); - КонецЦикла; - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГД_СоздатьУдалитьКомментарий() Экспорт - - Kind = "kind"; - Content = "content"; - Id_ = "id"; - Comments = "comments"; - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog"); - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - - Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла(); - Описание.Вставить("Родитель", Каталог); - - Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание); - Идентификатор = Результат[Id_]; - - Комментарий = "Новый комментарий"; - МассивРезультатов = Новый Массив; - Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий"); - - ИДКомментария = Результат[Id_]; - - МассивРезультатов.Добавить(Результат); - - Результат = OPI_GoogleDrive.ПолучитьКомментарий(Токен, Идентификатор, ИДКомментария); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарий"); - - МассивРезультатов.Добавить(Результат); - - Результат = OPI_GoogleDrive.ПолучитьСписокКомментариев(Токен, Идентификатор); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКомментариев"); - - Комментарии = Результат[Comments]; - ОбъектКомментарий = Комментарии[Комментарии.ВГраница()]; - - МассивРезультатов.Добавить(ОбъектКомментарий); - - Для Каждого Результат Из МассивРезультатов Цикл - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment"); - КонецЦикла; - - Результат = OPI_GoogleDrive.УдалитьКомментарий(Токен, Идентификатор, ИДКомментария); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь); - - OPI_GoogleDrive.УдалитьОбъект(Токен, Идентификатор); - -КонецПроцедуры - -Процедура ГД_СоздатьКаталог() Экспорт - - Name = "name"; - Имя = "Тестовая папка"; - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog"); - - МассивРезультатов = Новый Массив; - - МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя)); - МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя, Каталог)); - - Для Каждого Результат Из МассивРезультатов Цикл - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку"); - - ИДКаталога = Результат["id"]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Имя); - - OPI_GoogleDrive.УдалитьОбъект(Токен, ИДКаталога); - - КонецЦикла; - -КонецПроцедуры - -#КонецОбласти - -#Область GoogleSheets - -Процедура ГТ_СоздатьТаблицу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Наименование = "Тестовая таблица"; - - МассивЛистов = Новый Массив; - МассивЛистов.Добавить("Лист1"); - МассивЛистов.Добавить("Лист2"); - - Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКнигу"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование); - - Для Н = 0 По МассивЛистов.ВГраница() Цикл - - ИмяЛиста = Результат["sheets"][Н]["properties"]["title"]; - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ИмяЛиста).Равно(МассивЛистов[Н]); - Лист = Результат["sheets"][Н]["properties"]["sheetId"]; - Лист = OPI_Инструменты.ЧислоВСтроку(Лист); - - КонецЦикла; - - Книга = Результат["spreadsheetId"]; - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Spreadsheet", Книга); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Sheet" , Лист); - - Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов); - Книга2 = Результат["spreadsheetId"]; - - Результат = OPI_GoogleSheets.КопироватьЛист(Токен, Книга, Книга2, Лист); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьЛист"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["title"]).Равно(ИмяЛиста + " (копия)"); - - Наименование = "Тестовый лист"; - - Результат = OPI_GoogleSheets.ДобавитьЛист(Токен, Книга, Наименование); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьЛист"); - - НовыйЛист = Результат["replies"][0]["addSheet"]["properties"]["sheetId"]; - НовыйЛист = OPI_Инструменты.ЧислоВСтроку(НовыйЛист); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - - Результат = OPI_GoogleSheets.УдалитьЛист(Токен, Книга, НовыйЛист); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЛист"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - - Наименование = "Тестовая таблица (изм.)"; - - Результат = OPI_GoogleSheets.ИзменитьНаименованиеКниги(Токен, Книга, Наименование); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьНаименованиеКниги"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - -КонецПроцедуры - -Процедура ГТ_ПолучитьТаблицу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet"); - Наименование = "Тестовая таблица (изм.)"; - - Результат = OPI_GoogleSheets.ПолучитьКнигу(Токен, Книга); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицу"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование); - -КонецПроцедуры - -Процедура ГТ_ЗаполнитьОчиститьЯчейки() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet"); - Лист = "Лист2"; - - СтруктураЯчеек = Новый Соответствие; - СтруктураЯчеек.Вставить("A1", "Это A1"); - СтруктураЯчеек.Вставить("A2", "Это A2"); - СтруктураЯчеек.Вставить("B2", "Это B2"); - СтруктураЯчеек.Вставить("B3", "Это B3"); - СтруктураЯчеек.Вставить("A3", "Это A3"); - СтруктураЯчеек.Вставить("A4", "Это A4"); - СтруктураЯчеек.Вставить("B1", "Это B1"); - СтруктураЯчеек.Вставить("B4", "Это B4"); - - МассивЯчеек = Новый Массив; - МассивЯчеек.Добавить("B2"); - МассивЯчеек.Добавить("A3"); - МассивЯчеек.Добавить("B4"); - - Результат = OPI_GoogleSheets.УстановитьЗначенияЯчеек(Токен, Книга, СтруктураЯчеек, Лист); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЗначенияЯчеек"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["totalUpdatedCells"]).Равно(СтруктураЯчеек.Количество()); - - Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, МассивЯчеек, Лист); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["valueRanges"].Количество()).Равно(МассивЯчеек.Количество()); - - Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, , Лист); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - - МассивЯчеек = Новый Массив; - МассивЯчеек.Добавить("B2"); - МассивЯчеек.Добавить("A3"); - МассивЯчеек.Добавить("B4"); - - Результат = OPI_GoogleSheets.ОчиститьЯчейки(Токен, Книга, МассивЯчеек, Лист); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьЯчейки"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["clearedRanges"].Количество()).Равно(МассивЯчеек.Количество()); - -КонецПроцедуры - -#КонецОбласти - -#Область Twitter - -Процедура Твиттер_ПолучитьСсылкуАвторизации() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Результат = OPI_Twitter.ПолучитьСсылкуАвторизации(Параметры); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено(); - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_URL", Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Твиттер_ОбновитьТокен() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Результат = OPI_Twitter.ОбновитьТокен(Параметры); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["refresh_token"]).Заполнено(); - - Рефреш = Результат["refresh_token"]; - Токен = Результат["access_token"]; - - Если ЗначениеЗаполнено(Рефреш) И Не Рефреш = "null" Тогда - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Refresh", Рефреш); - КонецЕсли; - - Если ЗначениеЗаполнено(Токен) И Не Токен = "null" Тогда - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Token" , Токен); - КонецЕсли; - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Твиттер_СоздатьТекстовыйТвит() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); - - Результат = OPI_Twitter.СоздатьТекстовыйТвит(Текст, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТекстовыйТвит"); - - Проверка_ТвиттерТекст(Результат, Текст); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Твиттер_СоздатьТвитСКартинкой() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - ИВФ = ПолучитьИмяВременногоФайла("png"); - Картинка.Записать(ИВФ); - - Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, Картинка, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки"); - - Проверка_ТвиттерТекст(Результат, Текст); - - Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, ИВФ, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки"); - - Проверка_ТвиттерТекст(Результат, Текст); - - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(20); - -КонецПроцедуры - -Процедура Твиттер_СоздатьТвитСВидео() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); - Видео = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Video"); - ИВФ = ПолучитьИмяВременногоФайла("mp4"); - Видео.Записать(ИВФ); - - Результат = OPI_Twitter.СоздатьТвитВидео(Текст, Видео, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео"); - - Проверка_ТвиттерТекст(Результат, Текст); - - Результат = OPI_Twitter.СоздатьТвитВидео(Текст, ИВФ, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео"); - - Проверка_ТвиттерТекст(Результат, Текст); - - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(20); - -КонецПроцедуры - -Процедура Твиттер_СоздатьТвитСГиф() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); - Гифка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("GIF"); - ИВФ = ПолучитьИмяВременногоФайла("gif"); - Гифка.Записать(ИВФ); - - Результат = OPI_Twitter.СоздатьТвитГифки(Текст, Гифка, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки"); - - Проверка_ТвиттерТекст(Результат, Текст); - - Результат = OPI_Twitter.СоздатьТвитГифки(Текст, ИВФ, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки"); - - Проверка_ТвиттерТекст(Результат, Текст); - - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(20); - -КонецПроцедуры - -Процедура Твиттер_СоздатьТвитСОпросом() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); - МассивОтветов = Новый Массив; - МассивОтветов.Добавить("Вариант 1"); - МассивОтветов.Добавить("Вариант 2"); - - Результат = OPI_Twitter.СоздатьТвитОпрос(Текст, МассивОтветов, 60, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитОпрос"); - - Проверка_ТвиттерТекст(Результат, Текст); - - OPI_Инструменты.Пауза(20); - -КонецПроцедуры - -#КонецОбласти - -#Область Notion - -Процедура Ноушн_СоздатьСтраницу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent"); - Заголовок = "Тестовый заголовок"; - - Результат = OPI_Notion.СоздатьСтраницу(Токен, Родитель, Заголовок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницу"); - - Проверка_НоушнОбъект(Результат); - -КонецПроцедуры - -Процедура Ноушн_СоздатьИзменитьБазу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent"); - Заголовок = "Тестовый заголовок"; - - Свойства = Новый Соответствие; - Свойства.Вставить("Имя" , "title"); - Свойства.Вставить("Описание" , "rich_text"); - Свойства.Вставить("Номер" , "number"); - Свойства.Вставить("Статус" , "status"); - Свойства.Вставить("Дата создания" , "date"); - Свойства.Вставить("Картинка" , "files"); - Свойства.Вставить("Активен" , "checkbox"); - Свойства.Вставить("Сайт" , "url"); - Свойства.Вставить("Почта" , "email"); - Свойства.Вставить("Телефон" , "phone_number"); - Свойства.Вставить("Пользователь" , "people"); - - ВыборЗначения = Новый Соответствие; - ВыборЗначения.Вставить("Новый", "green"); - ВыборЗначения.Вставить("В работе", "yellow"); - ВыборЗначения.Вставить("Удаленный", "red"); - Свойства.Вставить("Статус", ВыборЗначения); - - Результат = OPI_Notion.СоздатьБазуДанных(Токен, Родитель, Заголовок, Свойства); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных"); - - Проверка_НоушнОбъект(Результат, "database"); - - База = Результат["id"]; - Заголовок = "Тестовый заголовок"; - Описание = "Тестовое описание"; - - Свойства = Новый Соответствие; - Свойства.Вставить("Почта", "rich_text"); // Тип поля "Почта" будет изменен с email на текст - Свойства.Вставить("Сайт"); // Поле "Сайт" будет удалено - - Результат = OPI_Notion.ИзменитьСвойстваБазы(Токен, База, Свойства, Заголовок, Описание); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваБазы"); - - Проверка_НоушнОбъект(Результат, "database"); - -КонецПроцедуры - -Процедура Ноушн_ПолучитьИнформациюОСтранице() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page"); - - Результат = OPI_Notion.ПолучитьСтраницу(Токен, Страница); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтраницу"); - - Проверка_НоушнОбъект(Результат); - -КонецПроцедуры - -Процедура Ноушн_ПолучитьИнформациюОБазе() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base"); - - Результат = OPI_Notion.ПолучитьБазуДанных(Токен, База); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьБазуДанных"); - - Проверка_НоушнОбъект(Результат, "database"); - -КонецПроцедуры - -Процедура Ноушн_СоздатьСтраницуВБазу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base"); - - Картинка = Новый Соответствие; - Картинка.Вставить("Лого", OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture")); - - Свойства = Новый Соответствие; - Свойства.Вставить("Имя" , "ООО Вектор"); - Свойства.Вставить("Описание" , "Наш первый клиент"); - Свойства.Вставить("Номер" , 1); - Свойства.Вставить("Статус" , "Обычный"); - Свойства.Вставить("Дата создания" , OPI_Инструменты.ПолучитьТекущуюДату()); - Свойства.Вставить("Картинка" , Картинка); - Свойства.Вставить("Активен" , Истина); - Свойства.Вставить("Сайт" , "https://vector.ru"); - Свойства.Вставить("Почта" , "mail@vector.ru"); - Свойства.Вставить("Телефон" , "88005553535"); - Свойства.Вставить("Статус" , "Новый"); - - Результат = OPI_Notion.СоздатьСтраницуВБазу(Токен, База, Свойства); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницуВБазу"); - - Проверка_НоушнОбъект(Результат); - - Родитель = СтрЗаменить(Результат["parent"]["database_id"], "-", ""); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Родитель).Равно(База); - -КонецПроцедуры - -Процедура Ноушн_ИзменитьСвойстваСтраницы() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page"); - Иконка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"); - Обложка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture2"); - Архивировать = Ложь; - - Свойства = Новый Соответствие; - Свойства.Вставить("Активен" , Ложь); - Свойства.Вставить("Почта" , "vector@mail.ru"); - - Результат = OPI_Notion.ИзменитьСвойстваСтраницы(Токен - , Страница - , Свойства - , Иконка - , Обложка - , Архивировать); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваСтраницы"); - - Проверка_НоушнОбъект(Результат); - -КонецПроцедуры - -Процедура Ноушн_СоздатьУдалитьБлок() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent"); - Блок = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Block"); - - Результат = OPI_Notion.ВернутьБлок(Токен, Блок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьБлок"); - - Проверка_НоушнОбъект(Результат, "block"); - - Результат = OPI_Notion.СоздатьБлок(Токен, Родитель, Результат); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБлок"); - - Проверка_НоушнОбъект(Результат, "list"); - - Блок = Результат["results"][0]["id"]; - Результат = OPI_Notion.ВернутьДочерниеБлоки(Токен, Блок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьДочерниеБлоки"); - - Проверка_НоушнОбъект(Результат, "list"); - - Результат = OPI_Notion.УдалитьБлок(Токен, Блок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБлок"); - - Проверка_НоушнОбъект(Результат, "block"); - -КонецПроцедуры - -Процедура Ноушн_ПолучитьПользователей() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Результат = OPI_Notion.СписокПользователей(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СписокПользователей"); - - Проверка_НоушнОбъект(Результат, "list"); - -КонецПроцедуры - -Процедура Ноушн_ПолучитьДанныеПользователя() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_User"); - Результат = OPI_Notion.ПолучитьДанныеПользователя(Токен, Пользователь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя"); - - Проверка_НоушнОбъект(Результат, "user"); - -КонецПроцедуры - -#КонецОбласти - -#Область Slack - -Процедура Слак_ПолучитьИнформациюОБоте() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Результат = OPI_Slack.ПолучитьИнформациюОБоте(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОБоте"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bot_id"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user_id"]).Заполнено(); - -КонецПроцедуры - -Процедура Слак_ПолучитьСписокПользователей() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Результат = OPI_Slack.ПолучитьСписокПользователей(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователей"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Слак_ПолучитьСписокОбластей() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Результат = OPI_Slack.ПолучитьСписокРабочихОбластей(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокРабочихОбластей"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["teams"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Слак_ОтправитьУдалитьСообщение() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - Текст = "Тестовое сообщение 1"; - Текст2 = "Тестовое сообщение 2"; - Отметки = Новый Массив; - Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"; - - Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст); - - Отметка = Результат["ts"]; - - Результат = OPI_Slack.ИзменитьСообщение(Токен, Канал, Отметка, Текст2); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСообщение"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст2); - - Результат = OPI_Slack.ПолучитьСписокОтветовНаСообщение(Токен, Канал, Отметка); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтветовНаСообщение"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив"); - - Результат = OPI_Slack.ПолучитьСсылкуНаСообщение(Токен, Канал, Отметка); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуНаСообщение"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["permalink"]).Заполнено(); - - Проверка_СлакОк(Результат); - - Отметки.Добавить(Отметка); - - МассивБлоков = Новый Массив; - Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo"); - МассивБлоков.Добавить(Блок); - - Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , МассивБлоков); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (картинка)"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); - - Отметки.Добавить(Результат["ts"]); - - Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo"); - БлокJSON = OPI_Инструменты.JSONСтрокой(Блок); - - ИВФ = ПолучитьИмяВременногоФайла("json"); - - ТекстовыйДокумент = Новый ТекстовыйДокумент(); - ТекстовыйДокумент.УстановитьТекст(БлокJSON); - ТекстовыйДокумент.Записать(ИВФ); - - Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , ИВФ); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json)"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); - - Отметки.Добавить(Результат["ts"]); - - Блоки = "['" + ИВФ + "','" + ИВФ + "']"; - Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , Блоки); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json массив)"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); - - Отметки.Добавить(Результат["ts"]); - - УдалитьФайлы(ИВФ); - - Для Каждого Отметка Из Отметки Цикл - - Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); - - КонецЦикла; - - Час = 3600; - Сутки = 24; - Отправка = OPI_Инструменты.ПолучитьТекущуюДату() + (Сутки * Час); - Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, Отправка); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (отложенное)"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_message_id"]).Заполнено(); - - Отметка = Результат["scheduled_message_id"]; - Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение"); - - Проверка_СлакОк(Результат); - -КонецПроцедуры - -Процедура Слак_ОтправитьУдалитьЭфемерное() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User"); - Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"; - Текст = "Тестовое сообщение 1"; - - Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo"); - Результат = OPI_Slack.ОтправитьЭфемерноеСообщение(Токен, Канал, Текст, Пользователь, Блок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_ts"]).Заполнено(); - -КонецПроцедуры - -Процедура Слак_ПолучитьОтложенныеСообщения() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - - Результат = OPI_Slack.ПолучитьСписокОтложенныхСообщений(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтложенныхСообщений"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_messages"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Слак_СоздатьАрхивироватьКанал() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User"); - Имя = "testconv" + Строка(Новый УникальныйИдентификатор); - Тема = "Тестовая тема"; - Цель = "Тестовая цель"; - - #Область СоздатьКанал - Результат = OPI_Slack.СоздатьКанал(Токен, Имя); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКанал"); - - Данные = Результат["channel"]; - Канал = Данные["id"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); - #КонецОбласти - - #Область УстановитьТемуКанала - Результат = OPI_Slack.УстановитьТемуКанала(Токен, Канал, Тема); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьТемуКанала"); - - Данные = Результат["channel"]; - Канал = Данные["id"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["topic"]["value"]).Равно(Тема); - #КонецОбласти - - #Область УстановитьЦельКанала - Результат = OPI_Slack.УстановитьЦельКанала(Токен, Канал, Цель); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЦельКанала"); - - Проверка_СлакОк(Результат); - #КонецОбласти - - #Область ПолучитьКанал - Результат = OPI_Slack.ПолучитьКанал(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКанал"); - - Данные = Результат["channel"]; - Канал = Данные["id"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); - #КонецОбласти - - #Область ПригласитьПользователейВКанал - Результат = OPI_Slack.ПригласитьПользователейВКанал(Токен, Канал, Пользователь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПригласитьПользователейВКанал"); - - Данные = Результат["channel"]; - Канал = Данные["id"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); - #КонецОбласти - - #Область ВыгнатьПользователяИзКанала - Результат = OPI_Slack.ВыгнатьПользователяИзКанала(Токен, Канал, Пользователь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыгнатьПользователяИзКанала"); - - Проверка_СлакОк(Результат); - #КонецОбласти - - #Область ПолучитьИсториюКанала - Результат = OPI_Slack.ПолучитьИсториюКанала(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИсториюКанала"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив"); - #КонецОбласти - - #Область ПолучитьСписокПользователейКанала - Результат = OPI_Slack.ПолучитьСписокПользователейКанала(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователейКанала"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив"); - #КонецОбласти - - #Область ПокинутьКанал - Результат = OPI_Slack.ПокинутьКанал(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПокинутьКанал"); - - Проверка_СлакОк(Результат); - #КонецОбласти - - #Область ВступитьВКанал - Результат = OPI_Slack.ВступитьВКанал(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВступитьВКанал"); - - Данные = Результат["channel"]; - Канал = Данные["id"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); - #КонецОбласти - - #Область ПереименоватьКанал - НовоеИмя = "testconv" + Строка(Новый УникальныйИдентификатор); - Результат = OPI_Slack.ПереименоватьКанал(Токен, Канал, НовоеИмя); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьКанал"); - - Данные = Результат["channel"]; - Канал = Данные["id"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(НовоеИмя); - #КонецОбласти - - #Область АрхивироватьКанал - Результат = OPI_Slack.АрхивироватьКанал(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "АрхивироватьКанал"); - - Проверка_СлакОк(Результат); - #КонецОбласти - -КонецПроцедуры - -Процедура Слак_ПолучитьСписокКаналов() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - - Результат = OPI_Slack.ПолучитьСписокКаналов(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаналов"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channels"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Слак_ОткрытьЗакрытьДиалог() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User"); - Текст = "Yo, dude"; - - Результат = OPI_Slack.ОткрытьДиалог(Токен, Пользователь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьДиалог"); - - Диалог = Результат["channel"]["id"]; - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).ИмеетТип("Соответствие"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Диалог).Заполнено(); - - Результат = OPI_Slack.ОтправитьСообщение(Токен, Диалог, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение"); - - Проверка_СлакОк(Результат); - - Результат = OPI_Slack.ЗакрытьДиалог(Токен, Диалог); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьДиалог"); - - Проверка_СлакОк(Результат); - -КонецПроцедуры - -Процедура Слак_ПолучитьСписокФайлов() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - - Результат = OPI_Slack.ПолучитьСписокФайлов(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Слак_ЗагрузитьУдалитьФайл() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Файл = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Document"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - МассивФайлов = Новый Массив; - ИмяФайла = "megadoc.docx"; - Заголовок = "Новый файл"; - - Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); - - ЗагруженныйФайл = Результат["files"][0]; - МассивФайлов.Добавить(ЗагруженныйФайл["id"]); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); - - Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл (в канал)"); - - ЗагруженныйФайл = Результат["files"][0]; - МассивФайлов.Добавить(ЗагруженныйФайл["id"]); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); - - Результат = OPI_Slack.ПолучитьДанныеФайла(Токен, ЗагруженныйФайл["id"]); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьФайл"); - - ЗагруженныйФайл = Результат["file"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); - - Для Каждого ЗагруженныйФайл Из МассивФайлов Цикл - - Результат = OPI_Slack.УдалитьФайл(Токен, ЗагруженныйФайл); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьФайл"); - - Проверка_СлакОк(Результат); - - КонецЦикла; - -КонецПроцедуры - -Процедура Слак_ПолучитьСписокВФ() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - - Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); - - Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Слак_ЗагрузитьУдалитьВФ() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Файл = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - Заголовок = "Новый файл"; - - Результат = OPI_Slack.ДобавитьВнешнийФайл(Токен, Файл, Заголовок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВнешнийФайл"); - - ЗагруженныйФайл = Результат["file"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок); - - Результат = OPI_Slack.ПолучитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьВнешнийФайл"); - - ЗагруженныйФайл = Результат["file"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок); - - Результат = OPI_Slack.ОтправитьВнешнийФайл(Токен, ЗагруженныйФайл["id"], Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл"); - - Проверка_СлакОк(Результат); - - Результат = OPI_Slack.УдалитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл"); - - Проверка_СлакОк(Результат); - -КонецПроцедуры - -#КонецОбласти - -#Область Airtable - -Процедура АТ_СоздатьБазу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); - Область = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Workspace"); - Наименование = "Тестовая база"; - - МассивПолей = Новый Массив; - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер")); - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое")); - - ИмяТаблицы = "Тестовая таблица"; - - СоответствиеТаблиц = Новый Соответствие; - СоответствиеТаблиц.Вставить(ИмяТаблицы, МассивПолей); - - Результат = OPI_Airtable.СоздатьБазу(Токен, Область, Наименование, СоответствиеТаблиц); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазу"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"][0]["name"]).Равно(ИмяТаблицы); - - База = Результат["id"]; - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Base", База); - - Результат = OPI_Airtable.ПолучитьТаблицыБазы(Токен, База); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицыБазы"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).ИмеетТип("Массив"); - - Результат = OPI_Airtable.ПолучитьСписокБаз(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокБаз"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура АТ_СоздатьТаблицу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); - База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); - - МассивПолей = Новый Массив; - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[0], "ПолучитьПолеНомера"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[1], "ПолучитьПолеСтроковое"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеВложения("Вложение")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[2], "ПолучитьПолеВложения"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеФлажка("Флажок")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[3], "ПолучитьПолеФлажка"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеДаты("Дата")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[4], "ПолучитьПолеДаты"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеТелефона("Телефон")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[5], "ПолучитьПолеТелефона"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеПочты("Почта")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[6], "ПолучитьПолеПочты"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСсылки("Ссылка")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[7], "ПолучитьПолеСсылки"); - - ИмяТаблицы = "Тестовая таблица 2"; - Описание = "Новая таблица"; - - Результат = OPI_Airtable.СоздатьТаблицу(Токен, База, ИмяТаблицы, МассивПолей, Описание); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); - - Таблица = Результат["id"]; - ИмяТаблицы = "Тестовая таблица 2 (изм.)"; - Описание = "Новая таблица (изм.)"; - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Table", Таблица); - - Результат = OPI_Airtable.ИзменитьТаблицу(Токен, База, Таблица, ИмяТаблицы, Описание); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТаблицу"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); - -КонецПроцедуры - -Процедура АТ_СоздатьПоле() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); - База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); - Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table"); - Имя = Строка(Новый УникальныйИдентификатор); - - Поле = OPI_Airtable.ПолучитьПолеНомера(Имя); - - Результат = OPI_Airtable.СоздатьПоле(Токен, База, Таблица, Поле); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПоле"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя); - - Поле = Результат["id"]; - Имя = Имя + "(изм.)"; - Описание = "Новое описание"; - - Результат = OPI_Airtable.ИзменитьПоле(Токен, База, Таблица, Поле, Имя, Описание); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПоле"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); - -КонецПроцедуры - -Процедура АТ_СоздатьУдалитьЗаписи() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); - База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); - Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table"); - - Числовой = 10; - Строчный = "Привет"; - - ОписаниеСтроки1 = Новый Структура("Номер,Строковое", Числовой, Строчный); - ОписаниеСтроки2 = Новый Структура("Номер,Строковое", Числовой, Строчный); - - МассивУдаляемых = Новый Массив; - МассивОписаний = Новый Массив; - МассивОписаний.Добавить(ОписаниеСтроки1); - МассивОписаний.Добавить(ОписаниеСтроки2); - - Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, МассивОписаний); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(2); - - Для Каждого Запись Из Результат["records"] Цикл - МассивУдаляемых.Добавить(Запись["id"]); - КонецЦикла; - - Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, ОписаниеСтроки1); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи (одна)"); - - ОдиночнаяЗапись = Результат["id"]; - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ОдиночнаяЗапись).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["createdTime"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["fields"]["Номер"]).Равно(Числовой); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(СокрЛП(Результат["fields"]["Строковое"])).Равно(Строчный); - - Результат = OPI_Airtable.ПолучитьЗапись(Токен, База, Таблица, ОдиночнаяЗапись); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗапись"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(ОдиночнаяЗапись); - - Текст = "Тестовый комментарий"; - Результат = OPI_Airtable.СоздатьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст); - - Коммент = Результат["id"]; - Текст = "Тестовый комментарий (изм.)"; - Результат = OPI_Airtable.ИзменитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКомментарий"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст); - - Результат = OPI_Airtable.ПолучитьКомментарии(Токен, База, Таблица, ОдиночнаяЗапись); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарии"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["comments"]).ИмеетТип("Массив"); - - Результат = OPI_Airtable.УдалитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["deleted"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(Коммент); - - Результат = OPI_Airtable.ПолучитьСписокЗаписей(Токен, База, Таблица); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаписей"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено(); - - Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, МассивУдаляемых); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено(); - - Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, ОдиночнаяЗапись); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи (одна)"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено(); - -КонецПроцедуры - -#КонецОбласти - -#Область Dropbox - -Процедура ДропБокс_ПолучитьОбновитьТокен() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appkey" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appsecret", ПараметрыТеста); - - Dropbox_ПолучитьСсылкуАвторизации(ПараметрыТеста); - - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Code", ПараметрыТеста); - - Dropbox_ПолучитьТокен(ПараметрыТеста); - - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Refresh", ПараметрыТеста); - - Dropbox_ОбновитьТокен(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_ЗагрузитьФайл() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture", ПараметрыТеста); - - Dropbox_ЗагрузитьФайл(ПараметрыТеста); - Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыТеста); - Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыТеста); - Dropbox_ВосстановитьОбъектКВерсии(ПараметрыТеста); - Dropbox_ПолучитьПревью(ПараметрыТеста); - Dropbox_СкачатьФайл(ПараметрыТеста); - Dropbox_ПереместитьОбъект(ПараметрыТеста); - Dropbox_КопироватьОбъект(ПараметрыТеста); - Dropbox_УдалитьОбъект(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_СоздатьКаталог() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); - - Dropbox_СоздатьПапку(ПараметрыТеста); - Dropbox_СкачатьПапку(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_ПолучитьСписокФайловПапки() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); - - Dropbox_ПолучитьСписокФайловПапки(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_ЗагрузитьФайлПоURL() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document", ПараметрыТеста); - - Dropbox_ЗагрузитьФайлПоURL(ПараметрыТеста); - Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_СоздатьУдалитьТег() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); - - Dropbox_ДобавитьТег(ПараметрыТеста); - Dropbox_ПолчитьСписокТегов(ПараметрыТеста); - Dropbox_УдалитьТег(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_ПолучитьАккаунт() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); - - Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыТеста); - Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_РаботаСДоступами() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_OtherUser", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_FileID" , ПараметрыТеста); - - Dropbox_ДобавитьПользователейКФайлу(ПараметрыТеста); - Dropbox_ОпубликоватьПапку(ПараметрыТеста); - Dropbox_ДобавитьПользователейКПапке(ПараметрыТеста); - Dropbox_ОтменитьПубликациюПапки(ПараметрыТеста); - Dropbox_ОтменитьПубликациюФайла(ПараметрыТеста); - -КонецПроцедуры - -#КонецОбласти - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ПолучитьПараметрыВК() - - Параметры = Новый Структура; - НомерГруппы = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_GroupID"); - - Параметры.Вставить("access_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_Token")); - Параметры.Вставить("owner_id" , "-" + НомерГруппы); - Параметры.Вставить("app_id" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AppID")); - Параметры.Вставить("group_id" , НомерГруппы); - - Возврат Параметры; - -КонецФункции - -Функция ПолучитьПараметрыТвиттер() - - Параметры = Новый Соответствие; - - Параметры.Вставить("redirect_uri" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Redirect")); - Параметры.Вставить("client_id" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClinetID")); - Параметры.Вставить("client_secret" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClientSecret")); - Параметры.Вставить("access_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Token")); - Параметры.Вставить("refresh_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Refresh")); - Параметры.Вставить("oauth_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthToken")); - Параметры.Вставить("oauth_token_secret" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthSecret")); - - Параметры.Вставить("oauth_consumer_key" - , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerKey")); - Параметры.Вставить("oauth_consumer_secret" - , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerSecret")); - - Возврат Параметры; - -КонецФункции - -#Область Проверки - -Процедура Проверка_Пусто(Знач Результат) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь); -КонецПроцедуры - -Процедура Проверка_ДвоичныеДанные(Знач Результат, Знач Размер = Неопределено) - - МинимальныйРазмер = 500000; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные"); - - Если Не Размер = Неопределено Тогда - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Размер); - Иначе - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер() > МинимальныйРазмер).Равно(Истина); - КонецЕсли; - -КонецПроцедуры - -Процедура Проверка_ТелеграмИстина(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина); - -КонецПроцедуры - -Процедура Проверка_ТелеграмИнформацияБота(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["username"]).Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ТелеграмМассив(Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмУстановкаВебхук(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Webhook was set"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмУдалениеВебхук(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ТелеграмСообщение(Знач Результат, Знач Текст) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["text"]).Равно(Текст); - -КонецПроцедуры - -Процедура Проверка_ТелеграмКартинка(Знач Результат, Знач Текст) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["photo"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмВидео(Знач Результат, Знач Текст) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["video"]["mime_type"]).Равно("video/mp4"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмАудио(Знач Результат, Знач Текст) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["audio"]["mime_type"]).Равно("audio/mpeg"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмДокумент(Знач Результат, Знач Текст) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["document"]).ИмеетТип("Соответствие").Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ТелеграмГифка(Знач Результат, Знач Текст) - - Result = "result"; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["caption"]).Равно(Текст); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["document"]).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["animation"]["mime_type"]).Равно("video/mp4"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмМедиагруппа(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмМестоположение(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["location"]).ИмеетТип("Соответствие").Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ТелеграмКонтакт(Знач Результат, Знач Имя) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]["first_name"]).Равно(Имя); - -КонецПроцедуры - -Процедура Проверка_ТелеграмОпрос(Знач Результат, Знач Вопрос) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]["question"]).Равно(Вопрос); - -КонецПроцедуры - -Процедура Проверка_ТелеграмПереслать(Знач Результат, Знач IDСообщения) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["forward_origin"]["message_id"]).Равно(Число(IDСообщения)); - -КонецПроцедуры - -Процедура Проверка_ТелеграмБан(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Bad Request: can't remove chat owner"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмПриглашение(Знач Результат, Знач Заголовок, Знач UnixИстечение) - - Result = "result"; - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["member_limit"]).Равно(200); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["name"]).Равно(Заголовок); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["expire_date"]).Равно(Число(UnixИстечение)); - -КонецПроцедуры - -Процедура Проверка_ТелеграмЧисло(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Число"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмСозданиеТемы(Знач Результат, Знач Имя, Иконка) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["name"]).Равно(Имя); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["icon_custom_emoji_id"]).Равно(Иконка); - -КонецПроцедуры - -Процедура Проверка_ВКПост(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["post_id"]).ИмеетТип("Число").Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ВКИстина(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Равно(1); - -КонецПроцедуры - -Процедура Проверка_ВКАльбом(Знач Результат, Знач Описание) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["description"]).Равно(Описание); - -КонецПроцедуры - -Процедура Проверка_ВККартинкаАльбома(Знач Результат, Знач ОписаниеКартинки, Знач ИДАльбома) - - Response = "response"; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["text"]).Равно(ОписаниеКартинки); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["album_id"]).Равно(ИДАльбома); - -КонецПроцедуры - -Процедура Проверка_ВКИстория(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["count"]).ИмеетТип("Число").Равно(1); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["items"]).ИмеетТип("Массив").Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ВКОбсуждение(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ГКОбъект(Знач Результат, Знач Наименование, Знач Описание) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["summary"]).Равно(Наименование); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип("Строка").Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ТвиттерТекст(Знач Результат, Знач Текст) - - ТекстОтвета = Результат["data"]["text"]; - ТекстОтвета = Лев(ТекстОтвета, СтрДлина(Текст)); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ТекстОтвета).Равно(Текст); - -КонецПроцедуры - -Процедура Проверка_ВайберОк(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Равно("ok"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status"]).Равно(0); - -КонецПроцедуры - -Процедура Проверка_НоушнОбъект(Знач Результат, Знач Вид = "page") - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["object"]).Равно(Вид); - -КонецПроцедуры - -Процедура Проверка_СлакОк(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - -КонецПроцедуры - -Процедура Проверка_ДропБоксФайл(Знач Результат, Знач Путь) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path_display"]).Равно(Путь); - -КонецПроцедуры - -Процедура Проверка_ДропБоксМетаданные(Знач Результат, Знач Путь) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["metadata"]["path_display"]).Равно(Путь); - -КонецПроцедуры - -Процедура Проверка_ДропБоксМассив(Знач Результат, Знач Количество = Неопределено) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"]).ИмеетТип("Массив"); - - Если Не Количество = Неопределено Тогда - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"].Количество()).Равно(Количество); - КонецЕсли; - -КонецПроцедуры - -Процедура Проверка_ДропБоксРабота(Знач Результат) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["async_job_id"]).Заполнено(); -КонецПроцедуры - -Процедура Проверка_ДропБоксСтатус(Знач Результат) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[".tag"]).Равно("complete"); -КонецПроцедуры - -Процедура Проверка_ДропБоксТеги(Знач Результат, Знач Количество) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"]).ИмеетТип("Массив"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"].Количество()).Равно(Количество); - -КонецПроцедуры - -Процедура Проверка_ДропбоксАккаунт(Знач Результат) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["account_id"]).Заполнено(); -КонецПроцедуры - -Процедура Проверка_ДропбоксПространство(Знач Результат) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["used"]).Заполнено(); -КонецПроцедуры - -Процедура Проверка_ДропбоксУчастник(Знач Результат, Знач Почта, Знач ТолькоПросмотр) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["result"][".tag"]).Равно("success"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["member"]["email"]).Равно(Почта); - OPI_ПолучениеДанныхТестов.ОжидаетЧто( - Результат[0]["result"]["success"][".tag"]).Равно(?(ТолькоПросмотр, "viewer", "editor")); -КонецПроцедуры - -Процедура Проверка_ДропбоксПубличнаяПапка(Знач Результат) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["shared_folder_id"]).Заполнено(); -КонецПроцедуры - -#КонецОбласти - -#Область АтомарныеТесты - -#Область Telegram - -Процедура Telegram_ПолучитьИнформациюБота(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Результат = OPI_Telegram.ПолучитьИнформациюБота(Токен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюБота", "Telegram"); - - Проверка_ТелеграмИнформацияБота(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ПолучитьОбновления(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Результат = OPI_Telegram.ПолучитьОбновления(Токен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбновления", "Telegram"); - - Проверка_ТелеграмМассив(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_УстановитьWebhook(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - URL = ПараметрыФункции["Telegram_URL"]; - - Результат = OPI_Telegram.УстановитьWebhook(Токен, URL); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьWebhook", "Telegram"); - - Проверка_ТелеграмУстановкаВебхук(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_УдалитьWebhook(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Результат = OPI_Telegram.УдалитьWebhook(Токен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьWebhook", "Telegram"); - - Проверка_ТелеграмУдалениеВебхук(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьТекстовоеСообщение(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Текст = ПараметрыФункции["String"]; - - Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение", "Telegram"); - - Проверка_ТелеграмСообщение(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDКанала, Текст); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (канал)"); - - Проверка_ТелеграмСообщение(Результат, Текст); - - IDСообщения = OPI_Инструменты.ЧислоВСтроку(Результат["result"]["message_id"]); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_ChannelMessageID", IDСообщения); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьКартинку(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Текст = ПараметрыФункции["String"]; - Картинка = ПараметрыФункции["Picture"]; - - КартинкаПуть = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка, КартинкаПуть); - - КартинкаДД = Новый ДвоичныеДанные(КартинкаПуть); - - Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDЧата, Текст, Картинка); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку", "Telegram"); - - Проверка_ТелеграмКартинка(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаПуть); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (Путь)"); - - Проверка_ТелеграмКартинка(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаДД); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (ДД)"); - - Проверка_ТелеграмКартинка(Результат, Текст); - - УдалитьФайлы(КартинкаПуть); - - IDФайла = Результат["result"]["photo"][0]["file_id"]; - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла); - - ПараметрыФункции.Вставить("Telegram_FileID", IDФайла); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьВидео(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Текст = ПараметрыФункции["String"]; - Видео = ПараметрыФункции["Video"]; - - ВидеоПуть = ПолучитьИмяВременногоФайла("mp4"); - КопироватьФайл(Видео, ВидеоПуть); - - ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть); - - Результат = OPI_Telegram.ОтправитьВидео(Токен, IDЧата, Текст, Видео); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео", "Telegram"); - - Проверка_ТелеграмВидео(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоПуть); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (Путь)"); - - Проверка_ТелеграмВидео(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоДД); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (ДД)"); - - Проверка_ТелеграмВидео(Результат, Текст); - - УдалитьФайлы(ВидеоПуть); - - IDФайла = Результат["result"]["video"]["file_id"]; - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла); - - ПараметрыФункции.Вставить("Telegram_FileID", IDФайла); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьАудио(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Текст = ПараметрыФункции["String"]; - Аудио = ПараметрыФункции["Audio"]; - - АудиоПуть = ПолучитьИмяВременногоФайла("mp3"); - КопироватьФайл(Аудио, АудиоПуть); - - АудиоДД = Новый ДвоичныеДанные(АудиоПуть); - - Результат = OPI_Telegram.ОтправитьАудио(Токен, IDЧата, Текст, Аудио); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио", "Telegram"); - - Проверка_ТелеграмАудио(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоПуть); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (Путь)"); - - Проверка_ТелеграмАудио(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоДД); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (ДД)"); - - Проверка_ТелеграмАудио(Результат, Текст); - - УдалитьФайлы(АудиоПуть); - - IDФайла = Результат["result"]["audio"]["file_id"]; - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла); - - ПараметрыФункции.Вставить("Telegram_FileID", IDФайла); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьДокумент(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Текст = ПараметрыФункции["String"]; - Документ = ПараметрыФункции["Document"]; - - ДокументПуть = ПолучитьИмяВременногоФайла("docx"); - КопироватьФайл(Документ, ДокументПуть); - - ДокументДД = Новый ДвоичныеДанные(ДокументПуть); - - Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDЧата, Текст, Документ); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент", "Telegram"); - - Проверка_ТелеграмДокумент(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументПуть); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (Путь)"); - - Проверка_ТелеграмДокумент(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументДД); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (ДД)"); - - Проверка_ТелеграмДокумент(Результат, Текст); - - УдалитьФайлы(ДокументПуть); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьГифку(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Текст = ПараметрыФункции["String"]; - Гифка = ПараметрыФункции["GIF"]; - - ГифкаПуть = ПолучитьИмяВременногоФайла("gif"); - КопироватьФайл(Гифка, ГифкаПуть); - - ГифкаДД = Новый ДвоичныеДанные(ГифкаПуть); - - Результат = OPI_Telegram.ОтправитьГифку(Токен, IDЧата, Текст, Гифка); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку", "Telegram"); - - Проверка_ТелеграмГифка(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаПуть); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (Путь)"); - - Проверка_ТелеграмГифка(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаДД); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (ДД)"); - - Проверка_ТелеграмГифка(Результат, Текст); - - УдалитьФайлы(ГифкаПуть); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьМеидагруппу(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - Текст = ПараметрыФункции["String"]; - Картинка = ПараметрыФункции["Picture"]; - Видео = ПараметрыФункции["Video"]; - - КартинкаПуть = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка, КартинкаПуть); - - ВидеоПуть = ПолучитьИмяВременногоФайла("mp4"); - КопироватьФайл(Видео, ВидеоПуть); - - ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть); - - Медиагруппа = Новый Соответствие; - Медиагруппа.Вставить(КартинкаПуть, "photo"); - Медиагруппа.Вставить(ВидеоДД , "video"); - - Результат = OPI_Telegram.ОтправитьМедиагруппу(Токен, IDЧата, Текст, Медиагруппа); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМедиагруппу", "Telegram"); - - Проверка_ТелеграмМедиагруппа(Результат); - - УдалитьФайлы(ВидеоПуть); - УдалитьФайлы(КартинкаПуть); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьМестоположение(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Ширина = ПараметрыФункции["Lat"]; - Долгота = ПараметрыФункции["Long"]; - - Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDЧата, Ширина, Долгота); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение", "Telegram"); - - Проверка_ТелеграмМестоположение(Результат); // SKIP - - Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDКанала, Ширина, Долгота); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение (канал)"); - - Проверка_ТелеграмМестоположение(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьКонтакт(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Имя = ПараметрыФункции["Name"]; - Фамилия = ПараметрыФункции["Surname"]; - Телефон = ПараметрыФункции["Phone"]; - - Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDЧата , Имя, Фамилия, Телефон); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт", "Telegram"); - - Проверка_ТелеграмКонтакт(Результат, Имя); // SKIP - OPI_Инструменты.Пауза(20); // SKIP - - Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDКанала, Имя, Фамилия, Телефон); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт (канал)"); - - Проверка_ТелеграмКонтакт(Результат, Имя); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьОпрос(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Вопрос = "Какой ваш любимый цвет?"; - - МассивОтветов = Новый Массив; - МассивОтветов.Добавить("Красный"); - МассивОтветов.Добавить("Желтый"); - МассивОтветов.Добавить("Зеленый"); - МассивОтветов.Добавить("Синий"); - - Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDЧата , Вопрос, МассивОтветов, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос", "Telegram"); - - Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP - - Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, МассивОтветов, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (канал)"); - - Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP - - // END - - СтрочныйМассив = "['Красный', 'Желтый','Зеленый' ,'Синий']"; - - Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, СтрочныйМассив, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (строчный массив)"); - - Проверка_ТелеграмОпрос(Результат, Вопрос); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_СкачатьФайл(ПараметрыФункции) - - IDФайла = ПараметрыФункции["Telegram_FileID"]; - Токен = ПараметрыФункции["Telegram_Token"]; - - Результат = OPI_Telegram.СкачатьФайл(Токен, IDФайла); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Telegram"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные"); - -КонецПроцедуры - -Процедура Telegram_ПереслатьСообщение(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"]; - - Результат = OPI_Telegram.ПереслатьСообщение(Токен, IDСообщения, IDКанала, IDЧата); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереслатьСообщение", "Telegram"); - - Проверка_ТелеграмПереслать(Результат, IDСообщения); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_Бан(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDПользователя = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - - Результат = OPI_Telegram.Бан(Токен, IDКанала, IDПользователя); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Бан", "Telegram"); - - Проверка_ТелеграмБан(Результат); - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_Разбан(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDПользователя = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - - Результат = OPI_Telegram.Разбан(Токен, IDКанала, IDПользователя); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Разбан", "Telegram"); - - Проверка_ТелеграмБан(Результат); - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_СоздатьСсылкуПриглашение(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Сутки = 86400; - ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); - - Заголовок = "Ссылка " + Строка(ТекущаяДата); - Истечение = ТекущаяДата + Сутки; - UnixИстечение = OPI_Инструменты.UNIXTime(Истечение); - - Результат = OPI_Telegram.СоздатьСсылкуПриглашение(Токен, IDКанала, Заголовок, Истечение, 200); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПриглашение", "Telegram"); - - Проверка_ТелеграмПриглашение(Результат, Заголовок, UnixИстечение); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ЗакрепитьСообщение(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"]; - - Результат = OPI_Telegram.ЗакрепитьСообщение(Токен, IDКанала, IDСообщения); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрепитьСообщение", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОткрепитьСообщение(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"]; - - Результат = OPI_Telegram.ОткрепитьСообщение(Токен, IDКанала, IDСообщения); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрепитьСообщение", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ПолучитьЧислоУчастников(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - - Результат = OPI_Telegram.ПолучитьЧислоУчастников(Токен, IDКанала); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЧислоУчастников", "Telegram"); - - Проверка_ТелеграмЧисло(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ПолучитьСписокАватаровФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Результат = OPI_Telegram.ПолучитьСписокИконокАватаров(Токен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокИконокАватаров", "Telegram"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_СоздатьТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - Иконка = "5357419403325481346"; - Имя = "Тестовая тема " + Строка(Новый УникальныйИдентификатор); - - Результат = OPI_Telegram.СоздатьТемуФорума(Токен, Чат, Имя, Иконка); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТемуФорума", "Telegram"); - - Тема = Результат["result"]["message_thread_id"]; - - ПараметрыФункции.Вставить("Telegram_TopicID", Тема); - OPI_Инструменты.ДобавитьПоле("Telegram_TopicID", Тема, "Строка", ПараметрыФункции); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_TopicID", ПараметрыФункции["Telegram_TopicID"]); - - Проверка_ТелеграмСозданиеТемы(Результат, Имя, Иконка); - - ЧатТема = Чат + "*" + Тема; - Текст = ПараметрыФункции["String"]; - Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, ЧатТема, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (форум)"); - - Проверка_ТелеграмСообщение(Результат, Текст); - -КонецПроцедуры - -Процедура Telegram_ИзменитьТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - Тема = ПараметрыФункции["Telegram_TopicID"]; - НовоеИмя = "Новый тестовый заголовок"; - НовяИконка = "5310132165583840589"; - - Результат = OPI_Telegram.ИзменитьТемуФорума(Токен, Чат, Тема, НовоеИмя, НовяИконка); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТемуФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ЗакрытьТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - Тема = ПараметрыФункции["Telegram_TopicID"]; - - OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // SKIP - - Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат); // Закрывает главную тему - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума (главная)"); - - Проверка_ТелеграмИстина(Результат); // SKIP - - Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат, Тема); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(25); - -КонецПроцедуры - -Процедура Telegram_ОткрытьТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - Тема = ПараметрыФункции["Telegram_TopicID"]; - - Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // Открывает главную тему - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума (главная)"); - - Проверка_ТелеграмИстина(Результат); // SKIP - - Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат, Тема); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(25); - -КонецПроцедуры - -Процедура Telegram_УдалитьТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - Тема = ПараметрыФункции["Telegram_TopicID"]; - - Результат = OPI_Telegram.УдалитьТемуФорума(Токен, Чат, Тема); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТемуФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(25); - -КонецПроцедуры - -Процедура Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - Тема = ПараметрыФункции["Telegram_TopicID"]; - - Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы (главная)"); - - Проверка_ТелеграмИстина(Результат); // SKIP - - Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат, Тема); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_СкрытьГлавнуюТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - - Результат = OPI_Telegram.СкрытьГлавнуюТемуФорума(Токен, Чат); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкрытьГлавнуюТемуФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - - Результат = OPI_Telegram.ПоказатьГлавнуюТемуФорума(Токен, Чат); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоказатьГлавнуюТемуФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыФункции) - - Заголовок = "Новое имя главной темы " + Строка(Новый УникальныйИдентификатор); - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - - Результат = OPI_Telegram.ИзменитьИмяГлавнойТемыФорума(Токен, Чат, Заголовок); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьИмяГлавнойТемыФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -#КонецОбласти - -#Область VK - -Процедура VK_СоздатьСсылкуПолученияТокена(ПараметрыФункции) - - Приложение = ПараметрыФункции["VK_AppID"]; - Результат = OPI_VK.СоздатьСсылкуПолученияТокена(Приложение); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПолученияТокена", "VK"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_СоздатьПост(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - Текст = "Пост из автотеста"; - URL = "https://github.com/Bayselonarrend/OpenIntegrations"; - - Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные - Картинка2 = ПараметрыФункции["Picture2"]; // URL, Путь или Двоичные данные - - ИВФ = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка2, ИВФ); - - МассивКартинок = Новый Массив; - МассивКартинок.Добавить(Картинка); - МассивКартинок.Добавить(ИВФ); - - Результат = OPI_VK.СоздатьПост(Текст, МассивКартинок, Истина, URL, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост", "VK"); - - Проверка_ВКПост(Результат); // SKIP - ИДПоста = Результат["response"]["post_id"]; // SKIP - Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); // SKIP - - Результат = OPI_VK.СоздатьПост(Текст, Картинка, Ложь , , Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (одна картинка)"); - - Проверка_ВКПост(Результат); - - ИДПоста = Результат["response"]["post_id"]; - Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); - - OPI_Инструменты.Пауза(5); - - Результат = OPI_VK.СоздатьПост(Текст, ИВФ , Истина, URL, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (один путь)"); - - Проверка_ВКПост(Результат); - - ИДПоста = Результат["response"]["post_id"]; - OPI_Инструменты.ДобавитьПоле("VK_PostID", ИДПоста, "Строка", ПараметрыФункции); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PostID", ПараметрыФункции["VK_PostID"]); - - УдалитьФайлы(ИВФ); - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_УдалитьПост(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ИДПоста = ПараметрыФункции["VK_PostID"]; - - Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПост", "VK"); - - Проверка_ВКИстина(Результат); - -КонецПроцедуры - -Процедура VK_СоздатьСоставнойПост(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - Текст = "Пост из автотеста"; - URL = "https://github.com/Bayselonarrend/OpenIntegrations"; - - Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные - Видео = ПараметрыФункции["Video"]; // URL, Путь или Двоичные данные - - ИВФ = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка, ИВФ); - - ЗагрузкаКартинки = OPI_VK.ЗагрузитьФотоНаСервер(ИВФ, Параметры)["response"][0]; - ЗагрузкаВидео = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, "Новое видео", , , Параметры); - - ВладелецКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["owner_id"]); - ВладелецВидео = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["owner_id"]); - - IDКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["id"]); - IDВидео = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["video_id"]); - - МассивВложений = Новый Массив; - МассивВложений.Добавить("photo" + ВладелецКартинки + "_" + IDКартинки); - МассивВложений.Добавить("video" + ВладелецВидео + "_" + IDВидео); - - Результат = OPI_VK.СоздатьСоставнойПост(Текст, МассивВложений, Ложь, URL, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСоставнойПост", "VK"); - - Проверка_ВКПост(Результат); - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_СоздатьОпрос() - - Параметры = ПолучитьПараметрыВК(); - Вопрос = "Какой ваш любимый цвет?"; - - МассивВариантов = Новый Массив; - МассивВариантов.Добавить("Красный"); - МассивВариантов.Добавить("Желтый"); - МассивВариантов.Добавить("Зеленый"); - - Результат = OPI_VK.СоздатьОпрос(Вопрос, МассивВариантов, , Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОпрос", "VK"); - - Проверка_ВКПост(Результат); - - ИДПоста = Результат["response"]["post_id"]; - OPI_VK.УдалитьПост(ИДПоста, Параметры); - - OPI_Инструменты.Пауза(10); - -КонецПроцедуры - -Процедура VK_СоздатьАльбом(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - Имя = "Альбом из автотеста"; - Описание = "Новый альбом из автотеста"; - - Результат = OPI_VK.СоздатьАльбом(Имя, Описание, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьАльбом", "VK"); - - Проверка_ВКАльбом(Результат, Описание); - - ИДАльбома = Результат["response"]["id"]; - ПараметрыФункции.Вставить("VK_AlbumID", ИДАльбома); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_AlbumID", ИДАльбома); - -КонецПроцедуры - -Процедура VK_СохранитьКартинкуВАльбом(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ОписаниеКартинки = "Картинка автотест"; - ИДАльбома = ПараметрыФункции["VK_AlbumID"]; - - Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные - ИВФ = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка, ИВФ); - - Картинка = Новый ДвоичныеДанные(ИВФ); - - Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, Картинка, ОписаниеКартинки, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом", "VK"); - - Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP - - ИДКартинки = Результат["response"][0]["id"]; // SKIP - Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры); // SKIP - - Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, ИВФ, ОписаниеКартинки, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом (путь)"); - - Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP - - ИДКартинки = Результат["response"][0]["id"]; - ПараметрыФункции.Вставить("VK_PictureID", ИДКартинки); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PictureID", ИДКартинки); - - УдалитьФайлы(ИВФ); - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_УдалитьКартинку(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ИДКартинки = ПараметрыФункции["VK_PictureID"]; - - Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКартинку", "VK"); - - Проверка_ВКИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_УдалитьАльбом(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ИДАльбома = ПараметрыФункции["VK_AlbumID"]; - - Результат = OPI_VK.УдалитьАльбом(ИДАльбома, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьАльбом", "VK"); - - Проверка_ВКИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_СоздатьИсторию(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - URL = "https://github.com/Bayselonarrend/OpenIntegrations"; - - Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные - ИВФ = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка, ИВФ); - Картинка = Новый ДвоичныеДанные(ИВФ); - - Результат = OPI_VK.СоздатьИсторию(Картинка , URL, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию", "VK"); - - Проверка_ВКИстория(Результат); // SKIP - - Результат = OPI_VK.СоздатьИсторию(ИВФ, , Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию (путь)"); - - Проверка_ВКИстория(Результат); - - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_СоздатьОбсуждение(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - Название = "Обсуждаем: какой цвет лучше?"; - Сообщение = "Красный, желтый, синий или какой-то другой?"; - - Результат = OPI_VK.СоздатьОбсуждение(Название, Сообщение, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОбсуждение", "VK"); - - Проверка_ВКОбсуждение(Результат); - - ИДОбсуждения = Результат["response"]; - ПараметрыФункции.Вставить("VK_ConvID", ИДОбсуждения); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_ConvID", ИДОбсуждения); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_ЗакрытьОбсуждение(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ИДОбсуждения = ПараметрыФункции["VK_ConvID"]; - Результат = OPI_VK.ЗакрытьОбсуждение(ИДОбсуждения, Ложь, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьОбсуждение", "VK"); - - Проверка_ВКИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_ОткрытьОбсуждение(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ИДОбсуждения = ПараметрыФункции["VK_ConvID"]; - Результат = OPI_VK.ОткрытьОбсуждение(ИДОбсуждения, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьОбсуждение", "VK"); - - Проверка_ВКИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_НаписатьВОбсуждение(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ИДОбсуждения = ПараметрыФункции["VK_ConvID"]; - Сообщение = "Мне больше нравится желтый"; - - Результат = OPI_VK.НаписатьВОбсуждение(ИДОбсуждения, Сообщение, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьВОбсуждение", "VK"); - - Проверка_ВКОбсуждение(Результат); - -КонецПроцедуры - -#КонецОбласти - -#Область Dropbox - -Процедура Dropbox_ПолучитьСсылкуАвторизации(ПараметрыФункции) - - КлючПриложения = ПараметрыФункции["Dropbox_Appkey"]; - Результат = OPI_Dropbox.ПолучитьСсылкуАвторизации(КлючПриложения); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуАвторизации", "Dropbox"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка"); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьТокен(ПараметрыФункции) - - КлючПриложения = ПараметрыФункции["Dropbox_Appkey"]; - СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"]; - Код = ПараметрыФункции["Dropbox_Code"]; - - Результат = OPI_Dropbox.ПолучитьТокен(КлючПриложения, СекретПриложения, Код); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТокен"); - - Токен = Результат["access_token"]; - Рефреш = Результат["refresh_token"]; - - Если ЗначениеЗаполнено(Токен) Тогда - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен); - КонецЕсли; - - Если ЗначениеЗаполнено(Рефреш) Тогда - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Refresh", Рефреш); - КонецЕсли; - -КонецПроцедуры - -Процедура Dropbox_ОбновитьТокен(ПараметрыФункции) - - КлючПриложения = ПараметрыФункции["Dropbox_Appkey"]; - СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"]; - РефрешТокен = ПараметрыФункции["Dropbox_Refresh"]; - - Результат = OPI_Dropbox.ОбновитьТокен(КлючПриложения, СекретПриложения, РефрешТокен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьТокен"); - - Токен = Результат["access_token"]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Токен).Заполнено(); - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыФункции) - - Путь = "/New/pic.png"; - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.ПолучитьИнформациюОбОбъекте(Токен, Путь, Истина); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте", "Dropbox"); - - Проверка_ДропБоксФайл(Результат, Путь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьПревью(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New/mydoc.docx"; - - Результат = OPI_Dropbox.ПолучитьПревью(Токен, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПревью", "Dropbox"); - - Проверка_ДвоичныеДанные(Результат, 190834); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ЗагрузитьФайл(ПараметрыФункции) - - Путь = "/New/pic.png"; - Токен = ПараметрыФункции["Dropbox_Token"]; - Картинка = ПараметрыФункции["Picture"]; - - КартинкаПуть = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка, КартинкаПуть); - - Результат = OPI_Dropbox.ЗагрузитьФайл(Токен, КартинкаПуть, Путь, Истина); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл", "Dropbox"); - - Проверка_ДропБоксФайл(Результат, Путь); - УдалитьФайлы(КартинкаПуть); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ЗагрузитьФайлПоURL(ПараметрыФункции) - - Путь = "/New/url_doc.docx"; - Токен = ПараметрыФункции["Dropbox_Token"]; - URL = ПараметрыФункции["Document"]; - - Результат = OPI_Dropbox.ЗагрузитьФайлПоURL(Токен, URL, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайлПоURL", "Dropbox"); - - Проверка_ДропБоксРабота(Результат); - - Работа = Результат["async_job_id"]; - - ПараметрыФункции.Вставить("Dropbox_Job", Работа); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Job", Работа); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - ИДРаботы = ПараметрыФункции["Dropbox_Job"]; - Статус = "in_progress"; - - Пока Статус = "in_progress" Цикл - - Результат = OPI_Dropbox.ПолучитьСтатусЗагрузкиПоURL(Токен, ИДРаботы); - Статус = Результат[".tag"]; - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатусЗагрузкиПоURL", "Dropbox"); - - КонецЦикла; - - // END - - Проверка_ДропБоксСтатус(Результат); - - Путь = "/New/url_doc.docx"; - Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь); - - Проверка_ДропБоксМетаданные(Результат, Путь); - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_УдалитьОбъект(ПараметрыФункции) - - Путь = "/New/pic.png"; - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект", "Dropbox"); - - Проверка_ДропБоксМетаданные(Результат, Путь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_КопироватьОбъект(ПараметрыФункции) - - Оригинал = "/New/pic.png"; - Копия = "/New/pic_copy.png"; - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.КопироватьОбъект(Токен, Оригинал, Копия); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьОбъект", "Dropbox"); - - Проверка_ДропБоксМетаданные(Результат, Копия); - - Результат = OPI_Dropbox.УдалитьОбъект(Токен, Копия); - Проверка_ДропБоксМетаданные(Результат, Копия); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПереместитьОбъект(ПараметрыФункции) - - ОригиналныйПуть = "/New/pic.png"; - ЦелевойПуть = "/pic.png"; - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ОригиналныйПуть, ЦелевойПуть); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Dropbox_ПереместитьОбъект", "Dropbox"); - - Проверка_ДропБоксМетаданные(Результат, ЦелевойПуть); - - Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ЦелевойПуть, ОригиналныйПуть); - Проверка_ДропБоксМетаданные(Результат, ОригиналныйПуть); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_СоздатьПапку(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/Новый каталог"; - - Результат = OPI_Dropbox.СоздатьПапку(Токен, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку", "Dropbox"); - - Проверка_ДропБоксМетаданные(Результат, Путь); - - Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь); - Проверка_ДропБоксМетаданные(Результат, Путь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_СкачатьФайл(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New/pic.png"; - - Результат = OPI_Dropbox.СкачатьФайл(Токен, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Dropbox"); - - Проверка_ДвоичныеДанные(Результат, 2114023); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_СкачатьПапку(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New"; - - Результат = OPI_Dropbox.СкачатьПапку(Токен, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьПапку", "Dropbox"); - - Проверка_ДвоичныеДанные(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьСписокФайловПапки(ПараметрыФункции) - - Путь = "/New"; - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.ПолучитьСписокФайловПапки(Токен, Путь, Истина); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайловПапки", "Dropbox"); - - Проверка_ДропБоксМассив(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New/pic.png"; - - Результат = OPI_Dropbox.ПолучитьСписокВерсийОбъекта(Токен, Путь, 1); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВерсийОбъекта", "Dropbox"); - - Проверка_ДропБоксМассив(Результат, 1); - - Ревизия = Результат["entries"][0]["rev"]; - - ПараметрыФункции.Вставить("Dropbox_FileRevision", Ревизия); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_FileRevision", Ревизия); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ВосстановитьОбъектКВерсии(ПараметрыФункции) - - Версия = ПараметрыФункции["Dropbox_FileRevision"]; - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New/pic.png"; - - Результат = OPI_Dropbox.ВосстановитьОбъектКВерсии(Токен, Путь, Версия); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВосстановитьОбъектКВерсии", "Dropbox"); - - Проверка_ДропБоксФайл(Результат, Путь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолчитьСписокТегов(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - - МассивПутей = Новый Массив; - МассивПутей.Добавить("/New/Dogs.mp3"); - МассивПутей.Добавить("/New/mydoc.docx"); - - Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, МассивПутей); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов", "Dropbox"); - - Проверка_ДропБоксТеги(Результат, МассивПутей.Количество()); - - Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, "/New/mydoc.docx"); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов (одиночный)"); - - Проверка_ДропБоксТеги(Результат, 1); - - ЕстьТег = Ложь; - - Для Каждого Тег Из Результат["paths_to_tags"][0]["tags"] Цикл - Если Тег["tag_text"] = "важное" Тогда - ЕстьТег = Истина; - КонецЕсли; - КонецЦикла; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЕстьТег).Равно(Истина); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ДобавитьТег(ПараметрыФункции) - - Тег = "Важное"; - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New/mydoc.docx"; - - Результат = OPI_Dropbox.ДобавитьТег(Токен, Путь, Тег); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТег", "Dropbox"); - - Проверка_Пусто(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_УдалитьТег(ПараметрыФункции) - - Тег = "Важное"; - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New/mydoc.docx"; - - Результат = OPI_Dropbox.УдалитьТег(Токен, Путь, Тег); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТег", "Dropbox"); - - Проверка_Пусто(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте", "Dropbox"); - - Проверка_ДропбоксАккаунт(Результат); - - Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен, Результат["account_id"]); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте (сторонний)"); - - Проверка_ДропбоксАккаунт(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.ПолучитьДанныеИспользованияПространства(Токен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеИспользованияПространства", "Dropbox"); - - Проверка_ДропбоксПространство(Результат); - -КонецПроцедуры - -Процедура Dropbox_ДобавитьПользователейКФайлу(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Почта = ПараметрыФункции["Dropbox_OtherUser"]; - Файл = ПараметрыФункции["Dropbox_FileID"]; - - Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почта, Ложь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox"); - - Проверка_ДропбоксУчастник(Результат, Почта, Ложь); - - Почты = Новый Массив; - Почты.Добавить(Почта); - - Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почты, Истина); - - Проверка_ДропбоксУчастник(Результат, Почта, Истина); - -КонецПроцедуры - -Процедура Dropbox_ОпубликоватьПапку(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New"; - - Результат = OPI_Dropbox.ОпубликоватьПапку(Токен, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОпубликоватьПапку", "Dropbox"); - - Проверка_ДропБоксПубличнаяПапка(Результат); - - IDПапки = Результат["shared_folder_id"]; - - ПараметрыФункции.Вставить("Dropbox_SharedFolder", IDПапки); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_SharedFolder", IDПапки); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ОтменитьПубликациюПапки(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Папка = ПараметрыФункции["Dropbox_SharedFolder"]; - - Результат = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка); - ТекущийСтатус = "in_progress"; - IDРаботы = Результат["async_job_id"]; - - Пока ТекущийСтатус = "in_progress" Цикл - Результат = OPI_Dropbox.ПолучитьСтатусАсинхронногоИзменения(Токен, IDРаботы); - ТекущийСтатус = Результат[".tag"]; - OPI_Инструменты.Пауза(3); - КонецЦикла; - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюПапки", "Dropbox"); - - Проверка_ДропБоксСтатус(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ДобавитьПользователейКПапке(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Почта = ПараметрыФункции["Dropbox_OtherUser"]; - Папка = ПараметрыФункции["Dropbox_SharedFolder"]; // shared_folder_id - - Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почта, Ложь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox"); - - Проверка_Пусто(Результат); - - Почты = Новый Массив; - Почты.Добавить(Почта); - - Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почты, Истина); - - Проверка_Пусто(Результат); - -КонецПроцедуры - -Процедура Dropbox_ОтменитьПубликациюФайла(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Файл = ПараметрыФункции["Dropbox_FileID"]; - - Результат = OPI_Dropbox.ОтменитьПубликациюФайла(Токен, Файл); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюФайла", "Dropbox"); - - Проверка_Пусто(Результат); - -КонецПроцедуры - -#КонецОбласти - -#КонецОбласти - -#КонецОбласти +// Расположение OS: ./OInt/tests/Modules/internal/OPI_Тесты.os + +// 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 + +// Набор тестов для YAxUnit + +// BSLLS:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UsingServiceTag-off +// BSLLS:UnusedParameters-off +// BSLLS:DuplicateStringLiteral-off + +// @skip-check undefined-variable +// @skip-check wrong-string-literal-content + +// Раскомментировать, если выполняется OneScript +#Использовать oint +#Использовать asserts + +#Область СлужебныйПрограммныйИнтерфейс + +// Для YaxUnit + +Процедура ИсполняемыеСценарии() Экспорт + + OPI_ПолучениеДанныхТестов.СформироватьТестыЯкс(); + +КонецПроцедуры + +// Для Asserts + +Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт + + Возврат OPI_ПолучениеДанныхТестов.СформироватьТестыАссертс(); + +КонецФункции + +#Область ЗапускаемыеТесты + +#Область Telegram + +Процедура Телеграм_ПолучитьИнформациюБота() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); + + Telegram_ПолучитьИнформациюБота(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ПолучитьОбновления() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); + + Telegram_УдалитьWebhook(ПараметрыТеста); + Telegram_ПолучитьОбновления(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_УстановитьWebhook() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_URL" , ПараметрыТеста); + + Telegram_УстановитьWebhook(ПараметрыТеста); + Telegram_УдалитьWebhook(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьТекстовоеСообщение() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + + Telegram_ОтправитьТекстовоеСообщение(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьКартинку() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + + Telegram_ОтправитьКартинку(ПараметрыТеста); + Telegram_СкачатьФайл(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьВидео() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста); + + Telegram_ОтправитьВидео(ПараметрыТеста); + Telegram_СкачатьФайл(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьАудио() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Audio" , ПараметрыТеста); + + Telegram_ОтправитьАудио(ПараметрыТеста); + Telegram_СкачатьФайл(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьДокумент() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document" , ПараметрыТеста); + + Telegram_ОтправитьДокумент(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьГифку() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GIF" , ПараметрыТеста); + + Telegram_ОтправитьГифку(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьМедиагруппу() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста); + + Telegram_ОтправитьМеидагруппу(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьМестоположение() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Long" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Lat" , ПараметрыТеста); + + Telegram_ОтправитьМестоположение(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьКонтакт() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Name" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Surname" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Phone" , ПараметрыТеста); + + Telegram_ОтправитьКонтакт(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьОпрос() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + + Telegram_ОтправитьОпрос(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ПереслатьСообщение() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста); + + Telegram_ПереслатьСообщение(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_БанРазбан() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста); + + Telegram_Бан(ПараметрыТеста); + Telegram_Разбан(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_СоздатьСсылкуПриглашение() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + + Telegram_СоздатьСсылкуПриглашение(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ЗакрепитьОткрепитьСообщение() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста); + + Telegram_ЗакрепитьСообщение(ПараметрыТеста); + Telegram_ОткрепитьСообщение(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ПолучитьЧислоУчастников() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + + Telegram_ПолучитьЧислоУчастников(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ПолучитьСписокАватаровФорума() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); + + Telegram_ПолучитьСписокАватаровФорума(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_СоздатьУдалитьТемуФорума() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + + Telegram_СоздатьТемуФорума(ПараметрыТеста); + Telegram_ИзменитьТемуФорума(ПараметрыТеста); + Telegram_ЗакрытьТемуФорума(ПараметрыТеста); + Telegram_ОткрытьТемуФорума(ПараметрыТеста); + Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыТеста); + Telegram_УдалитьТемуФорума(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_СкрытьПоказатьГлавнуюТему() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста); + + Telegram_СкрытьГлавнуюТемуФорума(ПараметрыТеста); + Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ИзменитьИмяГлавнойТемы() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста); + + Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыТеста); + +КонецПроцедуры + +#КонецОбласти + +#Область VK + +Процедура ВК_СоздатьСсылкуТокена() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("VK_AppID", ПараметрыТеста); + + VK_СоздатьСсылкуПолученияТокена(ПараметрыТеста); + +КонецПроцедуры + +Процедура ВК_СоздатьУдалитьПост() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture2", ПараметрыТеста); + + VK_СоздатьПост(ПараметрыТеста); + VK_УдалитьПост(ПараметрыТеста); + +КонецПроцедуры + +Процедура ВК_СоздатьСоставнойПост() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста); + + VK_СоздатьСоставнойПост(ПараметрыТеста); + +КонецПроцедуры + +Процедура ВК_СоздатьОпрос() Экспорт + + VK_СоздатьОпрос(); + +КонецПроцедуры + +Процедура ВК_СохранитьУдалитьКартинку() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + + VK_СоздатьАльбом(ПараметрыТеста); + VK_СохранитьКартинкуВАльбом(ПараметрыТеста); + VK_УдалитьКартинку(ПараметрыТеста); + VK_УдалитьАльбом(ПараметрыТеста); + +КонецПроцедуры + +Процедура ВК_СоздатьИсторию() Экспорт + + ПараметрыТеста = Новый Соответствие; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + + VK_СоздатьИсторию(ПараметрыТеста); + +КонецПроцедуры + +Процедура ВК_МетодыОбсуждений() Экспорт + + ПараметрыТеста = Новый Структура; + Параметры = ПолучитьПараметрыВК(); + + VK_СоздатьОбсуждение(ПараметрыТеста); + VK_ЗакрытьОбсуждение(ПараметрыТеста); + VK_ОткрытьОбсуждение(ПараметрыТеста); + VK_НаписатьВОбсуждение(ПараметрыТеста); + + OPI_VK.ЗакрытьОбсуждение(ПараметрыТеста["VK_ConvID"], Истина, Параметры); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ЛайкРепостКоммент() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Текст = "Пост из автотеста"; + Сообщение = "Сообщение из автотеста"; + ТипСоответствие = Тип("Соответствие"); + ТипЧисло = Тип("Число"); + Response = "response"; + + Результат = OPI_VK.СоздатьПост(Текст, Новый Массив, , , Параметры); + + ИДПоста = Результат[Response]["post_id"]; + Результат = OPI_VK.ПоставитьЛайк(ИДПоста, , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоставитьЛайк"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["likes"]).ИмеетТип(ТипЧисло).Заполнено(); + + ВнешнийПост = 2571; + ВнешняяСтена = -218704372; + + Результат = OPI_VK.СделатьРепост(ВнешнийПост, ВнешняяСтена, , , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СделатьРепост"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["success"]).ИмеетТип(ТипЧисло).Равно(1); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["wall_repost_count"]).ИмеетТип(ТипЧисло).Равно(1); + + Результат = OPI_VK.НаписатьКомментарий(ИДПоста, Параметры["owner_id"], Сообщение, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьКомментарий"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["comment_id"]).ИмеетТип(ТипЧисло).Заполнено(); + + OPI_VK.УдалитьПост(ИДПоста, Параметры); + OPI_VK.УдалитьПост(Результат[Response]["post_id"], Параметры); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ПолучитьСтатистику() Экспорт + + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + Параметры = ПолучитьПараметрыВК(); + Дата0 = НачалоДня(ТекущаяДата); + Дата1 = КонецДня(Дата0); + ТипСоответствие = Тип("Соответствие"); + + Результат = OPI_VK.ПолучитьСтатистику(Дата0, Дата1, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистику"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["visitors"]).ИмеетТип(ТипСоответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["reach"]).ИмеетТип(ТипСоответствие).Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ПолучитьСтатистикуПостов() Экспорт + + Параметры = ПолучитьПараметрыВК(); + + МассивПостов = Новый Массив; + МассивПостов.Добавить(214); + МассивПостов.Добавить(215); + + Результат = OPI_VK.ПолучитьСтатистикуПостов(МассивПостов, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистикуПостов"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив").ИмеетДлину(2); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_СоздатьРекламнуюКампанию() Экспорт + + Параметры = ПолучитьПараметрыВК(); + ИДКабинета = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AdsCabinetID"); + Наименование = "Тестовая кампания"; + ТипСоответствие = Тип("Соответствие"); + ТипЧисло = Тип("Число"); + Response = "response"; + UID = "id"; + + Результат = OPI_VK.СоздатьРекламнуюКампанию(ИДКабинета, Наименование, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламнуюКампанию"); + + Результат = Результат[Response][0]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено(); + + ИДКампании = Результат[UID]; + ИДКатегории = 126; + Лимит = 150; + + Результат = OPI_VK.СоздатьПост(Наименование, Новый Массив, , , Параметры); + ИДПоста = Результат[Response]["post_id"]; + + Результат = OPI_VK.СоздатьРекламноеОбъявление(ИДКампании + , Лимит + , ИДКатегории + , ИДПоста + , ИДКабинета + , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламноеОбъявление"); + + Результат = Результат[Response][0]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено(); + + ИДОбъявления = Результат[UID]; + Результат = OPI_VK.ПриостановитьРекламноеОбъявление(ИДКабинета, ИДОбъявления, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПриостановитьРекламноеОбъявление"); + + Результат = Результат[Response][0]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено(); + + OPI_VK.УдалитьПост(ИДПоста, Параметры); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ОтправитьСообщение() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_UserID"); + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_CommunityToken"); + Текст = "Сообщение из автотеста"; + + МассивКнопок = Новый Массив; + МассивКнопок.Добавить("Кнопка 1"); + МассивКнопок.Добавить("Кнопка 2"); + + Клавиатура = OPI_VK.СформироватьКлавиатуру(МассивКнопок); + Результат = OPI_VK.НаписатьСообщение(Текст, Пользователь, Токен, Клавиатура, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьСообщение"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ПолучитьКатегорииТоваров() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Результат = OPI_VK.ПолучитьСписокКатегорийТоваров(Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКатегорийТоваров"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Соответствие") + .Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_СоздатьТоварПодборку() Экспорт + + Параметры = ПолучитьПараметрыВК(); + ТипСоответствие = Тип("Соответствие"); + ТипЧисло = Тип("Число"); + Response = "response"; + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + ИВФ = ПолучитьИмяВременногоФайла("png"); + Картинка.Записать(ИВФ); + + Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка" + , Картинка + , Истина + , Ложь + , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["albums_count"]).ИмеетТип(ТипЧисло).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_album_id"]).ИмеетТип(ТипЧисло).Заполнено(); + + ИДПодборки = Результат[Response]["market_album_id"]; + + Результат = OPI_VK.ИзменитьПодборкуТоваров("Измененная подборка", ИДПодборки, , , , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПодборкуТоваров"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Равно(1); + + МассивКартинок = Новый Массив; + МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture")); + МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2")); + + Товар = Новый Соответствие(); + Товар.Вставить("Имя" , "Тестовый товар"); + Товар.Вставить("Описание" , "Описание товара"); + Товар.Вставить("Категория" , "20173"); + Товар.Вставить("Цена" , 1); + Товар.Вставить("СтараяЦена" , 15); + Товар.Вставить("ОсновноеФото" , Картинка); + Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); + Товар.Вставить("ДополнительныеФото" , МассивКартинок); + Товар.Вставить("ГлавныйВГруппе" , Истина); + Товар.Вставить("Ширина" , 20); + Товар.Вставить("Высота" , 30); + Товар.Вставить("Глубина" , 40); + Товар.Вставить("Вес" , 100); + Товар.Вставить("SKU" , "12345"); + Товар.Вставить("ДоступныйОстаток" , "10"); + + Результат = OPI_VK.ДобавитьТовар(Товар, ИДПодборки, Параметры); // Добавление товара + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_item_id"]).ИмеетТип(ТипЧисло).Заполнено(); + + ИДТовара = Результат[Response]["market_item_id"]; + + Товар = Новый Соответствие; + Товар.Вставить("Имя", "Тестовый товар измененный"); + + Результат = OPI_VK.ИзменитьТовар(ИДТовара, Товар, , Параметры); // Изменение товара + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТовар"); + + Проверка_ВКИстина(Результат); + + Результат = OPI_VK.ДобавитьТоварВПодборку(ИДТовара, ИДПодборки, Параметры); // Добавление в подборку + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТоварВПодборку"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Заполнено(); + + Результат = OPI_VK.УдалитьТоварИзПодборки(ИДТовара, ИДПодборки, Параметры); // Удаляет из подборки + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТоварИзПодборки"); + + OPI_Инструменты.Пауза(5); + Проверка_ВКИстина(Результат); + + Результат = OPI_VK.УдалитьТовар(ИДТовара, Параметры); // Удаление товара + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТовар"); + + OPI_Инструменты.Пауза(5); + Проверка_ВКИстина(Результат); + + Результат = OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); // Уадление подборки + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПодборку"); + + OPI_Инструменты.Пауза(5); + Проверка_ВКИстина(Результат); + + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_СоздатьТоварСоСвойствами() Экспорт + + Параметры = ПолучитьПараметрыВК(); + ТипСоответствие = Тип("Соответствие"); + ТипЧисло = Тип("Число"); + MII = "market_item_id"; + Response = "response"; + Желтый = "Желтый"; + Красный = "Красный"; + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + ИВФ = ПолучитьИмяВременногоФайла("png"); + Картинка.Записать(ИВФ); + + МассивВариантов = Новый Массив; + МассивВариантов.Добавить(Желтый); + МассивВариантов.Добавить("Синий"); + МассивВариантов.Добавить(Красный); + + Результат = OPI_VK.СоздатьСвойствоТовара("Цвет", Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСвойствоТовара"); + + OPI_Инструменты.Пауза(5); + + Свойство = Результат[Response]["property_id"]; + Свойство = OPI_Инструменты.ЧислоВСтроку(Свойство); + + СоответствиеСвойств = Новый Соответствие; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["property_id"]).ИмеетТип(ТипЧисло).Заполнено(); + + Результат = OPI_VK.ИзменитьСвойствоТовара("Цвет (изм.)", Свойство, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойствоТовара"); + + OPI_Инструменты.Пауза(5); + + Проверка_ВКИстина(Результат); + + Для Каждого Вариант Из МассивВариантов Цикл + + Результат = OPI_VK.ДобавитьВариантСвойстваТовара(Вариант, Свойство, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВариантСвойстваТовара"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["variant_id"]).ИмеетТип(ТипЧисло).Заполнено(); + + ИДВарианта = Результат[Response]["variant_id"]; + СоответствиеСвойств.Вставить(Вариант, ИДВарианта); + + Результат = OPI_VK.ИзменитьВариантСвойстваТовара(Вариант + Строка(Новый УникальныйИдентификатор()) + , Свойство + , ИДВарианта + , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьВариантСвойстваТовара"); + + Проверка_ВКИстина(Результат); + + КонецЦикла; + + МассивКартинок = Новый Массив; + МассивКартинок.Добавить(ИВФ); + МассивКартинок.Добавить(Картинка); + + Товар = Новый Соответствие(); + Товар.Вставить("Имя" , "Тестовый товар (" + Желтый + ")"); + Товар.Вставить("Описание" , "Описание товара"); + Товар.Вставить("Категория" , "20173"); + Товар.Вставить("Цена" , 1); + Товар.Вставить("СтараяЦена" , 15); + Товар.Вставить("ОсновноеФото" , Картинка); + Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); + Товар.Вставить("ДополнительныеФото" , МассивКартинок); + Товар.Вставить("ГлавныйВГруппе" , Истина); + Товар.Вставить("НомерГруппы" , Неопределено); + Товар.Вставить("Ширина" , 20); + Товар.Вставить("Высота" , 30); + Товар.Вставить("Глубина" , 40); + Товар.Вставить("Вес" , 100); + Товар.Вставить("SKU" , 12345); + Товар.Вставить("ДоступныйОстаток" , "10"); + Товар.Вставить("ЗначенияСвойств" , СоответствиеСвойств[Желтый]); + + Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар"); + + OPI_Инструменты.Пауза(5); + + ИДЖелтого = Результат[Response]["market_item_id"]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено(); + + Товар.Вставить("Имя" , "Тестовый товар (" + Красный + ")"); + Товар.Вставить("ЗначенияСвойств", СоответствиеСвойств[Красный]); + + Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар"); + + OPI_Инструменты.Пауза(5); + + ИДКрасного = Результат[Response][MII]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено(); + + МассивТоваров = Новый Массив; + МассивТоваров.Добавить(ИДЖелтого); + МассивТоваров.Добавить(ИДКрасного); + + Результат = OPI_VK.ПолучитьТоварыПоИД(МассивТоваров, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТоварыПоИД"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["items"]).ИмеетТип("Массив").ИмеетДлину(2); + + Результат = OPI_VK.СгруппироватьТовары(МассивТоваров, , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СгруппироватьТовары"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["item_group_id"]).ИмеетТип(ТипЧисло).Заполнено(); + + OPI_VK.УдалитьТовар(ИДЖелтого , Параметры); + OPI_VK.УдалитьТовар(ИДКрасного, Параметры); + + Для Каждого Вариант Из СоответствиеСвойств Цикл + + Удаление = OPI_VK.УдалитьВариантСвойстваТовара(Вариант.Значение, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьВариантСвойстваТовара"); + + OPI_Инструменты.Пауза(5); + Проверка_ВКИстина(Удаление); + + КонецЦикла; + + Удаление = OPI_VK.УдалитьСвойствоТовара(Свойство, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСвойствоТовара"); + + OPI_Инструменты.Пауза(5); + + Проверка_ВКИстина(Удаление); + + УдалитьФайлы(ИВФ); + +КонецПроцедуры + +Процедура ВК_ПолучитьСписокТоваров() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + + МассивКартинок = Новый Массив; + МассивКартинок.Добавить(Картинка); + + Товар = Новый Соответствие(); + Товар.Вставить("Имя" , "Тестовый товар 2"); + Товар.Вставить("Описание" , "Описание товара"); + Товар.Вставить("Категория" , "20173"); + Товар.Вставить("Цена" , 1); + Товар.Вставить("СтараяЦена" , 15); + Товар.Вставить("ОсновноеФото" , Картинка); + Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); + Товар.Вставить("ДополнительныеФото" , МассивКартинок); + Товар.Вставить("ГлавныйВГруппе" , Истина); + Товар.Вставить("НомерГруппы" , Неопределено); + Товар.Вставить("Ширина" , 20); + Товар.Вставить("Высота" , 30); + Товар.Вставить("Глубина" , 40); + Товар.Вставить("Вес" , 100); + Товар.Вставить("SKU" , 12345); + Товар.Вставить("ДоступныйОстаток" , "10"); + + Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); + ИДТовара = Результат["response"]["market_item_id"]; + OPI_Инструменты.Пауза(5); + + Результат = OPI_VK.ПолучитьСписокТоваров(, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТоваров"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Массив").Заполнено(); + + OPI_VK.УдалитьТовар(ИДТовара, Параметры); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ПолучитьСписокПодборок() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка" + , Картинка + , Истина + , Ложь + , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров"); + + ИДПодборки = Результат["response"]["market_album_id"]; + Результат = OPI_VK.ПолучитьСписокПодборок(Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПодборок"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Массив").Заполнено(); + + OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ПолучитьСписокСвойств() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Результат = OPI_VK.ПолучитьСписокСвойств(Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСвойств"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Массив").Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ПолучитьСписокЗаказов() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Результат = OPI_VK.ПолучитьСписокЗаказов(Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Массив").Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ЗагрузитьВидео() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Видео = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Video"); + Наименование = "Новое видео"; + Описание = "Описание видео"; + + Результат = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, Наименование, Описание, , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_id"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_hash"]).Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +#КонецОбласти + +#Область YandexDisk + +Процедура ЯДиск_ПолучитьИнформациюОДиске() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Соответствие = "Соответствие"; + + Результат = OPI_YandexDisk.ПолучитьИнформациюОДиске(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОДиске"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["system_folders"]).ИмеетТип(Соответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user"]).ИмеетТип(Соответствие); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_СоздатьПапку() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Путь = "/" + Строка(Новый УникальныйИдентификатор); + + Результат = OPI_YandexDisk.СоздатьПапку(Токен, Путь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("dir"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь); + + OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL); + OPI_Инструменты.Пауза(5); + + Результат = OPI_YandexDisk.ПолучитьОбъект(Токен, Путь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбъект"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь); + + OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_ЗагрузитьУдалитьФайл() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + ИВФ = ПолучитьИмяВременногоФайла("png"); + Картинка.Записать(ИВФ); + + Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, Картинка, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); + + Проверка_Пусто(Результат); + OPI_Инструменты.Пауза(5); + + Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект"); + + Проверка_Пусто(Результат); + + Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, ИВФ, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); + + Проверка_Пусто(Результат); + OPI_Инструменты.Пауза(5); + + Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект"); + + Проверка_Пусто(Результат); + + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_СоздатьКопиюОбъекта() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + ПутьОригинала = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + ПутьКопии = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/" + + "OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL); + OPI_Инструменты.Пауза(5); + + Результат = OPI_YandexDisk.СоздатьКопиюОбъекта(Токен, ПутьОригинала, ПутьКопии, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКопиюОбъекта"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии); + + OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь); + OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_ПолучитьСсылкуНаСкачивание() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL); + OPI_Инструменты.Пауза(5); + + Результат = OPI_YandexDisk.ПолучитьСсылкуДляСкачивания(Токен, Путь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуДляСкачивания"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено(); + + URL = Результат["href"]; + + Результат = OPI_YandexDisk.СкачатьФайл(Токен, Путь); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные").Заполнено(); + + OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); + +КонецПроцедуры + +Процедура ЯДиск_ПолучитьСписокФайлов() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Количество = 2; + Отступ = 1; + + Результат = OPI_YandexDisk.ПолучитьСписокФайлов(Токен, Количество, Отступ, "image"); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив"); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_ПереместитьОбъект() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + ПутьОригинала = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + ПутьКопии = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/" + + "OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL); + OPI_Инструменты.Пауза(15); + + Результат = OPI_YandexDisk.ПереместитьОбъект(Токен, ПутьОригинала, ПутьКопии, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьОбъект"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии); + + OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь); + OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_ДействияПубличныхОбъектов() Экспорт + + PUrl = "public_url"; + Соответствие = "Соответствие"; + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL); + OPI_Инструменты.Пауза(5); + + МассивРезультатов = Новый Массив; + + МассивРезультатов.Добавить(OPI_YandexDisk.ОпубликоватьОбъект(Токен, Путь)); + ПубличныйURL = МассивРезультатов[0][PUrl]; + + Результат = OPI_YandexDisk.ПолучитьСсылкуСкачиванияПубличногоОбъекта(Токен, ПубличныйURL); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияПубличногоОбъекта"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено(); + + Результат = OPI_YandexDisk.ПолучитьПубличныйОбъект(Токен, ПубличныйURL); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПубличныйОбъект"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("/"); + + МассивРезультатов.Добавить(OPI_YandexDisk.СохранитьПубличныйОбъектНаДиск(Токен, ПубличныйURL)); + + МассивРезультатов.Добавить(OPI_YandexDisk.ОтменитьПубликациюОбъекта(Токен, Путь)); + + Счетчик = 0; + Для Каждого Результат Из МассивРезультатов Цикл + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Изменение публикации"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Заполнено(); + + Если Счетчик = 0 Тогда + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Строка").Заполнено(); + Иначе + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Неопределено"); + КонецЕсли; + + Счетчик = Счетчик + 1; + + КонецЦикла; + + OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_ПолучитьСписокОпубликованных() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Количество = 2; + Отступ = 1; + + Результат = OPI_YandexDisk.ПолучитьСписокОпубликованныхОбъектов(Токен, Количество, Отступ); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОпубликованныхОбъектов"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив"); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +#КонецОбласти + +#Область Viber + +Процедура Вайбер_ПолучитьИнформациюОКанале() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + Результат = OPI_Viber.ПолучитьИнформациюОКанале(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОКанале"); + + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ПолучитьДанныеПользователя() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + Результат = OPI_Viber.ПолучитьДанныеПользователя(Токен, Пользователь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["chat_hostname"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Заполнено(); + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ПолучитьОнлайнПользователей() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Результат = OPI_Viber.ПолучитьОнлайнПользователей(Токен, Пользователь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОнлайнПользователей"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["users"]).ИмеетТип("Массив"); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ОтправитьТекстовоеСообщение() Экспорт + + Текст = "Тестовое сообщение"; + ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + + МассивКнопок = Новый Массив; + МассивКнопок.Добавить("Кнопка 1"); + МассивКнопок.Добавить("Кнопка 2"); + МассивКнопок.Добавить("Кнопка 3"); + + Клавиатура = OPI_Viber.СформироватьКлавиатуруИзМассиваКнопок(МассивКнопок); + + Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенБота, Текст, Пользователь, Ложь, Клавиатура); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенКанал, Текст, Администратор, Истина, Клавиатура); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ОтправитьКартинку() Экспорт + + Текст = "Тестовое сообщение"; + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"); + ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + + Результат = OPI_Viber.ОтправитьКартинку(ТокенБота, Картинка, Пользователь, Ложь, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + Результат = OPI_Viber.ОтправитьКартинку(ТокенКанал, Картинка, Администратор, Истина, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ОтправитьФайл() Экспорт + + Документ = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document"); + ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + + Результат = OPI_Viber.ОтправитьФайл(ТокенБота, Документ, Пользователь, Ложь, "docx"); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + Результат = OPI_Viber.ОтправитьФайл(ТокенКанал, Документ, Администратор, Истина, "docx"); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ОтправитьКонтакт() Экспорт + + Имя = "Петр Петров"; + Телефон = "+123456789"; + ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + + Результат = OPI_Viber.ОтправитьКонтакт(ТокенБота, Имя, Телефон, Пользователь, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + Результат = OPI_Viber.ОтправитьКонтакт(ТокенКанал, Имя, Телефон, Администратор, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ОтправитьЛокацию() Экспорт + + Широта = "48.87373649724122"; + Долгота = "2.2954639195323967"; + ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + + Результат = OPI_Viber.ОтправитьЛокацию(ТокенБота, Широта, Долгота, Пользователь, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + Результат = OPI_Viber.ОтправитьЛокацию(ТокенКанал, Широта, Долгота, Администратор, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ОтправитьСсылку() Экспорт + + URL = "https://github.com/Bayselonarrend/OpenIntegrations"; + ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + + Результат = OPI_Viber.ОтправитьСсылку(ТокенБота, URL, Пользователь, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + Результат = OPI_Viber.ОтправитьСсылку(ТокенКанал, URL, Администратор, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +#КонецОбласти + +#Область GoogleWorkspace + +Процедура ГВ_ПолучитьСсылкуАвторизации() Экспорт + + ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID"); + Результат = OPI_GoogleWorkspace.СформироватьСсылкуПолученияКода(ClientID); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Строка") + .Заполнено(); + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Link", Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГВ_ПолучитьТокен() Экспорт + + ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID"); + ClientSecret = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret"); + Code = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Code"); + + Результат = OPI_GoogleWorkspace.ПолучитьТокенПоКоду(ClientID, ClientSecret, Code); + + Если ЗначениеЗаполнено(Результат["access_token"]) + И ЗначениеЗаполнено(Результат["refresh_token"]) Тогда + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token" , Результат["access_token"]); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Refresh", Результат["refresh_token"]); + + КонецЕсли; + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГВ_ОбновитьТокен() Экспорт + + ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID"); + ClientSecret = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret"); + RefreshToken = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Refresh"); + + Результат = OPI_GoogleWorkspace.ОбновитьТокен(ClientID, ClientSecret, RefreshToken); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено(); + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token", Результат["access_token"]); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +#КонецОбласти + +#Область GoogleCalendar + +Процедура ГК_ПолучитьСписокКалендарей() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Результат = OPI_GoogleCalendar.ПолучитьСписокКалендарей(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКалендарей"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Массив"); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГК_СоздатьУдалитьКалендарь() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Наименование = "Тестовый календарь"; + Описание = "Тестовое описание"; + НаименованиеИзмененное = Наименование + " (изм.)"; + ТипСоответствие = Тип("Соответствие"); + ТипСтрока = Тип("Строка"); + Summary = "summary"; + Черный = "#000000"; + Желтый = "#ffd800"; + + Результат = OPI_GoogleCalendar.СоздатьКалендарь(Токен, Наименование); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКалендарь"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(Наименование); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип(ТипСтрока).Заполнено(); + + Календарь = Результат["id"]; + + Результат = OPI_GoogleCalendar.ИзменитьМетаданныеКалендаря(Токен + , Календарь + , НаименованиеИзмененное + , Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьМетаданныеКалендаря"); + + Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание); + + Результат = OPI_GoogleCalendar.ПолучитьМетаданныеКалендаря(Токен, Календарь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьМетаданныеКалендаря"); + + Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание); + + Результат = OPI_GoogleCalendar.ДобавитьКалендарьВСписок(Токен, Календарь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьКалендарьВСписок"); + + Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание); + + Результат = OPI_GoogleCalendar.ИзменитьКалендарьСписка(Токен, Календарь, Черный, Желтый, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКалендарьСписка"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый); + + Результат = OPI_GoogleCalendar.ПолучитьКалендарьСписка(Токен, Календарь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКалендарьСписка"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый); + + Результат = OPI_GoogleCalendar.ОчиститьОсновнойКалендарь(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьОсновнойКалендарь"); + + Проверка_Пусто(Результат); + + Результат = OPI_GoogleCalendar.УдалитьКалендарьИзСписка(Токен, Календарь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарьИзСписка"); + + Проверка_Пусто(Результат); + + Результат = OPI_GoogleCalendar.УдалитьКалендарь(Токен, Календарь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарь"); + + Проверка_Пусто(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГК_СоздатьУдалитьСобытие() Экспорт + + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID"); + Наименование = "Новое событие"; + Описание = "Описание тестового события"; + ОписаниеИзм = "Описание тестового события (изм.)"; + UID = "id"; + Час = 3600; + + Вложения = Новый Соответствие; + + Вложения.Вставить("Картинка1" + , "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png"); + Вложения.Вставить("Картинка2" + , "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"); + + СоответствиеСобытия = Новый Соответствие; + СоответствиеСобытия.Вставить("Описание" , Описание); + СоответствиеСобытия.Вставить("Заголовок" , Наименование); + СоответствиеСобытия.Вставить("МестоПроведения" , "В офисе"); + СоответствиеСобытия.Вставить("ДатаНачала" , ТекущаяДата); + СоответствиеСобытия.Вставить("ДатаОкончания" , СоответствиеСобытия["ДатаНачала"] + Час); + СоответствиеСобытия.Вставить("МассивURLФайловВложений" , Вложения); + СоответствиеСобытия.Вставить("ОтправлятьУведомления" , Истина); + + Результат = OPI_GoogleCalendar.СоздатьСобытие(Токен, Календарь, СоответствиеСобытия); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСобытие"); + + Событие = Результат[UID]; + + Проверка_ГКОбъект(Результат, Наименование, Описание); + + СоответствиеСобытия = Новый Соответствие; + СоответствиеСобытия.Вставить("Описание", ОписаниеИзм); + + Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСобытие"); + + Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм); + + Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСобытие"); + + Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм); + + Результат = OPI_GoogleCalendar.ПереместитьСобытие(Токен, Календарь, Календарь, Событие); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьСобытие"); + + Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм); + + Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСобытие"); + + Проверка_Пусто(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГК_ПолучитьСписокСобытий() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID"); + + Результат = OPI_GoogleCalendar.ПолучитьСписокСобытий(Токен, Календарь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСобытий"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив"); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +#КонецОбласти + +#Область GoogleDrive + +Процедура ГД_ПолучитьСписокКаталогов() Экспорт + + MimeType = "mimeType"; + Name = "name"; + Имя = "Тестовая папка"; + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Результат = OPI_GoogleDrive.ПолучитьСписокКаталогов(Токен, Имя, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаталогов"); + + Результат = Результат[0]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено(); + + OPI_Инструменты.Пауза(5); + Идентификатор = Результат["id"]; + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GD_Catalog", Идентификатор); + + Результат = OPI_GoogleDrive.ПолучитьИнформациюОбОбъекте(Токен, Идентификатор); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГД_ЗагрузитьУдалитьФайл() Экспорт + + ЛишниеБайты = 2; + + Kind = "kind"; + Content = "content"; + MIME = "MIME"; + MimeType = "mimeType"; + Name = "name"; + Id_ = "id"; + + МассивУдаляемых = Новый Массив; + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + КартинкаЗамены = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2"); + Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog"); + + Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла(); + Описание.Вставить("Родитель", Каталог); + + Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Описание["Имя"]); + + Идентификатор = Результат[Id_]; + МассивУдаляемых.Добавить(Идентификатор); + + НовоеИмя = "Скопированный файл.jpeg"; + Результат = OPI_GoogleDrive.СкопироватьОбъект(Токен, Идентификатор, НовоеИмя, "root"); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкоприроватьОбъект"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя); + + МассивУдаляемых.Добавить(Результат[Id_]); + + Результат = OPI_GoogleDrive.СкачатьФайл(Токен, Идентификатор); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Картинка.Размер() + ЛишниеБайты); + OPI_Инструменты.Пауза(5); + + НовоеИмя = "Обновленный файл.jpg"; + Результат = OPI_GoogleDrive.ОбновитьФайл(Токен, Идентификатор, КартинкаЗамены, НовоеИмя); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьФайл"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя); + + OPI_Инструменты.Пауза(5); + + Комментарий = "Yo"; + Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment"); + + OPI_Инструменты.Пауза(5); + + Для Каждого Удаляемый Из МассивУдаляемых Цикл + Результат = OPI_GoogleDrive.УдалитьОбъект(Токен, Удаляемый); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь); + OPI_Инструменты.Пауза(2); + КонецЦикла; + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГД_СоздатьУдалитьКомментарий() Экспорт + + Kind = "kind"; + Content = "content"; + Id_ = "id"; + Comments = "comments"; + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog"); + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + + Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла(); + Описание.Вставить("Родитель", Каталог); + + Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание); + Идентификатор = Результат[Id_]; + + Комментарий = "Новый комментарий"; + МассивРезультатов = Новый Массив; + Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий"); + + ИДКомментария = Результат[Id_]; + + МассивРезультатов.Добавить(Результат); + + Результат = OPI_GoogleDrive.ПолучитьКомментарий(Токен, Идентификатор, ИДКомментария); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарий"); + + МассивРезультатов.Добавить(Результат); + + Результат = OPI_GoogleDrive.ПолучитьСписокКомментариев(Токен, Идентификатор); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКомментариев"); + + Комментарии = Результат[Comments]; + ОбъектКомментарий = Комментарии[Комментарии.ВГраница()]; + + МассивРезультатов.Добавить(ОбъектКомментарий); + + Для Каждого Результат Из МассивРезультатов Цикл + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment"); + КонецЦикла; + + Результат = OPI_GoogleDrive.УдалитьКомментарий(Токен, Идентификатор, ИДКомментария); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь); + + OPI_GoogleDrive.УдалитьОбъект(Токен, Идентификатор); + +КонецПроцедуры + +Процедура ГД_СоздатьКаталог() Экспорт + + Name = "name"; + Имя = "Тестовая папка"; + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog"); + + МассивРезультатов = Новый Массив; + + МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя)); + МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя, Каталог)); + + Для Каждого Результат Из МассивРезультатов Цикл + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку"); + + ИДКаталога = Результат["id"]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Имя); + + OPI_GoogleDrive.УдалитьОбъект(Токен, ИДКаталога); + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область GoogleSheets + +Процедура ГТ_СоздатьТаблицу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Наименование = "Тестовая таблица"; + + МассивЛистов = Новый Массив; + МассивЛистов.Добавить("Лист1"); + МассивЛистов.Добавить("Лист2"); + + Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКнигу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование); + + Для Н = 0 По МассивЛистов.ВГраница() Цикл + + ИмяЛиста = Результат["sheets"][Н]["properties"]["title"]; + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ИмяЛиста).Равно(МассивЛистов[Н]); + Лист = Результат["sheets"][Н]["properties"]["sheetId"]; + Лист = OPI_Инструменты.ЧислоВСтроку(Лист); + + КонецЦикла; + + Книга = Результат["spreadsheetId"]; + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Spreadsheet", Книга); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Sheet" , Лист); + + Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов); + Книга2 = Результат["spreadsheetId"]; + + Результат = OPI_GoogleSheets.КопироватьЛист(Токен, Книга, Книга2, Лист); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьЛист"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["title"]).Равно(ИмяЛиста + " (копия)"); + + Наименование = "Тестовый лист"; + + Результат = OPI_GoogleSheets.ДобавитьЛист(Токен, Книга, Наименование); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьЛист"); + + НовыйЛист = Результат["replies"][0]["addSheet"]["properties"]["sheetId"]; + НовыйЛист = OPI_Инструменты.ЧислоВСтроку(НовыйЛист); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + + Результат = OPI_GoogleSheets.УдалитьЛист(Токен, Книга, НовыйЛист); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЛист"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + + Наименование = "Тестовая таблица (изм.)"; + + Результат = OPI_GoogleSheets.ИзменитьНаименованиеКниги(Токен, Книга, Наименование); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьНаименованиеКниги"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + +КонецПроцедуры + +Процедура ГТ_ПолучитьТаблицу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet"); + Наименование = "Тестовая таблица (изм.)"; + + Результат = OPI_GoogleSheets.ПолучитьКнигу(Токен, Книга); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование); + +КонецПроцедуры + +Процедура ГТ_ЗаполнитьОчиститьЯчейки() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet"); + Лист = "Лист2"; + + СтруктураЯчеек = Новый Соответствие; + СтруктураЯчеек.Вставить("A1", "Это A1"); + СтруктураЯчеек.Вставить("A2", "Это A2"); + СтруктураЯчеек.Вставить("B2", "Это B2"); + СтруктураЯчеек.Вставить("B3", "Это B3"); + СтруктураЯчеек.Вставить("A3", "Это A3"); + СтруктураЯчеек.Вставить("A4", "Это A4"); + СтруктураЯчеек.Вставить("B1", "Это B1"); + СтруктураЯчеек.Вставить("B4", "Это B4"); + + МассивЯчеек = Новый Массив; + МассивЯчеек.Добавить("B2"); + МассивЯчеек.Добавить("A3"); + МассивЯчеек.Добавить("B4"); + + Результат = OPI_GoogleSheets.УстановитьЗначенияЯчеек(Токен, Книга, СтруктураЯчеек, Лист); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЗначенияЯчеек"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["totalUpdatedCells"]).Равно(СтруктураЯчеек.Количество()); + + Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, МассивЯчеек, Лист); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["valueRanges"].Количество()).Равно(МассивЯчеек.Количество()); + + Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, , Лист); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + + МассивЯчеек = Новый Массив; + МассивЯчеек.Добавить("B2"); + МассивЯчеек.Добавить("A3"); + МассивЯчеек.Добавить("B4"); + + Результат = OPI_GoogleSheets.ОчиститьЯчейки(Токен, Книга, МассивЯчеек, Лист); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьЯчейки"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["clearedRanges"].Количество()).Равно(МассивЯчеек.Количество()); + +КонецПроцедуры + +#КонецОбласти + +#Область Twitter + +Процедура Твиттер_ПолучитьСсылкуАвторизации() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Результат = OPI_Twitter.ПолучитьСсылкуАвторизации(Параметры); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено(); + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_URL", Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Твиттер_ОбновитьТокен() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Результат = OPI_Twitter.ОбновитьТокен(Параметры); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["refresh_token"]).Заполнено(); + + Рефреш = Результат["refresh_token"]; + Токен = Результат["access_token"]; + + Если ЗначениеЗаполнено(Рефреш) И Не Рефреш = "null" Тогда + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Refresh", Рефреш); + КонецЕсли; + + Если ЗначениеЗаполнено(Токен) И Не Токен = "null" Тогда + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Token" , Токен); + КонецЕсли; + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Твиттер_СоздатьТекстовыйТвит() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); + + Результат = OPI_Twitter.СоздатьТекстовыйТвит(Текст, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТекстовыйТвит"); + + Проверка_ТвиттерТекст(Результат, Текст); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Твиттер_СоздатьТвитСКартинкой() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + ИВФ = ПолучитьИмяВременногоФайла("png"); + Картинка.Записать(ИВФ); + + Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, Картинка, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки"); + + Проверка_ТвиттерТекст(Результат, Текст); + + Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, ИВФ, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки"); + + Проверка_ТвиттерТекст(Результат, Текст); + + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(20); + +КонецПроцедуры + +Процедура Твиттер_СоздатьТвитСВидео() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); + Видео = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Video"); + ИВФ = ПолучитьИмяВременногоФайла("mp4"); + Видео.Записать(ИВФ); + + Результат = OPI_Twitter.СоздатьТвитВидео(Текст, Видео, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео"); + + Проверка_ТвиттерТекст(Результат, Текст); + + Результат = OPI_Twitter.СоздатьТвитВидео(Текст, ИВФ, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео"); + + Проверка_ТвиттерТекст(Результат, Текст); + + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(20); + +КонецПроцедуры + +Процедура Твиттер_СоздатьТвитСГиф() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); + Гифка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("GIF"); + ИВФ = ПолучитьИмяВременногоФайла("gif"); + Гифка.Записать(ИВФ); + + Результат = OPI_Twitter.СоздатьТвитГифки(Текст, Гифка, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки"); + + Проверка_ТвиттерТекст(Результат, Текст); + + Результат = OPI_Twitter.СоздатьТвитГифки(Текст, ИВФ, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки"); + + Проверка_ТвиттерТекст(Результат, Текст); + + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(20); + +КонецПроцедуры + +Процедура Твиттер_СоздатьТвитСОпросом() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); + МассивОтветов = Новый Массив; + МассивОтветов.Добавить("Вариант 1"); + МассивОтветов.Добавить("Вариант 2"); + + Результат = OPI_Twitter.СоздатьТвитОпрос(Текст, МассивОтветов, 60, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитОпрос"); + + Проверка_ТвиттерТекст(Результат, Текст); + + OPI_Инструменты.Пауза(20); + +КонецПроцедуры + +#КонецОбласти + +#Область Notion + +Процедура Ноушн_СоздатьСтраницу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent"); + Заголовок = "Тестовый заголовок"; + + Результат = OPI_Notion.СоздатьСтраницу(Токен, Родитель, Заголовок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницу"); + + Проверка_НоушнОбъект(Результат); + +КонецПроцедуры + +Процедура Ноушн_СоздатьИзменитьБазу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent"); + Заголовок = "Тестовый заголовок"; + + Свойства = Новый Соответствие; + Свойства.Вставить("Имя" , "title"); + Свойства.Вставить("Описание" , "rich_text"); + Свойства.Вставить("Номер" , "number"); + Свойства.Вставить("Статус" , "status"); + Свойства.Вставить("Дата создания" , "date"); + Свойства.Вставить("Картинка" , "files"); + Свойства.Вставить("Активен" , "checkbox"); + Свойства.Вставить("Сайт" , "url"); + Свойства.Вставить("Почта" , "email"); + Свойства.Вставить("Телефон" , "phone_number"); + Свойства.Вставить("Пользователь" , "people"); + + ВыборЗначения = Новый Соответствие; + ВыборЗначения.Вставить("Новый", "green"); + ВыборЗначения.Вставить("В работе", "yellow"); + ВыборЗначения.Вставить("Удаленный", "red"); + Свойства.Вставить("Статус", ВыборЗначения); + + Результат = OPI_Notion.СоздатьБазуДанных(Токен, Родитель, Заголовок, Свойства); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных"); + + Проверка_НоушнОбъект(Результат, "database"); + + База = Результат["id"]; + Заголовок = "Тестовый заголовок"; + Описание = "Тестовое описание"; + + Свойства = Новый Соответствие; + Свойства.Вставить("Почта", "rich_text"); // Тип поля "Почта" будет изменен с email на текст + Свойства.Вставить("Сайт"); // Поле "Сайт" будет удалено + + Результат = OPI_Notion.ИзменитьСвойстваБазы(Токен, База, Свойства, Заголовок, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваБазы"); + + Проверка_НоушнОбъект(Результат, "database"); + +КонецПроцедуры + +Процедура Ноушн_ПолучитьИнформациюОСтранице() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page"); + + Результат = OPI_Notion.ПолучитьСтраницу(Токен, Страница); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтраницу"); + + Проверка_НоушнОбъект(Результат); + +КонецПроцедуры + +Процедура Ноушн_ПолучитьИнформациюОБазе() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base"); + + Результат = OPI_Notion.ПолучитьБазуДанных(Токен, База); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьБазуДанных"); + + Проверка_НоушнОбъект(Результат, "database"); + +КонецПроцедуры + +Процедура Ноушн_СоздатьСтраницуВБазу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base"); + + Картинка = Новый Соответствие; + Картинка.Вставить("Лого", OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture")); + + Свойства = Новый Соответствие; + Свойства.Вставить("Имя" , "ООО Вектор"); + Свойства.Вставить("Описание" , "Наш первый клиент"); + Свойства.Вставить("Номер" , 1); + Свойства.Вставить("Статус" , "Обычный"); + Свойства.Вставить("Дата создания" , OPI_Инструменты.ПолучитьТекущуюДату()); + Свойства.Вставить("Картинка" , Картинка); + Свойства.Вставить("Активен" , Истина); + Свойства.Вставить("Сайт" , "https://vector.ru"); + Свойства.Вставить("Почта" , "mail@vector.ru"); + Свойства.Вставить("Телефон" , "88005553535"); + Свойства.Вставить("Статус" , "Новый"); + + Результат = OPI_Notion.СоздатьСтраницуВБазу(Токен, База, Свойства); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницуВБазу"); + + Проверка_НоушнОбъект(Результат); + + Родитель = СтрЗаменить(Результат["parent"]["database_id"], "-", ""); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Родитель).Равно(База); + +КонецПроцедуры + +Процедура Ноушн_ИзменитьСвойстваСтраницы() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page"); + Иконка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"); + Обложка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture2"); + Архивировать = Ложь; + + Свойства = Новый Соответствие; + Свойства.Вставить("Активен" , Ложь); + Свойства.Вставить("Почта" , "vector@mail.ru"); + + Результат = OPI_Notion.ИзменитьСвойстваСтраницы(Токен + , Страница + , Свойства + , Иконка + , Обложка + , Архивировать); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваСтраницы"); + + Проверка_НоушнОбъект(Результат); + +КонецПроцедуры + +Процедура Ноушн_СоздатьУдалитьБлок() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent"); + Блок = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Block"); + + Результат = OPI_Notion.ВернутьБлок(Токен, Блок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьБлок"); + + Проверка_НоушнОбъект(Результат, "block"); + + Результат = OPI_Notion.СоздатьБлок(Токен, Родитель, Результат); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБлок"); + + Проверка_НоушнОбъект(Результат, "list"); + + Блок = Результат["results"][0]["id"]; + Результат = OPI_Notion.ВернутьДочерниеБлоки(Токен, Блок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьДочерниеБлоки"); + + Проверка_НоушнОбъект(Результат, "list"); + + Результат = OPI_Notion.УдалитьБлок(Токен, Блок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБлок"); + + Проверка_НоушнОбъект(Результат, "block"); + +КонецПроцедуры + +Процедура Ноушн_ПолучитьПользователей() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Результат = OPI_Notion.СписокПользователей(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СписокПользователей"); + + Проверка_НоушнОбъект(Результат, "list"); + +КонецПроцедуры + +Процедура Ноушн_ПолучитьДанныеПользователя() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_User"); + Результат = OPI_Notion.ПолучитьДанныеПользователя(Токен, Пользователь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя"); + + Проверка_НоушнОбъект(Результат, "user"); + +КонецПроцедуры + +#КонецОбласти + +#Область Slack + +Процедура Слак_ПолучитьИнформациюОБоте() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Результат = OPI_Slack.ПолучитьИнформациюОБоте(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОБоте"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bot_id"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user_id"]).Заполнено(); + +КонецПроцедуры + +Процедура Слак_ПолучитьСписокПользователей() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Результат = OPI_Slack.ПолучитьСписокПользователей(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователей"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_ПолучитьСписокОбластей() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Результат = OPI_Slack.ПолучитьСписокРабочихОбластей(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокРабочихОбластей"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["teams"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_ОтправитьУдалитьСообщение() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + Текст = "Тестовое сообщение 1"; + Текст2 = "Тестовое сообщение 2"; + Отметки = Новый Массив; + Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"; + + Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст); + + Отметка = Результат["ts"]; + + Результат = OPI_Slack.ИзменитьСообщение(Токен, Канал, Отметка, Текст2); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСообщение"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст2); + + Результат = OPI_Slack.ПолучитьСписокОтветовНаСообщение(Токен, Канал, Отметка); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтветовНаСообщение"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив"); + + Результат = OPI_Slack.ПолучитьСсылкуНаСообщение(Токен, Канал, Отметка); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуНаСообщение"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["permalink"]).Заполнено(); + + Проверка_СлакОк(Результат); + + Отметки.Добавить(Отметка); + + МассивБлоков = Новый Массив; + Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo"); + МассивБлоков.Добавить(Блок); + + Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , МассивБлоков); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (картинка)"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); + + Отметки.Добавить(Результат["ts"]); + + Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo"); + БлокJSON = OPI_Инструменты.JSONСтрокой(Блок); + + ИВФ = ПолучитьИмяВременногоФайла("json"); + + ТекстовыйДокумент = Новый ТекстовыйДокумент(); + ТекстовыйДокумент.УстановитьТекст(БлокJSON); + ТекстовыйДокумент.Записать(ИВФ); + + Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , ИВФ); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json)"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); + + Отметки.Добавить(Результат["ts"]); + + Блоки = "['" + ИВФ + "','" + ИВФ + "']"; + Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , Блоки); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json массив)"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); + + Отметки.Добавить(Результат["ts"]); + + УдалитьФайлы(ИВФ); + + Для Каждого Отметка Из Отметки Цикл + + Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); + + КонецЦикла; + + Час = 3600; + Сутки = 24; + Отправка = OPI_Инструменты.ПолучитьТекущуюДату() + (Сутки * Час); + Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, Отправка); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (отложенное)"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_message_id"]).Заполнено(); + + Отметка = Результат["scheduled_message_id"]; + Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение"); + + Проверка_СлакОк(Результат); + +КонецПроцедуры + +Процедура Слак_ОтправитьУдалитьЭфемерное() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User"); + Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"; + Текст = "Тестовое сообщение 1"; + + Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo"); + Результат = OPI_Slack.ОтправитьЭфемерноеСообщение(Токен, Канал, Текст, Пользователь, Блок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_ts"]).Заполнено(); + +КонецПроцедуры + +Процедура Слак_ПолучитьОтложенныеСообщения() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + + Результат = OPI_Slack.ПолучитьСписокОтложенныхСообщений(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтложенныхСообщений"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_messages"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_СоздатьАрхивироватьКанал() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User"); + Имя = "testconv" + Строка(Новый УникальныйИдентификатор); + Тема = "Тестовая тема"; + Цель = "Тестовая цель"; + + #Область СоздатьКанал + Результат = OPI_Slack.СоздатьКанал(Токен, Имя); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКанал"); + + Данные = Результат["channel"]; + Канал = Данные["id"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); + #КонецОбласти + + #Область УстановитьТемуКанала + Результат = OPI_Slack.УстановитьТемуКанала(Токен, Канал, Тема); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьТемуКанала"); + + Данные = Результат["channel"]; + Канал = Данные["id"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["topic"]["value"]).Равно(Тема); + #КонецОбласти + + #Область УстановитьЦельКанала + Результат = OPI_Slack.УстановитьЦельКанала(Токен, Канал, Цель); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЦельКанала"); + + Проверка_СлакОк(Результат); + #КонецОбласти + + #Область ПолучитьКанал + Результат = OPI_Slack.ПолучитьКанал(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКанал"); + + Данные = Результат["channel"]; + Канал = Данные["id"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); + #КонецОбласти + + #Область ПригласитьПользователейВКанал + Результат = OPI_Slack.ПригласитьПользователейВКанал(Токен, Канал, Пользователь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПригласитьПользователейВКанал"); + + Данные = Результат["channel"]; + Канал = Данные["id"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); + #КонецОбласти + + #Область ВыгнатьПользователяИзКанала + Результат = OPI_Slack.ВыгнатьПользователяИзКанала(Токен, Канал, Пользователь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыгнатьПользователяИзКанала"); + + Проверка_СлакОк(Результат); + #КонецОбласти + + #Область ПолучитьИсториюКанала + Результат = OPI_Slack.ПолучитьИсториюКанала(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИсториюКанала"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив"); + #КонецОбласти + + #Область ПолучитьСписокПользователейКанала + Результат = OPI_Slack.ПолучитьСписокПользователейКанала(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователейКанала"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив"); + #КонецОбласти + + #Область ПокинутьКанал + Результат = OPI_Slack.ПокинутьКанал(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПокинутьКанал"); + + Проверка_СлакОк(Результат); + #КонецОбласти + + #Область ВступитьВКанал + Результат = OPI_Slack.ВступитьВКанал(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВступитьВКанал"); + + Данные = Результат["channel"]; + Канал = Данные["id"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); + #КонецОбласти + + #Область ПереименоватьКанал + НовоеИмя = "testconv" + Строка(Новый УникальныйИдентификатор); + Результат = OPI_Slack.ПереименоватьКанал(Токен, Канал, НовоеИмя); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьКанал"); + + Данные = Результат["channel"]; + Канал = Данные["id"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(НовоеИмя); + #КонецОбласти + + #Область АрхивироватьКанал + Результат = OPI_Slack.АрхивироватьКанал(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "АрхивироватьКанал"); + + Проверка_СлакОк(Результат); + #КонецОбласти + +КонецПроцедуры + +Процедура Слак_ПолучитьСписокКаналов() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + + Результат = OPI_Slack.ПолучитьСписокКаналов(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаналов"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channels"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_ОткрытьЗакрытьДиалог() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User"); + Текст = "Yo, dude"; + + Результат = OPI_Slack.ОткрытьДиалог(Токен, Пользователь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьДиалог"); + + Диалог = Результат["channel"]["id"]; + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).ИмеетТип("Соответствие"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Диалог).Заполнено(); + + Результат = OPI_Slack.ОтправитьСообщение(Токен, Диалог, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение"); + + Проверка_СлакОк(Результат); + + Результат = OPI_Slack.ЗакрытьДиалог(Токен, Диалог); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьДиалог"); + + Проверка_СлакОк(Результат); + +КонецПроцедуры + +Процедура Слак_ПолучитьСписокФайлов() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + + Результат = OPI_Slack.ПолучитьСписокФайлов(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_ЗагрузитьУдалитьФайл() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Файл = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Document"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + МассивФайлов = Новый Массив; + ИмяФайла = "megadoc.docx"; + Заголовок = "Новый файл"; + + Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); + + ЗагруженныйФайл = Результат["files"][0]; + МассивФайлов.Добавить(ЗагруженныйФайл["id"]); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); + + Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл (в канал)"); + + ЗагруженныйФайл = Результат["files"][0]; + МассивФайлов.Добавить(ЗагруженныйФайл["id"]); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); + + Результат = OPI_Slack.ПолучитьДанныеФайла(Токен, ЗагруженныйФайл["id"]); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьФайл"); + + ЗагруженныйФайл = Результат["file"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); + + Для Каждого ЗагруженныйФайл Из МассивФайлов Цикл + + Результат = OPI_Slack.УдалитьФайл(Токен, ЗагруженныйФайл); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьФайл"); + + Проверка_СлакОк(Результат); + + КонецЦикла; + +КонецПроцедуры + +Процедура Слак_ПолучитьСписокВФ() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + + Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); + + Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_ЗагрузитьУдалитьВФ() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Файл = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + Заголовок = "Новый файл"; + + Результат = OPI_Slack.ДобавитьВнешнийФайл(Токен, Файл, Заголовок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВнешнийФайл"); + + ЗагруженныйФайл = Результат["file"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок); + + Результат = OPI_Slack.ПолучитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьВнешнийФайл"); + + ЗагруженныйФайл = Результат["file"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок); + + Результат = OPI_Slack.ОтправитьВнешнийФайл(Токен, ЗагруженныйФайл["id"], Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл"); + + Проверка_СлакОк(Результат); + + Результат = OPI_Slack.УдалитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл"); + + Проверка_СлакОк(Результат); + +КонецПроцедуры + +#КонецОбласти + +#Область Airtable + +Процедура АТ_СоздатьБазу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); + Область = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Workspace"); + Наименование = "Тестовая база"; + + МассивПолей = Новый Массив; + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер")); + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое")); + + ИмяТаблицы = "Тестовая таблица"; + + СоответствиеТаблиц = Новый Соответствие; + СоответствиеТаблиц.Вставить(ИмяТаблицы, МассивПолей); + + Результат = OPI_Airtable.СоздатьБазу(Токен, Область, Наименование, СоответствиеТаблиц); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"][0]["name"]).Равно(ИмяТаблицы); + + База = Результат["id"]; + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Base", База); + + Результат = OPI_Airtable.ПолучитьТаблицыБазы(Токен, База); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицыБазы"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).ИмеетТип("Массив"); + + Результат = OPI_Airtable.ПолучитьСписокБаз(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокБаз"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура АТ_СоздатьТаблицу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); + + МассивПолей = Новый Массив; + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[0], "ПолучитьПолеНомера"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[1], "ПолучитьПолеСтроковое"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеВложения("Вложение")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[2], "ПолучитьПолеВложения"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеФлажка("Флажок")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[3], "ПолучитьПолеФлажка"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеДаты("Дата")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[4], "ПолучитьПолеДаты"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеТелефона("Телефон")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[5], "ПолучитьПолеТелефона"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеПочты("Почта")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[6], "ПолучитьПолеПочты"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСсылки("Ссылка")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[7], "ПолучитьПолеСсылки"); + + ИмяТаблицы = "Тестовая таблица 2"; + Описание = "Новая таблица"; + + Результат = OPI_Airtable.СоздатьТаблицу(Токен, База, ИмяТаблицы, МассивПолей, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); + + Таблица = Результат["id"]; + ИмяТаблицы = "Тестовая таблица 2 (изм.)"; + Описание = "Новая таблица (изм.)"; + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Table", Таблица); + + Результат = OPI_Airtable.ИзменитьТаблицу(Токен, База, Таблица, ИмяТаблицы, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТаблицу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); + +КонецПроцедуры + +Процедура АТ_СоздатьПоле() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); + Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table"); + Имя = Строка(Новый УникальныйИдентификатор); + + Поле = OPI_Airtable.ПолучитьПолеНомера(Имя); + + Результат = OPI_Airtable.СоздатьПоле(Токен, База, Таблица, Поле); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПоле"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя); + + Поле = Результат["id"]; + Имя = Имя + "(изм.)"; + Описание = "Новое описание"; + + Результат = OPI_Airtable.ИзменитьПоле(Токен, База, Таблица, Поле, Имя, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПоле"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); + +КонецПроцедуры + +Процедура АТ_СоздатьУдалитьЗаписи() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); + Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table"); + + Числовой = 10; + Строчный = "Привет"; + + ОписаниеСтроки1 = Новый Структура("Номер,Строковое", Числовой, Строчный); + ОписаниеСтроки2 = Новый Структура("Номер,Строковое", Числовой, Строчный); + + МассивУдаляемых = Новый Массив; + МассивОписаний = Новый Массив; + МассивОписаний.Добавить(ОписаниеСтроки1); + МассивОписаний.Добавить(ОписаниеСтроки2); + + Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, МассивОписаний); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(2); + + Для Каждого Запись Из Результат["records"] Цикл + МассивУдаляемых.Добавить(Запись["id"]); + КонецЦикла; + + Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, ОписаниеСтроки1); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи (одна)"); + + ОдиночнаяЗапись = Результат["id"]; + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ОдиночнаяЗапись).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["createdTime"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["fields"]["Номер"]).Равно(Числовой); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(СокрЛП(Результат["fields"]["Строковое"])).Равно(Строчный); + + Результат = OPI_Airtable.ПолучитьЗапись(Токен, База, Таблица, ОдиночнаяЗапись); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗапись"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(ОдиночнаяЗапись); + + Текст = "Тестовый комментарий"; + Результат = OPI_Airtable.СоздатьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст); + + Коммент = Результат["id"]; + Текст = "Тестовый комментарий (изм.)"; + Результат = OPI_Airtable.ИзменитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКомментарий"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст); + + Результат = OPI_Airtable.ПолучитьКомментарии(Токен, База, Таблица, ОдиночнаяЗапись); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарии"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["comments"]).ИмеетТип("Массив"); + + Результат = OPI_Airtable.УдалитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["deleted"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(Коммент); + + Результат = OPI_Airtable.ПолучитьСписокЗаписей(Токен, База, Таблица); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаписей"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено(); + + Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, МассивУдаляемых); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено(); + + Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, ОдиночнаяЗапись); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи (одна)"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено(); + +КонецПроцедуры + +#КонецОбласти + +#Область Dropbox + +Процедура ДропБокс_ПолучитьОбновитьТокен() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appkey" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appsecret", ПараметрыТеста); + + Dropbox_ПолучитьСсылкуАвторизации(ПараметрыТеста); + + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Code", ПараметрыТеста); + + Dropbox_ПолучитьТокен(ПараметрыТеста); + + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Refresh", ПараметрыТеста); + + Dropbox_ОбновитьТокен(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_ЗагрузитьФайл() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture", ПараметрыТеста); + + Dropbox_ЗагрузитьФайл(ПараметрыТеста); + Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыТеста); + Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыТеста); + Dropbox_ВосстановитьОбъектКВерсии(ПараметрыТеста); + Dropbox_ПолучитьПревью(ПараметрыТеста); + Dropbox_СкачатьФайл(ПараметрыТеста); + Dropbox_ПереместитьОбъект(ПараметрыТеста); + Dropbox_КопироватьОбъект(ПараметрыТеста); + Dropbox_УдалитьОбъект(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_СоздатьКаталог() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); + + Dropbox_СоздатьПапку(ПараметрыТеста); + Dropbox_СкачатьПапку(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_ПолучитьСписокФайловПапки() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); + + Dropbox_ПолучитьСписокФайловПапки(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_ЗагрузитьФайлПоURL() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document", ПараметрыТеста); + + Dropbox_ЗагрузитьФайлПоURL(ПараметрыТеста); + Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_СоздатьУдалитьТег() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); + + Dropbox_ДобавитьТег(ПараметрыТеста); + Dropbox_ПолчитьСписокТегов(ПараметрыТеста); + Dropbox_УдалитьТег(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_ПолучитьАккаунт() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); + + Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыТеста); + Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_РаботаСДоступами() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_OtherUser", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_FileID" , ПараметрыТеста); + + Dropbox_ДобавитьПользователейКФайлу(ПараметрыТеста); + Dropbox_ОпубликоватьПапку(ПараметрыТеста); + Dropbox_ДобавитьПользователейКПапке(ПараметрыТеста); + Dropbox_ОтменитьПубликациюПапки(ПараметрыТеста); + Dropbox_ОтменитьПубликациюФайла(ПараметрыТеста); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьПараметрыВК() + + Параметры = Новый Структура; + НомерГруппы = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_GroupID"); + + Параметры.Вставить("access_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_Token")); + Параметры.Вставить("owner_id" , "-" + НомерГруппы); + Параметры.Вставить("app_id" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AppID")); + Параметры.Вставить("group_id" , НомерГруппы); + + Возврат Параметры; + +КонецФункции + +Функция ПолучитьПараметрыТвиттер() + + Параметры = Новый Соответствие; + + Параметры.Вставить("redirect_uri" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Redirect")); + Параметры.Вставить("client_id" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClinetID")); + Параметры.Вставить("client_secret" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClientSecret")); + Параметры.Вставить("access_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Token")); + Параметры.Вставить("refresh_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Refresh")); + Параметры.Вставить("oauth_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthToken")); + Параметры.Вставить("oauth_token_secret" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthSecret")); + + Параметры.Вставить("oauth_consumer_key" + , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerKey")); + Параметры.Вставить("oauth_consumer_secret" + , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerSecret")); + + Возврат Параметры; + +КонецФункции + +#Область Проверки + +Процедура Проверка_Пусто(Знач Результат) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь); +КонецПроцедуры + +Процедура Проверка_ДвоичныеДанные(Знач Результат, Знач Размер = Неопределено) + + МинимальныйРазмер = 500000; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные"); + + Если Не Размер = Неопределено Тогда + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Размер); + Иначе + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер() > МинимальныйРазмер).Равно(Истина); + КонецЕсли; + +КонецПроцедуры + +Процедура Проверка_ТелеграмИстина(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина); + +КонецПроцедуры + +Процедура Проверка_ТелеграмИнформацияБота(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["username"]).Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ТелеграмМассив(Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмУстановкаВебхук(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Webhook was set"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмУдалениеВебхук(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ТелеграмСообщение(Знач Результат, Знач Текст) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["text"]).Равно(Текст); + +КонецПроцедуры + +Процедура Проверка_ТелеграмКартинка(Знач Результат, Знач Текст) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["photo"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмВидео(Знач Результат, Знач Текст) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["video"]["mime_type"]).Равно("video/mp4"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмАудио(Знач Результат, Знач Текст) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["audio"]["mime_type"]).Равно("audio/mpeg"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмДокумент(Знач Результат, Знач Текст) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["document"]).ИмеетТип("Соответствие").Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ТелеграмГифка(Знач Результат, Знач Текст) + + Result = "result"; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["caption"]).Равно(Текст); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["document"]).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["animation"]["mime_type"]).Равно("video/mp4"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмМедиагруппа(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмМестоположение(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["location"]).ИмеетТип("Соответствие").Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ТелеграмКонтакт(Знач Результат, Знач Имя) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]["first_name"]).Равно(Имя); + +КонецПроцедуры + +Процедура Проверка_ТелеграмОпрос(Знач Результат, Знач Вопрос) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]["question"]).Равно(Вопрос); + +КонецПроцедуры + +Процедура Проверка_ТелеграмПереслать(Знач Результат, Знач IDСообщения) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["forward_origin"]["message_id"]).Равно(Число(IDСообщения)); + +КонецПроцедуры + +Процедура Проверка_ТелеграмБан(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Bad Request: can't remove chat owner"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмПриглашение(Знач Результат, Знач Заголовок, Знач UnixИстечение) + + Result = "result"; + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["member_limit"]).Равно(200); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["name"]).Равно(Заголовок); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["expire_date"]).Равно(Число(UnixИстечение)); + +КонецПроцедуры + +Процедура Проверка_ТелеграмЧисло(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Число"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмСозданиеТемы(Знач Результат, Знач Имя, Иконка) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["name"]).Равно(Имя); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["icon_custom_emoji_id"]).Равно(Иконка); + +КонецПроцедуры + +Процедура Проверка_ВКПост(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["post_id"]).ИмеетТип("Число").Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ВКИстина(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Равно(1); + +КонецПроцедуры + +Процедура Проверка_ВКАльбом(Знач Результат, Знач Описание) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["description"]).Равно(Описание); + +КонецПроцедуры + +Процедура Проверка_ВККартинкаАльбома(Знач Результат, Знач ОписаниеКартинки, Знач ИДАльбома) + + Response = "response"; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["text"]).Равно(ОписаниеКартинки); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["album_id"]).Равно(ИДАльбома); + +КонецПроцедуры + +Процедура Проверка_ВКИстория(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["count"]).ИмеетТип("Число").Равно(1); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["items"]).ИмеетТип("Массив").Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ВКОбсуждение(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ГКОбъект(Знач Результат, Знач Наименование, Знач Описание) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["summary"]).Равно(Наименование); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип("Строка").Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ТвиттерТекст(Знач Результат, Знач Текст) + + ТекстОтвета = Результат["data"]["text"]; + ТекстОтвета = Лев(ТекстОтвета, СтрДлина(Текст)); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ТекстОтвета).Равно(Текст); + +КонецПроцедуры + +Процедура Проверка_ВайберОк(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Равно("ok"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status"]).Равно(0); + +КонецПроцедуры + +Процедура Проверка_НоушнОбъект(Знач Результат, Знач Вид = "page") + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["object"]).Равно(Вид); + +КонецПроцедуры + +Процедура Проверка_СлакОк(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + +КонецПроцедуры + +Процедура Проверка_ДропБоксФайл(Знач Результат, Знач Путь) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path_display"]).Равно(Путь); + +КонецПроцедуры + +Процедура Проверка_ДропБоксМетаданные(Знач Результат, Знач Путь) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["metadata"]["path_display"]).Равно(Путь); + +КонецПроцедуры + +Процедура Проверка_ДропБоксМассив(Знач Результат, Знач Количество = Неопределено) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"]).ИмеетТип("Массив"); + + Если Не Количество = Неопределено Тогда + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"].Количество()).Равно(Количество); + КонецЕсли; + +КонецПроцедуры + +Процедура Проверка_ДропБоксРабота(Знач Результат) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["async_job_id"]).Заполнено(); +КонецПроцедуры + +Процедура Проверка_ДропБоксСтатус(Знач Результат) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[".tag"]).Равно("complete"); +КонецПроцедуры + +Процедура Проверка_ДропБоксТеги(Знач Результат, Знач Количество) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"].Количество()).Равно(Количество); + +КонецПроцедуры + +Процедура Проверка_ДропбоксАккаунт(Знач Результат) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["account_id"]).Заполнено(); +КонецПроцедуры + +Процедура Проверка_ДропбоксПространство(Знач Результат) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["used"]).Заполнено(); +КонецПроцедуры + +Процедура Проверка_ДропбоксУчастник(Знач Результат, Знач Почта, Знач ТолькоПросмотр) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["result"][".tag"]).Равно("success"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["member"]["email"]).Равно(Почта); + OPI_ПолучениеДанныхТестов.ОжидаетЧто( + Результат[0]["result"]["success"][".tag"]).Равно(?(ТолькоПросмотр, "viewer", "editor")); +КонецПроцедуры + +Процедура Проверка_ДропбоксПубличнаяПапка(Знач Результат) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["shared_folder_id"]).Заполнено(); +КонецПроцедуры + +#КонецОбласти + +#Область АтомарныеТесты + +#Область Telegram + +Процедура Telegram_ПолучитьИнформациюБота(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Результат = OPI_Telegram.ПолучитьИнформациюБота(Токен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюБота", "Telegram"); + + Проверка_ТелеграмИнформацияБота(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ПолучитьОбновления(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Результат = OPI_Telegram.ПолучитьОбновления(Токен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбновления", "Telegram"); + + Проверка_ТелеграмМассив(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_УстановитьWebhook(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + URL = ПараметрыФункции["Telegram_URL"]; + + Результат = OPI_Telegram.УстановитьWebhook(Токен, URL); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьWebhook", "Telegram"); + + Проверка_ТелеграмУстановкаВебхук(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_УдалитьWebhook(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Результат = OPI_Telegram.УдалитьWebhook(Токен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьWebhook", "Telegram"); + + Проверка_ТелеграмУдалениеВебхук(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьТекстовоеСообщение(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Текст = ПараметрыФункции["String"]; + + Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение", "Telegram"); + + Проверка_ТелеграмСообщение(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDКанала, Текст); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (канал)"); + + Проверка_ТелеграмСообщение(Результат, Текст); + + IDСообщения = OPI_Инструменты.ЧислоВСтроку(Результат["result"]["message_id"]); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_ChannelMessageID", IDСообщения); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьКартинку(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Текст = ПараметрыФункции["String"]; + Картинка = ПараметрыФункции["Picture"]; + + КартинкаПуть = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка, КартинкаПуть); + + КартинкаДД = Новый ДвоичныеДанные(КартинкаПуть); + + Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDЧата, Текст, Картинка); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку", "Telegram"); + + Проверка_ТелеграмКартинка(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаПуть); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (Путь)"); + + Проверка_ТелеграмКартинка(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаДД); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (ДД)"); + + Проверка_ТелеграмКартинка(Результат, Текст); + + УдалитьФайлы(КартинкаПуть); + + IDФайла = Результат["result"]["photo"][0]["file_id"]; + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла); + + ПараметрыФункции.Вставить("Telegram_FileID", IDФайла); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьВидео(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Текст = ПараметрыФункции["String"]; + Видео = ПараметрыФункции["Video"]; + + ВидеоПуть = ПолучитьИмяВременногоФайла("mp4"); + КопироватьФайл(Видео, ВидеоПуть); + + ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть); + + Результат = OPI_Telegram.ОтправитьВидео(Токен, IDЧата, Текст, Видео); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео", "Telegram"); + + Проверка_ТелеграмВидео(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоПуть); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (Путь)"); + + Проверка_ТелеграмВидео(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоДД); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (ДД)"); + + Проверка_ТелеграмВидео(Результат, Текст); + + УдалитьФайлы(ВидеоПуть); + + IDФайла = Результат["result"]["video"]["file_id"]; + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла); + + ПараметрыФункции.Вставить("Telegram_FileID", IDФайла); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьАудио(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Текст = ПараметрыФункции["String"]; + Аудио = ПараметрыФункции["Audio"]; + + АудиоПуть = ПолучитьИмяВременногоФайла("mp3"); + КопироватьФайл(Аудио, АудиоПуть); + + АудиоДД = Новый ДвоичныеДанные(АудиоПуть); + + Результат = OPI_Telegram.ОтправитьАудио(Токен, IDЧата, Текст, Аудио); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио", "Telegram"); + + Проверка_ТелеграмАудио(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоПуть); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (Путь)"); + + Проверка_ТелеграмАудио(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоДД); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (ДД)"); + + Проверка_ТелеграмАудио(Результат, Текст); + + УдалитьФайлы(АудиоПуть); + + IDФайла = Результат["result"]["audio"]["file_id"]; + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла); + + ПараметрыФункции.Вставить("Telegram_FileID", IDФайла); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьДокумент(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Текст = ПараметрыФункции["String"]; + Документ = ПараметрыФункции["Document"]; + + ДокументПуть = ПолучитьИмяВременногоФайла("docx"); + КопироватьФайл(Документ, ДокументПуть); + + ДокументДД = Новый ДвоичныеДанные(ДокументПуть); + + Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDЧата, Текст, Документ); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент", "Telegram"); + + Проверка_ТелеграмДокумент(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументПуть); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (Путь)"); + + Проверка_ТелеграмДокумент(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументДД); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (ДД)"); + + Проверка_ТелеграмДокумент(Результат, Текст); + + УдалитьФайлы(ДокументПуть); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьГифку(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Текст = ПараметрыФункции["String"]; + Гифка = ПараметрыФункции["GIF"]; + + ГифкаПуть = ПолучитьИмяВременногоФайла("gif"); + КопироватьФайл(Гифка, ГифкаПуть); + + ГифкаДД = Новый ДвоичныеДанные(ГифкаПуть); + + Результат = OPI_Telegram.ОтправитьГифку(Токен, IDЧата, Текст, Гифка); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку", "Telegram"); + + Проверка_ТелеграмГифка(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаПуть); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (Путь)"); + + Проверка_ТелеграмГифка(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаДД); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (ДД)"); + + Проверка_ТелеграмГифка(Результат, Текст); + + УдалитьФайлы(ГифкаПуть); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьМеидагруппу(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + Текст = ПараметрыФункции["String"]; + Картинка = ПараметрыФункции["Picture"]; + Видео = ПараметрыФункции["Video"]; + + КартинкаПуть = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка, КартинкаПуть); + + ВидеоПуть = ПолучитьИмяВременногоФайла("mp4"); + КопироватьФайл(Видео, ВидеоПуть); + + ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть); + + Медиагруппа = Новый Соответствие; + Медиагруппа.Вставить(КартинкаПуть, "photo"); + Медиагруппа.Вставить(ВидеоДД , "video"); + + Результат = OPI_Telegram.ОтправитьМедиагруппу(Токен, IDЧата, Текст, Медиагруппа); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМедиагруппу", "Telegram"); + + Проверка_ТелеграмМедиагруппа(Результат); + + УдалитьФайлы(ВидеоПуть); + УдалитьФайлы(КартинкаПуть); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьМестоположение(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Ширина = ПараметрыФункции["Lat"]; + Долгота = ПараметрыФункции["Long"]; + + Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDЧата, Ширина, Долгота); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение", "Telegram"); + + Проверка_ТелеграмМестоположение(Результат); // SKIP + + Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDКанала, Ширина, Долгота); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение (канал)"); + + Проверка_ТелеграмМестоположение(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьКонтакт(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Имя = ПараметрыФункции["Name"]; + Фамилия = ПараметрыФункции["Surname"]; + Телефон = ПараметрыФункции["Phone"]; + + Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDЧата , Имя, Фамилия, Телефон); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт", "Telegram"); + + Проверка_ТелеграмКонтакт(Результат, Имя); // SKIP + OPI_Инструменты.Пауза(20); // SKIP + + Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDКанала, Имя, Фамилия, Телефон); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт (канал)"); + + Проверка_ТелеграмКонтакт(Результат, Имя); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьОпрос(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Вопрос = "Какой ваш любимый цвет?"; + + МассивОтветов = Новый Массив; + МассивОтветов.Добавить("Красный"); + МассивОтветов.Добавить("Желтый"); + МассивОтветов.Добавить("Зеленый"); + МассивОтветов.Добавить("Синий"); + + Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDЧата , Вопрос, МассивОтветов, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос", "Telegram"); + + Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP + + Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, МассивОтветов, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (канал)"); + + Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP + + // END + + СтрочныйМассив = "['Красный', 'Желтый','Зеленый' ,'Синий']"; + + Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, СтрочныйМассив, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (строчный массив)"); + + Проверка_ТелеграмОпрос(Результат, Вопрос); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_СкачатьФайл(ПараметрыФункции) + + IDФайла = ПараметрыФункции["Telegram_FileID"]; + Токен = ПараметрыФункции["Telegram_Token"]; + + Результат = OPI_Telegram.СкачатьФайл(Токен, IDФайла); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Telegram"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные"); + +КонецПроцедуры + +Процедура Telegram_ПереслатьСообщение(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"]; + + Результат = OPI_Telegram.ПереслатьСообщение(Токен, IDСообщения, IDКанала, IDЧата); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереслатьСообщение", "Telegram"); + + Проверка_ТелеграмПереслать(Результат, IDСообщения); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_Бан(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDПользователя = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + + Результат = OPI_Telegram.Бан(Токен, IDКанала, IDПользователя); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Бан", "Telegram"); + + Проверка_ТелеграмБан(Результат); + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_Разбан(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDПользователя = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + + Результат = OPI_Telegram.Разбан(Токен, IDКанала, IDПользователя); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Разбан", "Telegram"); + + Проверка_ТелеграмБан(Результат); + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_СоздатьСсылкуПриглашение(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Сутки = 86400; + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + + Заголовок = "Ссылка " + Строка(ТекущаяДата); + Истечение = ТекущаяДата + Сутки; + UnixИстечение = OPI_Инструменты.UNIXTime(Истечение); + + Результат = OPI_Telegram.СоздатьСсылкуПриглашение(Токен, IDКанала, Заголовок, Истечение, 200); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПриглашение", "Telegram"); + + Проверка_ТелеграмПриглашение(Результат, Заголовок, UnixИстечение); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ЗакрепитьСообщение(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"]; + + Результат = OPI_Telegram.ЗакрепитьСообщение(Токен, IDКанала, IDСообщения); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрепитьСообщение", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОткрепитьСообщение(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"]; + + Результат = OPI_Telegram.ОткрепитьСообщение(Токен, IDКанала, IDСообщения); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрепитьСообщение", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ПолучитьЧислоУчастников(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + + Результат = OPI_Telegram.ПолучитьЧислоУчастников(Токен, IDКанала); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЧислоУчастников", "Telegram"); + + Проверка_ТелеграмЧисло(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ПолучитьСписокАватаровФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Результат = OPI_Telegram.ПолучитьСписокИконокАватаров(Токен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокИконокАватаров", "Telegram"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_СоздатьТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + Иконка = "5357419403325481346"; + Имя = "Тестовая тема " + Строка(Новый УникальныйИдентификатор); + + Результат = OPI_Telegram.СоздатьТемуФорума(Токен, Чат, Имя, Иконка); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТемуФорума", "Telegram"); + + Тема = Результат["result"]["message_thread_id"]; + + ПараметрыФункции.Вставить("Telegram_TopicID", Тема); + OPI_Инструменты.ДобавитьПоле("Telegram_TopicID", Тема, "Строка", ПараметрыФункции); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_TopicID", ПараметрыФункции["Telegram_TopicID"]); + + Проверка_ТелеграмСозданиеТемы(Результат, Имя, Иконка); + + ЧатТема = Чат + "*" + Тема; + Текст = ПараметрыФункции["String"]; + Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, ЧатТема, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (форум)"); + + Проверка_ТелеграмСообщение(Результат, Текст); + +КонецПроцедуры + +Процедура Telegram_ИзменитьТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + Тема = ПараметрыФункции["Telegram_TopicID"]; + НовоеИмя = "Новый тестовый заголовок"; + НовяИконка = "5310132165583840589"; + + Результат = OPI_Telegram.ИзменитьТемуФорума(Токен, Чат, Тема, НовоеИмя, НовяИконка); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТемуФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ЗакрытьТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + Тема = ПараметрыФункции["Telegram_TopicID"]; + + OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // SKIP + + Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат); // Закрывает главную тему + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума (главная)"); + + Проверка_ТелеграмИстина(Результат); // SKIP + + Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат, Тема); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(25); + +КонецПроцедуры + +Процедура Telegram_ОткрытьТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + Тема = ПараметрыФункции["Telegram_TopicID"]; + + Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // Открывает главную тему + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума (главная)"); + + Проверка_ТелеграмИстина(Результат); // SKIP + + Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат, Тема); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(25); + +КонецПроцедуры + +Процедура Telegram_УдалитьТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + Тема = ПараметрыФункции["Telegram_TopicID"]; + + Результат = OPI_Telegram.УдалитьТемуФорума(Токен, Чат, Тема); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТемуФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(25); + +КонецПроцедуры + +Процедура Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + Тема = ПараметрыФункции["Telegram_TopicID"]; + + Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы (главная)"); + + Проверка_ТелеграмИстина(Результат); // SKIP + + Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат, Тема); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_СкрытьГлавнуюТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + + Результат = OPI_Telegram.СкрытьГлавнуюТемуФорума(Токен, Чат); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкрытьГлавнуюТемуФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + + Результат = OPI_Telegram.ПоказатьГлавнуюТемуФорума(Токен, Чат); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоказатьГлавнуюТемуФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыФункции) + + Заголовок = "Новое имя главной темы " + Строка(Новый УникальныйИдентификатор); + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + + Результат = OPI_Telegram.ИзменитьИмяГлавнойТемыФорума(Токен, Чат, Заголовок); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьИмяГлавнойТемыФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +#КонецОбласти + +#Область VK + +Процедура VK_СоздатьСсылкуПолученияТокена(ПараметрыФункции) + + Приложение = ПараметрыФункции["VK_AppID"]; + Результат = OPI_VK.СоздатьСсылкуПолученияТокена(Приложение); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПолученияТокена", "VK"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_СоздатьПост(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + Текст = "Пост из автотеста"; + URL = "https://github.com/Bayselonarrend/OpenIntegrations"; + + Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные + Картинка2 = ПараметрыФункции["Picture2"]; // URL, Путь или Двоичные данные + + ИВФ = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка2, ИВФ); + + МассивКартинок = Новый Массив; + МассивКартинок.Добавить(Картинка); + МассивКартинок.Добавить(ИВФ); + + Результат = OPI_VK.СоздатьПост(Текст, МассивКартинок, Истина, URL, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост", "VK"); + + Проверка_ВКПост(Результат); // SKIP + ИДПоста = Результат["response"]["post_id"]; // SKIP + Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); // SKIP + + Результат = OPI_VK.СоздатьПост(Текст, Картинка, Ложь , , Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (одна картинка)"); + + Проверка_ВКПост(Результат); + + ИДПоста = Результат["response"]["post_id"]; + Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); + + OPI_Инструменты.Пауза(5); + + Результат = OPI_VK.СоздатьПост(Текст, ИВФ , Истина, URL, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (один путь)"); + + Проверка_ВКПост(Результат); + + ИДПоста = Результат["response"]["post_id"]; + OPI_Инструменты.ДобавитьПоле("VK_PostID", ИДПоста, "Строка", ПараметрыФункции); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PostID", ПараметрыФункции["VK_PostID"]); + + УдалитьФайлы(ИВФ); + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_УдалитьПост(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ИДПоста = ПараметрыФункции["VK_PostID"]; + + Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПост", "VK"); + + Проверка_ВКИстина(Результат); + +КонецПроцедуры + +Процедура VK_СоздатьСоставнойПост(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + Текст = "Пост из автотеста"; + URL = "https://github.com/Bayselonarrend/OpenIntegrations"; + + Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные + Видео = ПараметрыФункции["Video"]; // URL, Путь или Двоичные данные + + ИВФ = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка, ИВФ); + + ЗагрузкаКартинки = OPI_VK.ЗагрузитьФотоНаСервер(ИВФ, Параметры)["response"][0]; + ЗагрузкаВидео = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, "Новое видео", , , Параметры); + + ВладелецКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["owner_id"]); + ВладелецВидео = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["owner_id"]); + + IDКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["id"]); + IDВидео = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["video_id"]); + + МассивВложений = Новый Массив; + МассивВложений.Добавить("photo" + ВладелецКартинки + "_" + IDКартинки); + МассивВложений.Добавить("video" + ВладелецВидео + "_" + IDВидео); + + Результат = OPI_VK.СоздатьСоставнойПост(Текст, МассивВложений, Ложь, URL, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСоставнойПост", "VK"); + + Проверка_ВКПост(Результат); + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_СоздатьОпрос() + + Параметры = ПолучитьПараметрыВК(); + Вопрос = "Какой ваш любимый цвет?"; + + МассивВариантов = Новый Массив; + МассивВариантов.Добавить("Красный"); + МассивВариантов.Добавить("Желтый"); + МассивВариантов.Добавить("Зеленый"); + + Результат = OPI_VK.СоздатьОпрос(Вопрос, МассивВариантов, , Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОпрос", "VK"); + + Проверка_ВКПост(Результат); + + ИДПоста = Результат["response"]["post_id"]; + OPI_VK.УдалитьПост(ИДПоста, Параметры); + + OPI_Инструменты.Пауза(10); + +КонецПроцедуры + +Процедура VK_СоздатьАльбом(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + Имя = "Альбом из автотеста"; + Описание = "Новый альбом из автотеста"; + + Результат = OPI_VK.СоздатьАльбом(Имя, Описание, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьАльбом", "VK"); + + Проверка_ВКАльбом(Результат, Описание); + + ИДАльбома = Результат["response"]["id"]; + ПараметрыФункции.Вставить("VK_AlbumID", ИДАльбома); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_AlbumID", ИДАльбома); + +КонецПроцедуры + +Процедура VK_СохранитьКартинкуВАльбом(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ОписаниеКартинки = "Картинка автотест"; + ИДАльбома = ПараметрыФункции["VK_AlbumID"]; + + Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные + ИВФ = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка, ИВФ); + + Картинка = Новый ДвоичныеДанные(ИВФ); + + Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, Картинка, ОписаниеКартинки, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом", "VK"); + + Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP + + ИДКартинки = Результат["response"][0]["id"]; // SKIP + Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры); // SKIP + + Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, ИВФ, ОписаниеКартинки, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом (путь)"); + + Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP + + ИДКартинки = Результат["response"][0]["id"]; + ПараметрыФункции.Вставить("VK_PictureID", ИДКартинки); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PictureID", ИДКартинки); + + УдалитьФайлы(ИВФ); + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_УдалитьКартинку(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ИДКартинки = ПараметрыФункции["VK_PictureID"]; + + Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКартинку", "VK"); + + Проверка_ВКИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_УдалитьАльбом(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ИДАльбома = ПараметрыФункции["VK_AlbumID"]; + + Результат = OPI_VK.УдалитьАльбом(ИДАльбома, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьАльбом", "VK"); + + Проверка_ВКИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_СоздатьИсторию(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + URL = "https://github.com/Bayselonarrend/OpenIntegrations"; + + Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные + ИВФ = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка, ИВФ); + Картинка = Новый ДвоичныеДанные(ИВФ); + + Результат = OPI_VK.СоздатьИсторию(Картинка , URL, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию", "VK"); + + Проверка_ВКИстория(Результат); // SKIP + + Результат = OPI_VK.СоздатьИсторию(ИВФ, , Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию (путь)"); + + Проверка_ВКИстория(Результат); + + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_СоздатьОбсуждение(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + Название = "Обсуждаем: какой цвет лучше?"; + Сообщение = "Красный, желтый, синий или какой-то другой?"; + + Результат = OPI_VK.СоздатьОбсуждение(Название, Сообщение, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОбсуждение", "VK"); + + Проверка_ВКОбсуждение(Результат); + + ИДОбсуждения = Результат["response"]; + ПараметрыФункции.Вставить("VK_ConvID", ИДОбсуждения); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_ConvID", ИДОбсуждения); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_ЗакрытьОбсуждение(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ИДОбсуждения = ПараметрыФункции["VK_ConvID"]; + Результат = OPI_VK.ЗакрытьОбсуждение(ИДОбсуждения, Ложь, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьОбсуждение", "VK"); + + Проверка_ВКИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_ОткрытьОбсуждение(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ИДОбсуждения = ПараметрыФункции["VK_ConvID"]; + Результат = OPI_VK.ОткрытьОбсуждение(ИДОбсуждения, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьОбсуждение", "VK"); + + Проверка_ВКИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_НаписатьВОбсуждение(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ИДОбсуждения = ПараметрыФункции["VK_ConvID"]; + Сообщение = "Мне больше нравится желтый"; + + Результат = OPI_VK.НаписатьВОбсуждение(ИДОбсуждения, Сообщение, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьВОбсуждение", "VK"); + + Проверка_ВКОбсуждение(Результат); + +КонецПроцедуры + +#КонецОбласти + +#Область Dropbox + +Процедура Dropbox_ПолучитьСсылкуАвторизации(ПараметрыФункции) + + КлючПриложения = ПараметрыФункции["Dropbox_Appkey"]; + Результат = OPI_Dropbox.ПолучитьСсылкуАвторизации(КлючПриложения); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуАвторизации", "Dropbox"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка"); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьТокен(ПараметрыФункции) + + КлючПриложения = ПараметрыФункции["Dropbox_Appkey"]; + СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"]; + Код = ПараметрыФункции["Dropbox_Code"]; + + Результат = OPI_Dropbox.ПолучитьТокен(КлючПриложения, СекретПриложения, Код); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТокен"); + + Токен = Результат["access_token"]; + Рефреш = Результат["refresh_token"]; + + Если ЗначениеЗаполнено(Токен) Тогда + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен); + КонецЕсли; + + Если ЗначениеЗаполнено(Рефреш) Тогда + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Refresh", Рефреш); + КонецЕсли; + +КонецПроцедуры + +Процедура Dropbox_ОбновитьТокен(ПараметрыФункции) + + КлючПриложения = ПараметрыФункции["Dropbox_Appkey"]; + СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"]; + РефрешТокен = ПараметрыФункции["Dropbox_Refresh"]; + + Результат = OPI_Dropbox.ОбновитьТокен(КлючПриложения, СекретПриложения, РефрешТокен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьТокен"); + + Токен = Результат["access_token"]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Токен).Заполнено(); + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыФункции) + + Путь = "/New/pic.png"; + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.ПолучитьИнформациюОбОбъекте(Токен, Путь, Истина); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте", "Dropbox"); + + Проверка_ДропБоксФайл(Результат, Путь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьПревью(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New/mydoc.docx"; + + Результат = OPI_Dropbox.ПолучитьПревью(Токен, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПревью", "Dropbox"); + + Проверка_ДвоичныеДанные(Результат, 190834); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ЗагрузитьФайл(ПараметрыФункции) + + Путь = "/New/pic.png"; + Токен = ПараметрыФункции["Dropbox_Token"]; + Картинка = ПараметрыФункции["Picture"]; + + КартинкаПуть = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка, КартинкаПуть); + + Результат = OPI_Dropbox.ЗагрузитьФайл(Токен, КартинкаПуть, Путь, Истина); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл", "Dropbox"); + + Проверка_ДропБоксФайл(Результат, Путь); + УдалитьФайлы(КартинкаПуть); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ЗагрузитьФайлПоURL(ПараметрыФункции) + + Путь = "/New/url_doc.docx"; + Токен = ПараметрыФункции["Dropbox_Token"]; + URL = ПараметрыФункции["Document"]; + + Результат = OPI_Dropbox.ЗагрузитьФайлПоURL(Токен, URL, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайлПоURL", "Dropbox"); + + Проверка_ДропБоксРабота(Результат); + + Работа = Результат["async_job_id"]; + + ПараметрыФункции.Вставить("Dropbox_Job", Работа); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Job", Работа); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + ИДРаботы = ПараметрыФункции["Dropbox_Job"]; + Статус = "in_progress"; + + Пока Статус = "in_progress" Цикл + + Результат = OPI_Dropbox.ПолучитьСтатусЗагрузкиПоURL(Токен, ИДРаботы); + Статус = Результат[".tag"]; + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатусЗагрузкиПоURL", "Dropbox"); + + КонецЦикла; + + // END + + Проверка_ДропБоксСтатус(Результат); + + Путь = "/New/url_doc.docx"; + Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь); + + Проверка_ДропБоксМетаданные(Результат, Путь); + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_УдалитьОбъект(ПараметрыФункции) + + Путь = "/New/pic.png"; + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект", "Dropbox"); + + Проверка_ДропБоксМетаданные(Результат, Путь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_КопироватьОбъект(ПараметрыФункции) + + Оригинал = "/New/pic.png"; + Копия = "/New/pic_copy.png"; + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.КопироватьОбъект(Токен, Оригинал, Копия); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьОбъект", "Dropbox"); + + Проверка_ДропБоксМетаданные(Результат, Копия); + + Результат = OPI_Dropbox.УдалитьОбъект(Токен, Копия); + Проверка_ДропБоксМетаданные(Результат, Копия); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПереместитьОбъект(ПараметрыФункции) + + ОригиналныйПуть = "/New/pic.png"; + ЦелевойПуть = "/pic.png"; + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ОригиналныйПуть, ЦелевойПуть); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Dropbox_ПереместитьОбъект", "Dropbox"); + + Проверка_ДропБоксМетаданные(Результат, ЦелевойПуть); + + Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ЦелевойПуть, ОригиналныйПуть); + Проверка_ДропБоксМетаданные(Результат, ОригиналныйПуть); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_СоздатьПапку(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/Новый каталог"; + + Результат = OPI_Dropbox.СоздатьПапку(Токен, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку", "Dropbox"); + + Проверка_ДропБоксМетаданные(Результат, Путь); + + Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь); + Проверка_ДропБоксМетаданные(Результат, Путь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_СкачатьФайл(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New/pic.png"; + + Результат = OPI_Dropbox.СкачатьФайл(Токен, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Dropbox"); + + Проверка_ДвоичныеДанные(Результат, 2114023); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_СкачатьПапку(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New"; + + Результат = OPI_Dropbox.СкачатьПапку(Токен, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьПапку", "Dropbox"); + + Проверка_ДвоичныеДанные(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьСписокФайловПапки(ПараметрыФункции) + + Путь = "/New"; + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.ПолучитьСписокФайловПапки(Токен, Путь, Истина); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайловПапки", "Dropbox"); + + Проверка_ДропБоксМассив(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New/pic.png"; + + Результат = OPI_Dropbox.ПолучитьСписокВерсийОбъекта(Токен, Путь, 1); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВерсийОбъекта", "Dropbox"); + + Проверка_ДропБоксМассив(Результат, 1); + + Ревизия = Результат["entries"][0]["rev"]; + + ПараметрыФункции.Вставить("Dropbox_FileRevision", Ревизия); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_FileRevision", Ревизия); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ВосстановитьОбъектКВерсии(ПараметрыФункции) + + Версия = ПараметрыФункции["Dropbox_FileRevision"]; + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New/pic.png"; + + Результат = OPI_Dropbox.ВосстановитьОбъектКВерсии(Токен, Путь, Версия); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВосстановитьОбъектКВерсии", "Dropbox"); + + Проверка_ДропБоксФайл(Результат, Путь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолчитьСписокТегов(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + + МассивПутей = Новый Массив; + МассивПутей.Добавить("/New/Dogs.mp3"); + МассивПутей.Добавить("/New/mydoc.docx"); + + Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, МассивПутей); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов", "Dropbox"); + + Проверка_ДропБоксТеги(Результат, МассивПутей.Количество()); + + Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, "/New/mydoc.docx"); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов (одиночный)"); + + Проверка_ДропБоксТеги(Результат, 1); + + ЕстьТег = Ложь; + + Для Каждого Тег Из Результат["paths_to_tags"][0]["tags"] Цикл + Если Тег["tag_text"] = "важное" Тогда + ЕстьТег = Истина; + КонецЕсли; + КонецЦикла; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЕстьТег).Равно(Истина); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ДобавитьТег(ПараметрыФункции) + + Тег = "Важное"; + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New/mydoc.docx"; + + Результат = OPI_Dropbox.ДобавитьТег(Токен, Путь, Тег); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТег", "Dropbox"); + + Проверка_Пусто(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_УдалитьТег(ПараметрыФункции) + + Тег = "Важное"; + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New/mydoc.docx"; + + Результат = OPI_Dropbox.УдалитьТег(Токен, Путь, Тег); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТег", "Dropbox"); + + Проверка_Пусто(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте", "Dropbox"); + + Проверка_ДропбоксАккаунт(Результат); + + Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен, Результат["account_id"]); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте (сторонний)"); + + Проверка_ДропбоксАккаунт(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.ПолучитьДанныеИспользованияПространства(Токен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеИспользованияПространства", "Dropbox"); + + Проверка_ДропбоксПространство(Результат); + +КонецПроцедуры + +Процедура Dropbox_ДобавитьПользователейКФайлу(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Почта = ПараметрыФункции["Dropbox_OtherUser"]; + Файл = ПараметрыФункции["Dropbox_FileID"]; + + Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почта, Ложь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox"); + + Проверка_ДропбоксУчастник(Результат, Почта, Ложь); + + Почты = Новый Массив; + Почты.Добавить(Почта); + + Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почты, Истина); + + Проверка_ДропбоксУчастник(Результат, Почта, Истина); + +КонецПроцедуры + +Процедура Dropbox_ОпубликоватьПапку(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New"; + + Результат = OPI_Dropbox.ОпубликоватьПапку(Токен, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОпубликоватьПапку", "Dropbox"); + + Проверка_ДропБоксПубличнаяПапка(Результат); + + IDПапки = Результат["shared_folder_id"]; + + ПараметрыФункции.Вставить("Dropbox_SharedFolder", IDПапки); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_SharedFolder", IDПапки); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ОтменитьПубликациюПапки(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Папка = ПараметрыФункции["Dropbox_SharedFolder"]; + + Результат = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка); + ТекущийСтатус = "in_progress"; + IDРаботы = Результат["async_job_id"]; + + Пока ТекущийСтатус = "in_progress" Цикл + Результат = OPI_Dropbox.ПолучитьСтатусАсинхронногоИзменения(Токен, IDРаботы); + ТекущийСтатус = Результат[".tag"]; + OPI_Инструменты.Пауза(3); + КонецЦикла; + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюПапки", "Dropbox"); + + Проверка_ДропБоксСтатус(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ДобавитьПользователейКПапке(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Почта = ПараметрыФункции["Dropbox_OtherUser"]; + Папка = ПараметрыФункции["Dropbox_SharedFolder"]; // shared_folder_id + + Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почта, Ложь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox"); + + Проверка_Пусто(Результат); + + Почты = Новый Массив; + Почты.Добавить(Почта); + + Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почты, Истина); + + Проверка_Пусто(Результат); + +КонецПроцедуры + +Процедура Dropbox_ОтменитьПубликациюФайла(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Файл = ПараметрыФункции["Dropbox_FileID"]; + + Результат = OPI_Dropbox.ОтменитьПубликациюФайла(Токен, Файл); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюФайла", "Dropbox"); + + Проверка_Пусто(Результат); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#КонецОбласти diff --git a/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os b/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os index 4f09822b81..5356f23c1e 100644 --- a/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os +++ b/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os @@ -1,470 +1,470 @@ -// Расположение OS: ./OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os - -// 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:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:UsingHardcodePath-off -// BSLLS:Typo-off -// BSLLS:DeprecatedMessage-off -// BSLLS:UsingServiceTag-off -// BSLLS:ExecuteExternalCodeInCommonModule-off -// BSLLS:DuplicateStringLiteral-off - -//@skip-check use-non-recommended-method - -// Раскомментировать, если выполняется OneScript -#Использовать "./internal" -#Использовать asserts - -#Область СлужебныйПрограммныйИнтерфейс - -Функция ПолучитьСоответствиеРазделовТестирования() Экспорт - - СтандартныеЗависимости = "[Decode, Build]"; - ЗависимостиГугл = "Testing-GoogleWorkspace"; - - Разделы = Новый Структура; - Разделы.Вставить("Telegram" , СтандартныеЗависимости); - Разделы.Вставить("VK" , СтандартныеЗависимости); - Разделы.Вставить("Viber" , СтандартныеЗависимости); - Разделы.Вставить("Twitter" , СтандартныеЗависимости); - Разделы.Вставить("YandexDisk" , СтандартныеЗависимости); - Разделы.Вставить("GoogleWorkspace", СтандартныеЗависимости); - Разделы.Вставить("GoogleCalendar" , ЗависимостиГугл); - Разделы.Вставить("GoogleDrive" , ЗависимостиГугл); - Разделы.Вставить("GoogleSheets" , ЗависимостиГугл); - Разделы.Вставить("Notion" , СтандартныеЗависимости); - Разделы.Вставить("Slack" , СтандартныеЗависимости); - Разделы.Вставить("Airtable" , СтандартныеЗависимости); - Разделы.Вставить("Dropbox" , СтандартныеЗависимости); - - Возврат Разделы; - -КонецФункции - -Функция ПолучитьТаблицуТестов() Экспорт - - Телеграм = "Telegram"; - ВКонтакте = "VK"; - ЯДиск = "YandexDisk"; - Календарь = "GoogleCalendar"; - Твиттер = "Twitter"; - Вайбер = "Viber"; - Драйв = "GoogleDrive"; - ВСпейс = "GoogleWorkspace"; - Ноушн = "Notion"; - Слак = "Slack"; - Таблицы = "GoogleSheets"; - АирТ = "Airtable"; - ДропБокс = "Dropbox"; - - ТаблицаТестов = Новый ТаблицаЗначений; - ТаблицаТестов.Колонки.Добавить("Метод"); - ТаблицаТестов.Колонки.Добавить("Синоним"); - ТаблицаТестов.Колонки.Добавить("Раздел"); - - НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьИнформациюБота" , "Получить информацию бота" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьОбновления" , "Получить обновления" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_УстановитьWebhook" , "Установить Webhook" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКартинку" , "Отправить картинку" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьВидео" , "Отправить видео" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьАудио" , "Отправить аудио" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьДокумент" , "Отправить документ" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьГифку" , "Отправить гифку" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМедиагруппу" , "Отправить медиагруппу" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМестоположение" , "Отправить местоположение" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКонтакт" , "Отправить контакт" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьОпрос" , "Отправить опрос" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ПереслатьСообщение" , "Переслать сообщение" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_БанРазбан" , "Бан/Разбан" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_СоздатьСсылкуПриглашение" , "Создать ссылку-приглашение" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ЗакрепитьОткрепитьСообщение" , "Закрепить/Открепить сообщение" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьЧислоУчастников" , "Получить число участников" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьСписокАватаровФорума", "Получить список аватаров форума", Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_СоздатьУдалитьТемуФорума" , "Создать/Удалить тему форума" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_ИзменитьИмяГлавнойТемы" , "Изменить имя главной темы" , Телеграм); - НовыйТест(ТаблицаТестов, "Телеграм_СкрытьПоказатьГлавнуюТему" , "Скрыть/Показать главную тему" , Телеграм); - - НовыйТест(ТаблицаТестов, "ВК_СоздатьСсылкуТокена" , "Создать ссылку получения токена", ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_СоздатьУдалитьПост" , "Создать/Удалить пост" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_СоздатьСоставнойПост" , "Создать/Удалить составной пост" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_СоздатьОпрос" , "Создать опрос" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_СохранитьУдалитьКартинку" , "Добавить/Удалить картинку" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_СоздатьИсторию" , "Создать историю" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_МетодыОбсуждений" , "Действия с обсуждениями" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_ЛайкРепостКоммент" , "Лайк/Репост/Комментарий" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистику" , "Получить статистику" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистикуПостов" , "Получить статистику постов" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_СоздатьРекламнуюКампанию" , "Создать рекламную кампанию" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_ОтправитьСообщение" , "Отправить сообщение" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_ПолучитьКатегорииТоваров" , "Получить категории товаров" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварПодборку" , "Создать товар и подборку" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварСоСвойствами" , "Создать товар со свойствами" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокТоваров" , "Получить список товаров" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокПодборок" , "Получить список подборок" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокСвойств" , "Получить список свойств" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокЗаказов" , "Получить список заказов" , ВКонтакте); - НовыйТест(ТаблицаТестов, "ВК_ЗагрузитьВидео" , "Загрузить видео" , ВКонтакте); - - НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьИнформациюОДиске" , "Получить информацию о диске" , ЯДиск); - НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьПапку" , "Создать папку" , ЯДиск); - НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект", "Загрузить по URL и получить" , ЯДиск); - НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , ЯДиск); - НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьКопиюОбъекта" , "Создать копию объекта" , ЯДиск); - НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСсылкуНаСкачивание" , "Получить ссылку на скачивание" , ЯДиск); - НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокФайлов" , "Получить список файлов" , ЯДиск); - НовыйТест(ТаблицаТестов, "ЯДиск_ПереместитьОбъект" , "Переместить объект" , ЯДиск); - НовыйТест(ТаблицаТестов, "ЯДиск_ДействияПубличныхОбъектов" , "Действия с публичными объектами", ЯДиск); - НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокОпубликованных" , "Получить список опубликованных" , ЯДиск); - - НовыйТест(ТаблицаТестов, "ГВ_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , ВСпейс); - НовыйТест(ТаблицаТестов, "ГВ_ПолучитьТокен" , "Получить токен" , ВСпейс); - НовыйТест(ТаблицаТестов, "ГВ_ОбновитьТокен" , "Обновить токен" , ВСпейс); - - НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокКалендарей" , "Получить список календарей" , Календарь); - НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьКалендарь" , "Создать/Удалить календарь" , Календарь); - НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьСобытие" , "Создать/Удалить событие" , Календарь); - НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокСобытий" , "Получить список событий" , Календарь); - - НовыйТест(ТаблицаТестов, "ГД_ПолучитьСписокКаталогов" , "Получить список каталогов" , Драйв); - НовыйТест(ТаблицаТестов, "ГД_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить Файл" , Драйв); - НовыйТест(ТаблицаТестов, "ГД_СоздатьУдалитьКомментарий" , "Создать/Удалить кооментарий" , Драйв); - НовыйТест(ТаблицаТестов, "ГД_СоздатьКаталог" , "Создать/Удалить каталог" , Драйв); - - НовыйТест(ТаблицаТестов, "ГТ_СоздатьТаблицу" , "Создать таблицу" , Таблицы); - НовыйТест(ТаблицаТестов, "ГТ_ПолучитьТаблицу" , "Получить таблицу" , Таблицы); - НовыйТест(ТаблицаТестов, "ГТ_ЗаполнитьОчиститьЯчейки" , "Заполнить/Очистить ячейки" , Таблицы); - - НовыйТест(ТаблицаТестов, "Твиттер_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , Твиттер); - НовыйТест(ТаблицаТестов, "Твиттер_ОбновитьТокен" , "Обновить токен" , Твиттер); - НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТекстовыйТвит" , "Текстовый твит" , Твиттер); - НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСКартинкой" , "Твит с картинкой" , Твиттер); - НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСВидео" , "Твит с видео" , Твиттер); - НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСГиф" , "Твит с гиф" , Твиттер); - НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСОпросом" , "Твит с опросом" , Твиттер); - - НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьИнформациюОКанале" , "Получить информацию канала" , Вайбер); - НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Вайбер); - НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьОнлайнПользователей" , "Получить онлайн пользователей" , Вайбер); - НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Вайбер); - НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКартинку" , "Отправить картинку" , Вайбер); - НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьФайл" , "Отправить файл" , Вайбер); - НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКонтакт" , "Отправить контакт" , Вайбер); - НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьЛокацию" , "Отправить локацию" , Вайбер); - НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьСсылку" , "Отправить ссылку" , Вайбер); - - НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницу" , "Создать страницу" , Ноушн); - НовыйТест(ТаблицаТестов, "Ноушн_СоздатьИзменитьБазу" , "Создать/Изменить базу" , Ноушн); - НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОСтранице" , "Получить информацию о странице" , Ноушн); - НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОБазе" , "Получить информацию о базе" , Ноушн); - НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницуВБазу" , "Создать страницу в базу" , Ноушн); - НовыйТест(ТаблицаТестов, "Ноушн_ИзменитьСвойстваСтраницы" , "Изменить свойства страницы" , Ноушн); - НовыйТест(ТаблицаТестов, "Ноушн_СоздатьУдалитьБлок" , "Создать/Удалить блок" , Ноушн); - НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьПользователей" , "Получить пользователей" , Ноушн); - НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Ноушн); - - НовыйТест(ТаблицаТестов, "Слак_ПолучитьИнформациюОБоте" , "Получить информацию о боте" , Слак); - НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокПользователей" , "Получить список пользователей" , Слак); - НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокОбластей" , "Получить список областей" , Слак); - НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьСообщение" , "Отправить/Удалить сообщение" , Слак); - НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьЭфемерное" , "Отправить/Удалить эфемерное" , Слак); - НовыйТест(ТаблицаТестов, "Слак_ПолучитьОтложенныеСообщения" , "Получить отложенные сообщения" , Слак); - НовыйТест(ТаблицаТестов, "Слак_СоздатьАрхивироватьКанал" , "Создать/Архивировать канал" , Слак); - НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокКаналов" , "Получить список каналов" , Слак); - НовыйТест(ТаблицаТестов, "Слак_ОткрытьЗакрытьДиалог" , "Открыть/Закрыть диалог" , Слак); - НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокФайлов" , "Получить список файлов" , Слак); - НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , Слак); - НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокВФ" , "Получить список внеш. файлов" , Слак); - НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьВФ" , "Загрузить/Удалить внеш. файл" , Слак); - - НовыйТест(ТаблицаТестов, "АТ_СоздатьБазу" , "Создать/Изменить базу" , АирТ); - НовыйТест(ТаблицаТестов, "АТ_СоздатьТаблицу" , "Создать/Изменить таблицу" , АирТ); - НовыйТест(ТаблицаТестов, "АТ_СоздатьПоле" , "Создать/Изменить поле" , АирТ); - НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи" , "Создать/Удалить записи" , АирТ); - - НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьОбновитьТокен" , "Получить/Обновить токен" , ДропБокс); - НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайл" , "Загрузить файл" , ДропБокс); - НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайлПоURL" , "Загрузить файл по URL" , ДропБокс); - НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьКаталог" , "Создать каталог" , ДропБокс); - НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьУдалитьТег" , "Создать/Удалить тег" , ДропБокс); - НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьАккаунт" , "Получить данные аккаунта" , ДропБокс); - НовыйТест(ТаблицаТестов, "ДропБокс_РаботаСДоступами" , "Работа с доступами" , ДропБокс); - - Возврат ТаблицаТестов; - -КонецФункции - -Функция ОжидаетЧто(Значение) Экспорт - - Попытка - - Модуль = ПолучитьОбщийМодуль("ЮТест"); - Ожидаем = ТипЗнч(Модуль) = Тип("ОбщийМодуль"); - Возврат Модуль.ОжидаетЧто(Значение); - - Исключение - Возврат Ожидаем.Что(Значение); - КонецПопытки; - -КонецФункции - -Функция СформироватьТестыЯкс() Экспорт - - Модуль = ПолучитьОбщийМодуль("ЮТТесты"); - Разделы = ПолучитьСоответствиеРазделовТестирования(); - ТаблицаТестов = ПолучитьТаблицуТестов(); - - Для Каждого Раздел Из Разделы Цикл - - ТекущийРаздел = Раздел.Ключ; - Отбор = Новый Структура("Раздел", ТекущийРаздел); - ТестыРаздела = ТаблицаТестов.НайтиСтроки(Отбор); - - Набор = Модуль.ДобавитьТестовыйНабор(ТекущийРаздел); - - Для Каждого Тест Из ТестыРаздела Цикл - Набор.ДобавитьСерверныйТест(Тест.Метод, Тест.Синоним); - КонецЦикла; - - КонецЦикла; - - Возврат ""; - -КонецФункции - -Функция СформироватьТестыАссертс() Экспорт - - ТаблицаТестов = ПолучитьТаблицуТестов(); - МассивТестов = Новый Массив; - - Для Каждого Тест Из ТаблицаТестов Цикл - МассивТестов.Добавить(Тест.Метод); - КонецЦикла; - - Возврат МассивТестов; - -КонецФункции - -Функция ПолучитьПараметр(Параметр) Экспорт - - Путь = ПутьКФайлуДанных(); - Возврат ПолучитьЗначениеИзФайла(Параметр, Путь); - -КонецФункции - -Функция ПолучитьДвоичные(Параметр) Экспорт - - Путь = ПутьКФайлуДанных(); - ПараметрЛокальный = Параметр + "Local"; - ЗначениеОсновной = ПолучитьЗначениеИзФайла(Параметр , Путь); - ЗначениеЛокальный = ПолучитьЗначениеИзФайла(ПараметрЛокальный, Путь); - - ФайлЛокальный = Новый Файл(ЗначениеЛокальный); - - Если ФайлЛокальный.Существует() Тогда - Значение = Новый ДвоичныеДанные(ЗначениеЛокальный); - Иначе - Значение = ЗначениеОсновной; - КонецЕсли; - - Если ТипЗнч(Значение) = Тип("Строка") Тогда - Значение = ПолучитьФайлПути(Значение, ПараметрЛокальный); - КонецЕсли; - - Возврат Значение; - -КонецФункции - -Функция ПолучитьФайлПути(Знач Путь, ПараметрЛокальный, Знач СохранятьЛокально = Истина) Экспорт - - Если СтрНайти(Путь, "http") > 0 - Или СтрНайти(Путь, "www") > 0 Тогда - - ИВФ = ПолучитьИмяВременногоФайла(); - КопироватьФайл(Путь, ИВФ); - Путь = ИВФ; - Двоичные = Новый ДвоичныеДанные(Путь); - - Если СохранятьЛокально Тогда - ЗаписатьПараметр(ПараметрЛокальный, ИВФ); - Иначе - УдалитьФайлы(ИВФ); - КонецЕсли; - - Иначе - - Двоичные = Новый ДвоичныеДанные(Путь); - - КонецЕсли; - - Возврат Двоичные; - -КонецФункции - -Процедура ПараметрВКоллекцию(Параметр, Коллекция) Экспорт - - Значение = ПолучитьПараметр(Параметр); - Коллекция.Вставить(Параметр, Значение); - -КонецПроцедуры - -Процедура ДвоичныеВКоллекцию(Параметр, Коллекция) Экспорт - - Значение = ПолучитьДвоичные(Параметр); - Коллекция.Вставить(Параметр, Значение); - -КонецПроцедуры - -Процедура ЗаписатьПараметр(Параметр, Значение) Экспорт - - Путь = ПутьКФайлуДанных(); - ЗаписатьПараметрВФайл(Параметр, Значение, Путь); - -КонецПроцедуры - -Процедура ЗаписатьЛог(Знач Результат, Знач Метод, Знач Библиотека = "") Экспорт - - Шапка = Строка(OPI_Инструменты.ПолучитьТекущуюДату()) + " | " + Метод; - - Попытка - Данные = OPI_Инструменты.JSONСтрокой(Результат); - Исключение - Данные = "Не JSON: " + Строка(Результат); - КонецПопытки; - - Данные = " " + Данные; - - Сообщить(Шапка); - Сообщить(Символы.ПС); - Сообщить(Данные); - Сообщить(Символы.ПС); - Сообщить("---------------------------------"); - Сообщить(Символы.ПС); - - Если ЗначениеЗаполнено(Библиотека) Тогда - ЗаписатьФайлЛога(Данные, Метод, Библиотека); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ПолучитьЗначениеИзФайла(Параметр, Путь) - - Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь); - Возврат ?(Значения.Свойство(Параметр), Значения[Параметр], ""); - -КонецФункции - -Функция ПутьКФайлуДанных() - - Путь = ""; - ВозможныеПути = Новый Массив; - ВозможныеПути.Добавить("./data.json"); - ВозможныеПути.Добавить("C:\GDrive\Мой диск\data.json"); - ВозможныеПути.Добавить("D:\GD\Мой диск\data.json"); - - Для Каждого ВозможныйПуть Из ВозможныеПути Цикл - - ФайлРепозитория = Новый Файл(ВозможныйПуть); - - Если ФайлРепозитория.Существует() Тогда - Путь = ВозможныйПуть; - КонецЕсли; - - КонецЦикла; - - Возврат Путь; - -КонецФункции - -Функция ПолучитьОбщийМодуль(Знач Имя) - - Модуль = Вычислить(Имя); - - Возврат Модуль; -КонецФункции - -Процедура НовыйТест(ТаблицаЗначений, Знач Метод, Знач Синоним, Знач Раздел) - - НовыйТест = ТаблицаЗначений.Добавить(); - НовыйТест.Метод = Метод; - НовыйТест.Синоним = Синоним; - НовыйТест.Раздел = Раздел; - -КонецПроцедуры - -Процедура ЗаписатьПараметрВФайл(Знач Параметр, Знач Значение, Знач Путь) - - Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь); - Значения.Вставить(Параметр, Значение); - - Запись = Новый ЗаписьJSON; - ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб); - Запись.ОткрытьФайл(Путь, , , ПараметрыЗаписиJSON); - ЗаписатьJSON(Запись, Значения); - Запись.Закрыть(); - -КонецПроцедуры - -Процедура ЗаписатьФайлЛога(Знач Данные, Знач Метод, Знач Библиотека) - - Попытка - - ПутьЛогов = "./docs/results"; - ПутьЛоговБиблиотеки = ПутьЛогов + "/" + Библиотека; - - КаталогЛогов = Новый Файл(ПутьЛогов); - - Если Не КаталогЛогов.Существует() Тогда - СоздатьКаталог(ПутьЛогов); - КонецЕсли; - - КаталогЛоговБиблиотеки = Новый Файл(ПутьЛоговБиблиотеки); - - Если Не КаталогЛоговБиблиотеки.Существует() Тогда - СоздатьКаталог(ПутьЛоговБиблиотеки); - КонецЕсли; - - ПутьКФайлу = ПутьЛоговБиблиотеки + "/" + Метод + ".log"; - ФайлЛога = Новый Файл(ПутьКФайлу); - - Если Не ФайлЛога.Существует() Тогда - ДокументЛога = Новый ТекстовыйДокумент; - ДокументЛога.УстановитьТекст(Данные); - ДокументЛога.Записать(ПутьКФайлу); - КонецЕсли; - - Исключение - Сообщить("Не удалось записать файл лога!: " + ОписаниеОшибки()); - КонецПопытки; - -КонецПроцедуры - -#КонецОбласти +// Расположение OS: ./OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os + +// 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:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UsingHardcodePath-off +// BSLLS:Typo-off +// BSLLS:DeprecatedMessage-off +// BSLLS:UsingServiceTag-off +// BSLLS:ExecuteExternalCodeInCommonModule-off +// BSLLS:DuplicateStringLiteral-off + +//@skip-check use-non-recommended-method + +// Раскомментировать, если выполняется OneScript +#Использовать "./internal" +#Использовать asserts + +#Область СлужебныйПрограммныйИнтерфейс + +Функция ПолучитьСоответствиеРазделовТестирования() Экспорт + + СтандартныеЗависимости = "[Decode, Build]"; + ЗависимостиГугл = "Testing-GoogleWorkspace"; + + Разделы = Новый Структура; + Разделы.Вставить("Telegram" , СтандартныеЗависимости); + Разделы.Вставить("VK" , СтандартныеЗависимости); + Разделы.Вставить("Viber" , СтандартныеЗависимости); + Разделы.Вставить("Twitter" , СтандартныеЗависимости); + Разделы.Вставить("YandexDisk" , СтандартныеЗависимости); + Разделы.Вставить("GoogleWorkspace", СтандартныеЗависимости); + Разделы.Вставить("GoogleCalendar" , ЗависимостиГугл); + Разделы.Вставить("GoogleDrive" , ЗависимостиГугл); + Разделы.Вставить("GoogleSheets" , ЗависимостиГугл); + Разделы.Вставить("Notion" , СтандартныеЗависимости); + Разделы.Вставить("Slack" , СтандартныеЗависимости); + Разделы.Вставить("Airtable" , СтандартныеЗависимости); + Разделы.Вставить("Dropbox" , СтандартныеЗависимости); + + Возврат Разделы; + +КонецФункции + +Функция ПолучитьТаблицуТестов() Экспорт + + Телеграм = "Telegram"; + ВКонтакте = "VK"; + ЯДиск = "YandexDisk"; + Календарь = "GoogleCalendar"; + Твиттер = "Twitter"; + Вайбер = "Viber"; + Драйв = "GoogleDrive"; + ВСпейс = "GoogleWorkspace"; + Ноушн = "Notion"; + Слак = "Slack"; + Таблицы = "GoogleSheets"; + АирТ = "Airtable"; + ДропБокс = "Dropbox"; + + ТаблицаТестов = Новый ТаблицаЗначений; + ТаблицаТестов.Колонки.Добавить("Метод"); + ТаблицаТестов.Колонки.Добавить("Синоним"); + ТаблицаТестов.Колонки.Добавить("Раздел"); + + НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьИнформациюБота" , "Получить информацию бота" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьОбновления" , "Получить обновления" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_УстановитьWebhook" , "Установить Webhook" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКартинку" , "Отправить картинку" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьВидео" , "Отправить видео" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьАудио" , "Отправить аудио" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьДокумент" , "Отправить документ" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьГифку" , "Отправить гифку" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМедиагруппу" , "Отправить медиагруппу" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМестоположение" , "Отправить местоположение" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКонтакт" , "Отправить контакт" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьОпрос" , "Отправить опрос" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ПереслатьСообщение" , "Переслать сообщение" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_БанРазбан" , "Бан/Разбан" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_СоздатьСсылкуПриглашение" , "Создать ссылку-приглашение" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ЗакрепитьОткрепитьСообщение" , "Закрепить/Открепить сообщение" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьЧислоУчастников" , "Получить число участников" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьСписокАватаровФорума", "Получить список аватаров форума", Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_СоздатьУдалитьТемуФорума" , "Создать/Удалить тему форума" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_ИзменитьИмяГлавнойТемы" , "Изменить имя главной темы" , Телеграм); + НовыйТест(ТаблицаТестов, "Телеграм_СкрытьПоказатьГлавнуюТему" , "Скрыть/Показать главную тему" , Телеграм); + + НовыйТест(ТаблицаТестов, "ВК_СоздатьСсылкуТокена" , "Создать ссылку получения токена", ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_СоздатьУдалитьПост" , "Создать/Удалить пост" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_СоздатьСоставнойПост" , "Создать/Удалить составной пост" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_СоздатьОпрос" , "Создать опрос" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_СохранитьУдалитьКартинку" , "Добавить/Удалить картинку" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_СоздатьИсторию" , "Создать историю" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_МетодыОбсуждений" , "Действия с обсуждениями" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_ЛайкРепостКоммент" , "Лайк/Репост/Комментарий" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистику" , "Получить статистику" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистикуПостов" , "Получить статистику постов" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_СоздатьРекламнуюКампанию" , "Создать рекламную кампанию" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_ОтправитьСообщение" , "Отправить сообщение" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_ПолучитьКатегорииТоваров" , "Получить категории товаров" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварПодборку" , "Создать товар и подборку" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварСоСвойствами" , "Создать товар со свойствами" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокТоваров" , "Получить список товаров" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокПодборок" , "Получить список подборок" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокСвойств" , "Получить список свойств" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокЗаказов" , "Получить список заказов" , ВКонтакте); + НовыйТест(ТаблицаТестов, "ВК_ЗагрузитьВидео" , "Загрузить видео" , ВКонтакте); + + НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьИнформациюОДиске" , "Получить информацию о диске" , ЯДиск); + НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьПапку" , "Создать папку" , ЯДиск); + НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект", "Загрузить по URL и получить" , ЯДиск); + НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , ЯДиск); + НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьКопиюОбъекта" , "Создать копию объекта" , ЯДиск); + НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСсылкуНаСкачивание" , "Получить ссылку на скачивание" , ЯДиск); + НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокФайлов" , "Получить список файлов" , ЯДиск); + НовыйТест(ТаблицаТестов, "ЯДиск_ПереместитьОбъект" , "Переместить объект" , ЯДиск); + НовыйТест(ТаблицаТестов, "ЯДиск_ДействияПубличныхОбъектов" , "Действия с публичными объектами", ЯДиск); + НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокОпубликованных" , "Получить список опубликованных" , ЯДиск); + + НовыйТест(ТаблицаТестов, "ГВ_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , ВСпейс); + НовыйТест(ТаблицаТестов, "ГВ_ПолучитьТокен" , "Получить токен" , ВСпейс); + НовыйТест(ТаблицаТестов, "ГВ_ОбновитьТокен" , "Обновить токен" , ВСпейс); + + НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокКалендарей" , "Получить список календарей" , Календарь); + НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьКалендарь" , "Создать/Удалить календарь" , Календарь); + НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьСобытие" , "Создать/Удалить событие" , Календарь); + НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокСобытий" , "Получить список событий" , Календарь); + + НовыйТест(ТаблицаТестов, "ГД_ПолучитьСписокКаталогов" , "Получить список каталогов" , Драйв); + НовыйТест(ТаблицаТестов, "ГД_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить Файл" , Драйв); + НовыйТест(ТаблицаТестов, "ГД_СоздатьУдалитьКомментарий" , "Создать/Удалить кооментарий" , Драйв); + НовыйТест(ТаблицаТестов, "ГД_СоздатьКаталог" , "Создать/Удалить каталог" , Драйв); + + НовыйТест(ТаблицаТестов, "ГТ_СоздатьТаблицу" , "Создать таблицу" , Таблицы); + НовыйТест(ТаблицаТестов, "ГТ_ПолучитьТаблицу" , "Получить таблицу" , Таблицы); + НовыйТест(ТаблицаТестов, "ГТ_ЗаполнитьОчиститьЯчейки" , "Заполнить/Очистить ячейки" , Таблицы); + + НовыйТест(ТаблицаТестов, "Твиттер_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , Твиттер); + НовыйТест(ТаблицаТестов, "Твиттер_ОбновитьТокен" , "Обновить токен" , Твиттер); + НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТекстовыйТвит" , "Текстовый твит" , Твиттер); + НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСКартинкой" , "Твит с картинкой" , Твиттер); + НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСВидео" , "Твит с видео" , Твиттер); + НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСГиф" , "Твит с гиф" , Твиттер); + НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСОпросом" , "Твит с опросом" , Твиттер); + + НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьИнформациюОКанале" , "Получить информацию канала" , Вайбер); + НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Вайбер); + НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьОнлайнПользователей" , "Получить онлайн пользователей" , Вайбер); + НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Вайбер); + НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКартинку" , "Отправить картинку" , Вайбер); + НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьФайл" , "Отправить файл" , Вайбер); + НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКонтакт" , "Отправить контакт" , Вайбер); + НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьЛокацию" , "Отправить локацию" , Вайбер); + НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьСсылку" , "Отправить ссылку" , Вайбер); + + НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницу" , "Создать страницу" , Ноушн); + НовыйТест(ТаблицаТестов, "Ноушн_СоздатьИзменитьБазу" , "Создать/Изменить базу" , Ноушн); + НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОСтранице" , "Получить информацию о странице" , Ноушн); + НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОБазе" , "Получить информацию о базе" , Ноушн); + НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницуВБазу" , "Создать страницу в базу" , Ноушн); + НовыйТест(ТаблицаТестов, "Ноушн_ИзменитьСвойстваСтраницы" , "Изменить свойства страницы" , Ноушн); + НовыйТест(ТаблицаТестов, "Ноушн_СоздатьУдалитьБлок" , "Создать/Удалить блок" , Ноушн); + НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьПользователей" , "Получить пользователей" , Ноушн); + НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Ноушн); + + НовыйТест(ТаблицаТестов, "Слак_ПолучитьИнформациюОБоте" , "Получить информацию о боте" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокПользователей" , "Получить список пользователей" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокОбластей" , "Получить список областей" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьСообщение" , "Отправить/Удалить сообщение" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьЭфемерное" , "Отправить/Удалить эфемерное" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ПолучитьОтложенныеСообщения" , "Получить отложенные сообщения" , Слак); + НовыйТест(ТаблицаТестов, "Слак_СоздатьАрхивироватьКанал" , "Создать/Архивировать канал" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокКаналов" , "Получить список каналов" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ОткрытьЗакрытьДиалог" , "Открыть/Закрыть диалог" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокФайлов" , "Получить список файлов" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокВФ" , "Получить список внеш. файлов" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьВФ" , "Загрузить/Удалить внеш. файл" , Слак); + + НовыйТест(ТаблицаТестов, "АТ_СоздатьБазу" , "Создать/Изменить базу" , АирТ); + НовыйТест(ТаблицаТестов, "АТ_СоздатьТаблицу" , "Создать/Изменить таблицу" , АирТ); + НовыйТест(ТаблицаТестов, "АТ_СоздатьПоле" , "Создать/Изменить поле" , АирТ); + НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи" , "Создать/Удалить записи" , АирТ); + + НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьОбновитьТокен" , "Получить/Обновить токен" , ДропБокс); + НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайл" , "Загрузить файл" , ДропБокс); + НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайлПоURL" , "Загрузить файл по URL" , ДропБокс); + НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьКаталог" , "Создать каталог" , ДропБокс); + НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьУдалитьТег" , "Создать/Удалить тег" , ДропБокс); + НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьАккаунт" , "Получить данные аккаунта" , ДропБокс); + НовыйТест(ТаблицаТестов, "ДропБокс_РаботаСДоступами" , "Работа с доступами" , ДропБокс); + + Возврат ТаблицаТестов; + +КонецФункции + +Функция ОжидаетЧто(Значение) Экспорт + + Попытка + + Модуль = ПолучитьОбщийМодуль("ЮТест"); + Ожидаем = ТипЗнч(Модуль) = Тип("ОбщийМодуль"); + Возврат Модуль.ОжидаетЧто(Значение); + + Исключение + Возврат Ожидаем.Что(Значение); + КонецПопытки; + +КонецФункции + +Функция СформироватьТестыЯкс() Экспорт + + Модуль = ПолучитьОбщийМодуль("ЮТТесты"); + Разделы = ПолучитьСоответствиеРазделовТестирования(); + ТаблицаТестов = ПолучитьТаблицуТестов(); + + Для Каждого Раздел Из Разделы Цикл + + ТекущийРаздел = Раздел.Ключ; + Отбор = Новый Структура("Раздел", ТекущийРаздел); + ТестыРаздела = ТаблицаТестов.НайтиСтроки(Отбор); + + Набор = Модуль.ДобавитьТестовыйНабор(ТекущийРаздел); + + Для Каждого Тест Из ТестыРаздела Цикл + Набор.ДобавитьСерверныйТест(Тест.Метод, Тест.Синоним); + КонецЦикла; + + КонецЦикла; + + Возврат ""; + +КонецФункции + +Функция СформироватьТестыАссертс() Экспорт + + ТаблицаТестов = ПолучитьТаблицуТестов(); + МассивТестов = Новый Массив; + + Для Каждого Тест Из ТаблицаТестов Цикл + МассивТестов.Добавить(Тест.Метод); + КонецЦикла; + + Возврат МассивТестов; + +КонецФункции + +Функция ПолучитьПараметр(Параметр) Экспорт + + Путь = ПутьКФайлуДанных(); + Возврат ПолучитьЗначениеИзФайла(Параметр, Путь); + +КонецФункции + +Функция ПолучитьДвоичные(Параметр) Экспорт + + Путь = ПутьКФайлуДанных(); + ПараметрЛокальный = Параметр + "Local"; + ЗначениеОсновной = ПолучитьЗначениеИзФайла(Параметр , Путь); + ЗначениеЛокальный = ПолучитьЗначениеИзФайла(ПараметрЛокальный, Путь); + + ФайлЛокальный = Новый Файл(ЗначениеЛокальный); + + Если ФайлЛокальный.Существует() Тогда + Значение = Новый ДвоичныеДанные(ЗначениеЛокальный); + Иначе + Значение = ЗначениеОсновной; + КонецЕсли; + + Если ТипЗнч(Значение) = Тип("Строка") Тогда + Значение = ПолучитьФайлПути(Значение, ПараметрЛокальный); + КонецЕсли; + + Возврат Значение; + +КонецФункции + +Функция ПолучитьФайлПути(Знач Путь, ПараметрЛокальный, Знач СохранятьЛокально = Истина) Экспорт + + Если СтрНайти(Путь, "http") > 0 + Или СтрНайти(Путь, "www") > 0 Тогда + + ИВФ = ПолучитьИмяВременногоФайла(); + КопироватьФайл(Путь, ИВФ); + Путь = ИВФ; + Двоичные = Новый ДвоичныеДанные(Путь); + + Если СохранятьЛокально Тогда + ЗаписатьПараметр(ПараметрЛокальный, ИВФ); + Иначе + УдалитьФайлы(ИВФ); + КонецЕсли; + + Иначе + + Двоичные = Новый ДвоичныеДанные(Путь); + + КонецЕсли; + + Возврат Двоичные; + +КонецФункции + +Процедура ПараметрВКоллекцию(Параметр, Коллекция) Экспорт + + Значение = ПолучитьПараметр(Параметр); + Коллекция.Вставить(Параметр, Значение); + +КонецПроцедуры + +Процедура ДвоичныеВКоллекцию(Параметр, Коллекция) Экспорт + + Значение = ПолучитьДвоичные(Параметр); + Коллекция.Вставить(Параметр, Значение); + +КонецПроцедуры + +Процедура ЗаписатьПараметр(Параметр, Значение) Экспорт + + Путь = ПутьКФайлуДанных(); + ЗаписатьПараметрВФайл(Параметр, Значение, Путь); + +КонецПроцедуры + +Процедура ЗаписатьЛог(Знач Результат, Знач Метод, Знач Библиотека = "") Экспорт + + Шапка = Строка(OPI_Инструменты.ПолучитьТекущуюДату()) + " | " + Метод; + + Попытка + Данные = OPI_Инструменты.JSONСтрокой(Результат); + Исключение + Данные = "Не JSON: " + Строка(Результат); + КонецПопытки; + + Данные = " " + Данные; + + Сообщить(Шапка); + Сообщить(Символы.ПС); + Сообщить(Данные); + Сообщить(Символы.ПС); + Сообщить("---------------------------------"); + Сообщить(Символы.ПС); + + Если ЗначениеЗаполнено(Библиотека) Тогда + ЗаписатьФайлЛога(Данные, Метод, Библиотека); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьЗначениеИзФайла(Параметр, Путь) + + Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь); + Возврат ?(Значения.Свойство(Параметр), Значения[Параметр], ""); + +КонецФункции + +Функция ПутьКФайлуДанных() + + Путь = ""; + ВозможныеПути = Новый Массив; + ВозможныеПути.Добавить("./data.json"); + ВозможныеПути.Добавить("C:\GDrive\Мой диск\data.json"); + ВозможныеПути.Добавить("D:\GD\Мой диск\data.json"); + + Для Каждого ВозможныйПуть Из ВозможныеПути Цикл + + ФайлРепозитория = Новый Файл(ВозможныйПуть); + + Если ФайлРепозитория.Существует() Тогда + Путь = ВозможныйПуть; + КонецЕсли; + + КонецЦикла; + + Возврат Путь; + +КонецФункции + +Функция ПолучитьОбщийМодуль(Знач Имя) + + Модуль = Вычислить(Имя); + + Возврат Модуль; +КонецФункции + +Процедура НовыйТест(ТаблицаЗначений, Знач Метод, Знач Синоним, Знач Раздел) + + НовыйТест = ТаблицаЗначений.Добавить(); + НовыйТест.Метод = Метод; + НовыйТест.Синоним = Синоним; + НовыйТест.Раздел = Раздел; + +КонецПроцедуры + +Процедура ЗаписатьПараметрВФайл(Знач Параметр, Знач Значение, Знач Путь) + + Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь); + Значения.Вставить(Параметр, Значение); + + Запись = Новый ЗаписьJSON; + ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб); + Запись.ОткрытьФайл(Путь, , , ПараметрыЗаписиJSON); + ЗаписатьJSON(Запись, Значения); + Запись.Закрыть(); + +КонецПроцедуры + +Процедура ЗаписатьФайлЛога(Знач Данные, Знач Метод, Знач Библиотека) + + Попытка + + ПутьЛогов = "./docs/results"; + ПутьЛоговБиблиотеки = ПутьЛогов + "/" + Библиотека; + + КаталогЛогов = Новый Файл(ПутьЛогов); + + Если Не КаталогЛогов.Существует() Тогда + СоздатьКаталог(ПутьЛогов); + КонецЕсли; + + КаталогЛоговБиблиотеки = Новый Файл(ПутьЛоговБиблиотеки); + + Если Не КаталогЛоговБиблиотеки.Существует() Тогда + СоздатьКаталог(ПутьЛоговБиблиотеки); + КонецЕсли; + + ПутьКФайлу = ПутьЛоговБиблиотеки + "/" + Метод + ".log"; + ФайлЛога = Новый Файл(ПутьКФайлу); + + Если Не ФайлЛога.Существует() Тогда + ДокументЛога = Новый ТекстовыйДокумент; + ДокументЛога.УстановитьТекст(Данные); + ДокументЛога.Записать(ПутьКФайлу); + КонецЕсли; + + Исключение + Сообщить("Не удалось записать файл лога!: " + ОписаниеОшибки()); + КонецПопытки; + +КонецПроцедуры + +#КонецОбласти diff --git a/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os b/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os index b1917ae7af..65f918be99 100644 --- a/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os +++ b/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os @@ -1,320 +1,320 @@ -// Расположение OS: ./OInt/tools/Modules/OPI_ПреобразованиеТипов.os - -// 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:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:UnusedLocalVariable-off - -#Использовать "./internal" - -#Область СлужебныйПрограммныйИнтерфейс - -Процедура ПолучитьДвоичныеДанные(Значение) Экспорт - - Если Значение = Неопределено Тогда - Возврат; - КонецЕсли; - - Попытка - - Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда - Возврат; - Иначе - - Файл = Новый Файл(Значение); - - Если Файл.Существует() Тогда - Значение = Новый ДвоичныеДанные(Значение); - - ИначеЕсли СтрНайти(Значение, "//") Тогда - - Значение = OPI_Инструменты.Get(Значение); - - Иначе - - Значение = Base64Значение(Значение); - - КонецЕсли; - - КонецЕсли; - - Исключение - ВызватьИсключение "Ошибка получения двоичных данных из параметра: " + ОписаниеОшибки(); - КонецПопытки; - -КонецПроцедуры - -Процедура ПолучитьДвоичныеИлиПоток(Значение) Экспорт - - Если Значение = Неопределено Тогда - Возврат; - КонецЕсли; - - Если ТипЗнч(Значение) <> Тип("Строка") Тогда - ПолучитьДвоичныеДанные(Значение); - Возврат; - КонецЕсли; - - Файл = Новый Файл(Значение); - - Если Файл.Существует() Тогда - Значение = Новый ФайловыйПоток(Значение, РежимОткрытияФайла.Открыть); - Иначе - ПолучитьДвоичныеДанные(Значение); - КонецЕсли; - -КонецПроцедуры - -Процедура ПолучитьКоллекцию(Значение) Экспорт - - Если Значение = Неопределено Тогда - Возврат; - КонецЕсли; - - Попытка - - ИсходноеЗначение = Значение; - - Если ЭтоКоллекция(Значение) Тогда - Возврат; - Иначе - - Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда - Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение); - Иначе - Значение = OPI_Инструменты.ЧислоВСтроку(Значение); - КонецЕсли; - - Файл = Новый Файл(Значение); - ЧтениеJSON = Новый ЧтениеJSON; - - Если Файл.Существует() Тогда - - ЧтениеJSON.ОткрытьФайл(Значение); - - ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда - - ИВФ = ПолучитьИмяВременногоФайла(); - КопироватьФайл(Значение, ИВФ); - ЧтениеJSON.ОткрытьФайл(ИВФ); - ЧтениеJSON.Прочитать(); - - УдалитьФайлы(ИВФ); - - Иначе - - ЧтениеJSON.УстановитьСтроку(СокрЛП(Значение)); - - КонецЕсли; - - Значение = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO); - ЧтениеJSON.Закрыть(); - - Если (Не ЭтоКоллекция(Значение)) Или Не ЗначениеЗаполнено(Значение) Тогда - - Значение = ИсходноеЗначение; - ПолучитьМассив(Значение); - - КонецЕсли; - - КонецЕсли; - - Исключение - - Значение = ИсходноеЗначение; - ПолучитьМассив(Значение); - - КонецПопытки; - -КонецПроцедуры - -Процедура ПолучитьМассив(Значение) Экспорт - - Если ТипЗнч(Значение) = Тип("Массив") Тогда - Возврат; - КонецЕсли; - - Если ТипЗнч(Значение) = Тип("Строка") - И СтрНачинаетсяС(Значение, "[") - И СтрЗаканчиваетсяНа(Значение, "]") Тогда - - ЗапятаяВКавычках = "','"; - - Значение = СтрЗаменить(Значение, "['" , ""); - Значение = СтрЗаменить(Значение, "']" , ""); - Значение = СтрЗаменить(Значение, "', '" , ЗапятаяВКавычках); - Значение = СтрЗаменить(Значение, "' , '", ЗапятаяВКавычках); - Значение = СтрЗаменить(Значение, "' ,'" , ЗапятаяВКавычках); - - Значение = СтрРазделить(Значение, ЗапятаяВКавычках, Ложь); - - Для Н = 0 По Значение.ВГраница() Цикл - Значение[Н] = СокрЛП(Значение[Н]); - КонецЦикла; - - Иначе - - Если ТипЗнч(Значение) = Тип("Число") Тогда - Значение = OPI_Инструменты.ЧислоВСтроку(Значение); - КонецЕсли; - - OPI_Инструменты.ЗначениеВМассив(Значение); - - КонецЕсли; - -КонецПроцедуры - -Процедура ПолучитьБулево(Значение) Экспорт - - Если Значение = Неопределено Тогда - Возврат; - КонецЕсли; - - Попытка - - Если ТипЗнч(Значение) = Тип("Булево") Тогда - Возврат; - Иначе - Значение = Булево(Значение); - КонецЕсли; - - Исключение - ВызватьИсключение "Ошибка получения данных булево из параметра"; - КонецПопытки; - -КонецПроцедуры - -Процедура ПолучитьСтроку(Значение, Знач ИзИсточника = Ложь) Экспорт - - Если Значение = Неопределено Тогда - Возврат; - КонецЕсли; - - Попытка - - Если ЭтоСимвольное(Значение) Тогда - - Если Не ИзИсточника Тогда - Значение = OPI_Инструменты.ЧислоВСтроку(Значение); - Возврат; - КонецЕсли; - - Значение = OPI_Инструменты.ЧислоВСтроку(Значение); - Файл = Новый Файл(Значение); - - Если Файл.Существует() Тогда - - ЧтениеТекста = Новый ЧтениеТекста(Значение); - Значение = ЧтениеТекста.Прочитать(); - ЧтениеТекста.Закрыть(); - - ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда - - ИВФ = ПолучитьИмяВременногоФайла(); - КопироватьФайл(Значение, ИВФ); - - ЧтениеТекста = Новый ЧтениеТекста(ИВФ); - Значение = ЧтениеТекста.Прочитать(); - ЧтениеТекста.Закрыть(); - - УдалитьФайлы(ИВФ); - - Иначе - - Возврат; - - КонецЕсли; - - ИначеЕсли ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда - - Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение); - - ИначеЕсли ЭтоКоллекция(Значение) Тогда - - Значение = OPI_Инструменты.JSONСтрокой(Значение); - - Иначе - Возврат; - КонецЕсли; - - Исключение - Значение = Строка(Значение); - Возврат; - КонецПопытки; - -КонецПроцедуры - -Процедура ПолучитьДату(Значение) Экспорт - - Если Значение = Неопределено Тогда - Возврат; - КонецЕсли; - - Дата = "Дата"; - - Попытка - - Если ТипЗнч(Значение) = Тип(Дата) Тогда - Возврат; - Иначе - Значение = XMLЗначение(Тип(Дата), Значение); - КонецЕсли; - - Исключение - ООД = Новый ОписаниеТипов(Дата); - Значение = ООД.ПривестиЗначение(Значение); - КонецПопытки; - -КонецПроцедуры - -Процедура ПолучитьЧисло(Значение) Экспорт - - ОписаниеТипа = Новый ОписаниеТипов("Число"); - Значение = ОписаниеТипа.ПривестиЗначение(Значение); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ЭтоКоллекция(Знач Значение) - - Возврат ТипЗнч(Значение) = Тип("Массив") - Или ТипЗнч(Значение) = Тип("Структура") - Или ТипЗнч(Значение) = Тип("Соответствие"); - -КонецФункции - -Функция ЭтоСимвольное(Знач Значение) - - Возврат ТипЗнч(Значение) = Тип("Строка") - Или ТипЗнч(Значение) = Тип("Число") - Или ТипЗнч(Значение) = Тип("Дата"); - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/tools/Modules/OPI_ПреобразованиеТипов.os + +// 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:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UnusedLocalVariable-off + +#Использовать "./internal" + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ПолучитьДвоичныеДанные(Значение) Экспорт + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + Попытка + + Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда + Возврат; + Иначе + + Файл = Новый Файл(Значение); + + Если Файл.Существует() Тогда + Значение = Новый ДвоичныеДанные(Значение); + + ИначеЕсли СтрНайти(Значение, "//") Тогда + + Значение = OPI_Инструменты.Get(Значение); + + Иначе + + Значение = Base64Значение(Значение); + + КонецЕсли; + + КонецЕсли; + + Исключение + ВызватьИсключение "Ошибка получения двоичных данных из параметра: " + ОписаниеОшибки(); + КонецПопытки; + +КонецПроцедуры + +Процедура ПолучитьДвоичныеИлиПоток(Значение) Экспорт + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(Значение) <> Тип("Строка") Тогда + ПолучитьДвоичныеДанные(Значение); + Возврат; + КонецЕсли; + + Файл = Новый Файл(Значение); + + Если Файл.Существует() Тогда + Значение = Новый ФайловыйПоток(Значение, РежимОткрытияФайла.Открыть); + Иначе + ПолучитьДвоичныеДанные(Значение); + КонецЕсли; + +КонецПроцедуры + +Процедура ПолучитьКоллекцию(Значение) Экспорт + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + Попытка + + ИсходноеЗначение = Значение; + + Если ЭтоКоллекция(Значение) Тогда + Возврат; + Иначе + + Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда + Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение); + Иначе + Значение = OPI_Инструменты.ЧислоВСтроку(Значение); + КонецЕсли; + + Файл = Новый Файл(Значение); + ЧтениеJSON = Новый ЧтениеJSON; + + Если Файл.Существует() Тогда + + ЧтениеJSON.ОткрытьФайл(Значение); + + ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда + + ИВФ = ПолучитьИмяВременногоФайла(); + КопироватьФайл(Значение, ИВФ); + ЧтениеJSON.ОткрытьФайл(ИВФ); + ЧтениеJSON.Прочитать(); + + УдалитьФайлы(ИВФ); + + Иначе + + ЧтениеJSON.УстановитьСтроку(СокрЛП(Значение)); + + КонецЕсли; + + Значение = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO); + ЧтениеJSON.Закрыть(); + + Если (Не ЭтоКоллекция(Значение)) Или Не ЗначениеЗаполнено(Значение) Тогда + + Значение = ИсходноеЗначение; + ПолучитьМассив(Значение); + + КонецЕсли; + + КонецЕсли; + + Исключение + + Значение = ИсходноеЗначение; + ПолучитьМассив(Значение); + + КонецПопытки; + +КонецПроцедуры + +Процедура ПолучитьМассив(Значение) Экспорт + + Если ТипЗнч(Значение) = Тип("Массив") Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(Значение) = Тип("Строка") + И СтрНачинаетсяС(Значение, "[") + И СтрЗаканчиваетсяНа(Значение, "]") Тогда + + ЗапятаяВКавычках = "','"; + + Значение = СтрЗаменить(Значение, "['" , ""); + Значение = СтрЗаменить(Значение, "']" , ""); + Значение = СтрЗаменить(Значение, "', '" , ЗапятаяВКавычках); + Значение = СтрЗаменить(Значение, "' , '", ЗапятаяВКавычках); + Значение = СтрЗаменить(Значение, "' ,'" , ЗапятаяВКавычках); + + Значение = СтрРазделить(Значение, ЗапятаяВКавычках, Ложь); + + Для Н = 0 По Значение.ВГраница() Цикл + Значение[Н] = СокрЛП(Значение[Н]); + КонецЦикла; + + Иначе + + Если ТипЗнч(Значение) = Тип("Число") Тогда + Значение = OPI_Инструменты.ЧислоВСтроку(Значение); + КонецЕсли; + + OPI_Инструменты.ЗначениеВМассив(Значение); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПолучитьБулево(Значение) Экспорт + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + Попытка + + Если ТипЗнч(Значение) = Тип("Булево") Тогда + Возврат; + Иначе + Значение = Булево(Значение); + КонецЕсли; + + Исключение + ВызватьИсключение "Ошибка получения данных булево из параметра"; + КонецПопытки; + +КонецПроцедуры + +Процедура ПолучитьСтроку(Значение, Знач ИзИсточника = Ложь) Экспорт + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + Попытка + + Если ЭтоСимвольное(Значение) Тогда + + Если Не ИзИсточника Тогда + Значение = OPI_Инструменты.ЧислоВСтроку(Значение); + Возврат; + КонецЕсли; + + Значение = OPI_Инструменты.ЧислоВСтроку(Значение); + Файл = Новый Файл(Значение); + + Если Файл.Существует() Тогда + + ЧтениеТекста = Новый ЧтениеТекста(Значение); + Значение = ЧтениеТекста.Прочитать(); + ЧтениеТекста.Закрыть(); + + ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда + + ИВФ = ПолучитьИмяВременногоФайла(); + КопироватьФайл(Значение, ИВФ); + + ЧтениеТекста = Новый ЧтениеТекста(ИВФ); + Значение = ЧтениеТекста.Прочитать(); + ЧтениеТекста.Закрыть(); + + УдалитьФайлы(ИВФ); + + Иначе + + Возврат; + + КонецЕсли; + + ИначеЕсли ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда + + Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение); + + ИначеЕсли ЭтоКоллекция(Значение) Тогда + + Значение = OPI_Инструменты.JSONСтрокой(Значение); + + Иначе + Возврат; + КонецЕсли; + + Исключение + Значение = Строка(Значение); + Возврат; + КонецПопытки; + +КонецПроцедуры + +Процедура ПолучитьДату(Значение) Экспорт + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + Дата = "Дата"; + + Попытка + + Если ТипЗнч(Значение) = Тип(Дата) Тогда + Возврат; + Иначе + Значение = XMLЗначение(Тип(Дата), Значение); + КонецЕсли; + + Исключение + ООД = Новый ОписаниеТипов(Дата); + Значение = ООД.ПривестиЗначение(Значение); + КонецПопытки; + +КонецПроцедуры + +Процедура ПолучитьЧисло(Значение) Экспорт + + ОписаниеТипа = Новый ОписаниеТипов("Число"); + Значение = ОписаниеТипа.ПривестиЗначение(Значение); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ЭтоКоллекция(Знач Значение) + + Возврат ТипЗнч(Значение) = Тип("Массив") + Или ТипЗнч(Значение) = Тип("Структура") + Или ТипЗнч(Значение) = Тип("Соответствие"); + +КонецФункции + +Функция ЭтоСимвольное(Знач Значение) + + Возврат ТипЗнч(Значение) = Тип("Строка") + Или ТипЗнч(Значение) = Тип("Число") + Или ТипЗнч(Значение) = Тип("Дата"); + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os b/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os index 541ea150b9..bc48b37707 100644 --- a/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os +++ b/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os @@ -1,1229 +1,1229 @@ -// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os - -// MIT License - -// Copyright (c) 2023 Anton Tsitavets - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -// https://github.com/Bayselonarrend/OpenIntegrations - -// BSLLS:Typo-off -// BSLLS:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:UnusedLocalVariable-off -// BSLLS:UsingServiceTag-off -// BSLLS:NumberOfOptionalParams-off - -//@skip-check module-unused-local-variable -//@skip-check method-too-many-params - -#Область СлужебныйПрограммныйИнтерфейс - -#Область HTTPМетоды - -#Область ЗапросыБезТела - -Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт - Возврат ВыполнитьЗапросБезТела(URL, "GET", Параметры, ДопЗаголовки, ФайлОтвета); -КонецФункции - -Функция Delete(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт - Возврат ВыполнитьЗапросБезТела(URL, "DELETE", Параметры, ДопЗаголовки, ФайлОтвета); -КонецФункции - -#КонецОбласти - -#Область ЗапросыСТелом - -Функция Post(Знач URL - , Знач Параметры = "" - , Знач ДопЗаголовки = "" - , Знач JSON = Истина - , Знач ПолныйОтвет = Ложь - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросСТелом(URL, "POST", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета); - -КонецФункции - -Функция Patch(Знач URL - , Знач Параметры = "" - , Знач ДопЗаголовки = "" - , Знач JSON = Истина - , Знач ПолныйОтвет = Ложь - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросСТелом(URL, "PATCH", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета); - -КонецФункции - -Функция Put(Знач URL - , Знач Параметры = "" - , Знач ДопЗаголовки = "" - , Знач JSON = Истина - , Знач ПолныйОтвет = Ложь - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросСТелом(URL, "PUT", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета); - -КонецФункции - -Функция PostBinary(Знач URL - , Знач Тело - , Знач ДопЗаголовки - , Знач ПолныйОтвет = Ложь - , Знач ТипДанных = "application/octet-stream") Экспорт - - Возврат ВыполнитьЗапросСДвоичнымиДанными(URL, "POST", Тело, ДопЗаголовки, ПолныйОтвет, ТипДанных); - -КонецФункции - -#КонецОбласти - -#Область ЗапросыMultipart - -Функция PostMultipart(Знач URL - , Знач Параметры = "" - , Знач Файлы = "" - , Знач ТипКонтента = "image/jpeg" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросМультипарт(URL, "POST", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета); - -КонецФункции - -Функция PutMultipart(Знач URL - , Знач Параметры = "" - , Знач Файлы = "" - , Знач ТипКонтента = "image/jpeg" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросМультипарт(URL, "PUT", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета); - -КонецФункции - -Функция PostMultipartRelated(Знач URL - , Знач JSON = "" - , Знач Файлы = "" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "POST", JSON, Файлы, ДопЗаголовки, ФайлОтвета); - -КонецФункции - -Функция PatchMultipartRelated(Знач URL - , Знач JSON = "" - , Знач Файлы = "" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "PATCH", JSON, Файлы, ДопЗаголовки, ФайлОтвета); - -КонецФункции - -#КонецОбласти - -#Область Прочее - -Процедура ОбработатьОтвет(Ответ, Знач ПолныйОтвет = Ложь) Экспорт - - Если ПолныйОтвет Или ТипЗнч(Ответ) <> Тип("HTTPОтвет") Тогда - Возврат; - КонецЕсли; - - ФайлТела = Ответ.ПолучитьИмяФайлаТела(); - - Если Не ФайлТела = Неопределено Тогда - Ответ = ФайлТела; - Возврат; - КонецЕсли; - - GZip = "gzip"; - НужнаРаспаковка = - Ответ.Заголовки.Получить("Content-Encoding") = GZip - Или Ответ.Заголовки.Получить("content-encoding") = GZip; - - Если НужнаРаспаковка Тогда - Ответ = РаспаковатьОтвет(Ответ); - КонецЕсли; - - Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ); - - Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда - - Попытка - Ответ = JsonВСтруктуру(Ответ); - Исключение - Возврат; - КонецПопытки; - - КонецЕсли; - -КонецПроцедуры - -Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "") Экспорт - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Accept-Encoding", "gzip"); - Заголовки.Вставить("Accept" , "*/*"); - Заголовки.Вставить("Connection" , "keep-alive"); - Заголовки.Вставить("Accept-Charset" , "utf-8"); - - Если ЗначениеЗаполнено(ТипДанных) Тогда - Заголовки.Вставить("Content-Type", ТипДанных); - КонецЕсли; - - Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда - - Для Каждого Заголовок Из ДопЗаголовки Цикл - Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение); - КонецЦикла; - - КонецЕсли; - - НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки); - - Возврат НовыйЗапрос; - -КонецФункции - -Функция СоздатьСоединение(Знач Сервер, Знач Пользователь = "", Знач Пароль = "") Экспорт - - Попытка - SSL = Новый ЗащищенноеСоединениеOpenSSL; - Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000, SSL); - Исключение - Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000); - КонецПопытки; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область Служебные - -Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт - - Если Параметры.Количество() = 0 Тогда - Возврат ""; - КонецЕсли; - - СтрокаПараметров = "?"; - - Для Каждого Параметр Из Параметры Цикл - - ЗначениеПараметра = ПреобразоватьПараметрВСтроку(Параметр.Значение); - - СтрокаПараметров = СтрокаПараметров - + Параметр.Ключ - + "=" - + ЗначениеПараметра - + "&"; - КонецЦикла; - - СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); - - Возврат СтрокаПараметров; - -КонецФункции - -Функция РазбитьURL(Знач URL) Экспорт - - URL = СтрЗаменить(URL, "https://", ""); - URL = СтрЗаменить(URL, "http://", ""); - URL = СтрЗаменить(URL, ":443", ""); - - Адрес = Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1); - Сервер = Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1); - - Попытка - SSL = Новый ЗащищенноеСоединениеOpenSSL; - Исключение - Сервер = "https://" + Сервер; - КонецПопытки; - - СтруктураВозврата = Новый Структура; - СтруктураВозврата.Вставить("Сервер", Сервер); - СтруктураВозврата.Вставить("Адрес" , Адрес); - - Возврат СтруктураВозврата; - -КонецФункции - -Функция JsonВСтруктуру(Знач Текст) Экспорт - - Если Не ЗначениеЗаполнено(Текст) Тогда - Возврат ""; - КонецЕсли; - - Текст = ?(ТипЗнч(Текст) = Тип("ДвоичныеДанные"), ПолучитьСтрокуИзДвоичныхДанных(Текст), Текст); - - ЧтениеJSON = Новый ЧтениеJSON; - ЧтениеJSON.УстановитьСтроку(Текст); - - Данные = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO); - ЧтениеJSON.Закрыть(); - - Возврат Данные; - -КонецФункции - -Функция JSONСтрокой(Знач Данные, Знач Экранирование = "Нет") Экспорт - - ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows - , " " - , Истина - , ЭкранированиеСимволовJSON[Экранирование] - , Ложь - , Ложь - , Ложь - , Ложь); - - Попытка - - ЗаписьJSON = Новый ЗаписьJSON; - ЗаписьJSON.УстановитьСтроку(ПараметрыJSON); - - ЗаписатьJSON(ЗаписьJSON, Данные); - Возврат ЗаписьJSON.Закрыть(); - - Исключение - Возврат "НЕ JSON: " + Строка(Данные); - КонецПопытки; - -КонецФункции - -Функция ЧислоВСтроку(Знач Число) Экспорт - Возврат СтрЗаменить(Строка(Число), Символы.НПП, ""); -КонецФункции - -Функция ПрочитатьJSONФайл(Знач Путь) Экспорт - - ЧтениеJSON = Новый ЧтениеJSON; - ЧтениеJSON.ОткрытьФайл(Путь); - Значения = ПрочитатьJSON(ЧтениеJSON); - - ЧтениеJSON.Закрыть(); - - Возврат Значения; - -КонецФункции - -Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт - - СоответствиеВозврата = Новый Соответствие; - КоличествоЧастей = 2; - МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь); - - Для Каждого Параметр Из МассивПараметров Цикл - - МассивКлючЗначение = СтрРазделить(Параметр, "="); - - Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда - СоответствиеВозврата.Вставить(МассивКлючЗначение[0], МассивКлючЗначение[1]); - КонецЕсли; - - КонецЦикла; - - Возврат СоответствиеВозврата; - -КонецФункции - -Функция ПолучитьТекущуюДату() Экспорт - Возврат МестноеВремя(ТекущаяУниверсальнаяДата()); -КонецФункции - -Функция UNIXTime(Знач Дата) Экспорт - - ОТД = Новый ОписаниеТипов("Дата"); - Дата = ОТД.ПривестиЗначение(Дата); - - UNIX = Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧЦ=10; ЧДЦ=0; ЧГ=0"); - UNIX = СтрЗаменить(UNIX, ",", ""); - UNIX = Лев(UNIX, 10); - - Возврат UNIX; - -КонецФункции - -Функция ИнформацияОПрогрессе(Знач Текущее, Знач Всего, Знач ЕдИзм, Знач Делитель = 1) Экспорт - - Целое = 100; - Текущее = Окр(Текущее / Делитель, 2); - Всего = Окр(Всего / Делитель, 2); - Процент = Цел(Текущее / Всего * Целое); - - СтрТекущее = ЧислоВСтроку(Текущее); - СтрВсего = ЧислоВСтроку(Всего); - СтрПроцент = ЧислоВСтроку(Процент); - - Информация = СтрТекущее + "/" + СтрВсего + " " + ЕдИзм + " ( " + СтрПроцент + "% )"; - - Возврат Информация; - -КонецФункции - -Функция ПреобразоватьДанныеСПолучениемРазмера(Данные, Знач МинимальныйРазмерДляПотока = 0) Экспорт - - Размер = 0; - - Если ТипЗнч(Данные) = Тип("Строка") Тогда - - ФайлНаДиске = Новый Файл(Данные); - - Если ФайлНаДиске.Существует() Тогда - Размер = ФайлНаДиске.Размер(); - Иначе - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); - Размер = Данные.Размер(); - КонецЕсли; - - Иначе - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); - Размер = Данные.Размер(); - КонецЕсли; - - Если ЗначениеЗаполнено(МинимальныйРазмерДляПотока) Тогда - Если Размер < МинимальныйРазмерДляПотока Тогда - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); - Иначе - OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные); - КонецЕсли; - Иначе - OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные); - КонецЕсли; - - Возврат Размер; - -КонецФункции - -Процедура ЗначениеВМассив(Значение) Экспорт - - Значение_ = Новый Массив; - Значение_.Добавить(Значение); - Значение = Значение_; - -КонецПроцедуры - -Процедура ЗаменитьСпецСимволы(Текст, Разметка = "Markdown") Экспорт - - СоответствиеСимволов = Новый Соответствие; - - Если Разметка = "HTML" Тогда - - СоответствиеСимволов.Вставить("&", "&"); - - ИначеЕсли Разметка = "MarkdownV2" Тогда - - СоответствиеСимволов.Вставить("-", "\-"); - СоответствиеСимволов.Вставить("+", "\+"); - СоответствиеСимволов.Вставить("#", "\#"); - СоответствиеСимволов.Вставить("=", "\="); - СоответствиеСимволов.Вставить("{", "\{"); - СоответствиеСимволов.Вставить("}", "\}"); - СоответствиеСимволов.Вставить(".", "\."); - - Иначе - Возврат; - КонецЕсли; - - Для Каждого СимволМассива Из СоответствиеСимволов Цикл - Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение); - КонецЦикла; - -КонецПроцедуры - -Процедура УдалитьПустыеПоляКоллекции(Коллекция) Экспорт - - ТипКоллекции = ТипЗнч(Коллекция); - ВыходнаяКоллекция = Новый(ТипКоллекции); - - Если ТипКоллекции = Тип("Соответствие") Или ТипКоллекции = Тип("Структура") Тогда - - УдалитьПустыеКлючиЗначения(Коллекция, ВыходнаяКоллекция); - - ИначеЕсли ТипКоллекции = Тип("Массив") Тогда - - УдалитьПустыеЭлементыМассива(Коллекция, ВыходнаяКоллекция); - - Иначе - - ВыходнаяКоллекция = Коллекция; - - КонецЕсли; - - Коллекция = ВыходнаяКоллекция; - -КонецПроцедуры - -Процедура Пауза(Знач Секунды) Экспорт - - Соединение = Новый HTTPСоединение("1C.ru", 11111, , , , Секунды); - Попытка - Соединение.Получить(Новый HTTPЗапрос("")); - Исключение - Возврат; - КонецПопытки; - -КонецПроцедуры - -Процедура ДобавитьПоле(Знач Имя, Знач Значение, Знач Тип, Коллекция) Экспорт - - Заполнено = ЗначениеЗаполнено(Значение); - - Если Не Заполнено Тогда - Возврат; - КонецЕсли; - - Если Тип = "Дата" Тогда - OPI_ПреобразованиеТипов.ПолучитьДату(Значение); - Значение = UNIXTime(Значение); - - ИначеЕсли Тип = "Коллекция" Тогда - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Значение); - - ИначеЕсли Тип = "Булево" Тогда - OPI_ПреобразованиеТипов.ПолучитьБулево(Значение); - - ИначеЕсли Тип = "СтрокаФайла" Тогда - OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение, Истина); - - ИначеЕсли Тип = "Массив" Тогда - OPI_ПреобразованиеТипов.ПолучитьМассив(Значение); - - ИначеЕсли Тип = "ДвоичныеДанные" Тогда - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Значение); - - ИначеЕсли Тип = "Число" Тогда - OPI_ПреобразованиеТипов.ПолучитьЧисло(Значение); - - Иначе - OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение); - - КонецЕсли; - - Коллекция.Вставить(Имя, Значение); - -КонецПроцедуры - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ВыполнитьЗапросСТелом(Знач URL - , Знач Вид - , Знач Параметры = "" - , Знач ДопЗаголовки = "" - , Знач JSON = Истина - , Знач ПолныйОтвет = Ложь - , Знач ФайлОтвета = Неопределено) - - Если Не ЗначениеЗаполнено(Параметры) Тогда - Параметры = Новый Структура; - КонецЕсли; - - ТипДанных = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8"); - СтруктураURL = РазбитьURL(URL); - Сервер = СтруктураURL["Сервер"]; - Адрес = СтруктураURL["Адрес"]; - - Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); - Соединение = СоздатьСоединение(Сервер); - - УстановитьТелоЗапроса(Запрос, Параметры, JSON); - - Если ЗначениеЗаполнено(ФайлОтвета) Тогда - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); - Иначе - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - КонецЕсли; - - Если ЭтоПереадресация(Ответ) Тогда - Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"] - , Вид - , Параметры - , ДопЗаголовки - , JSON - , ПолныйОтвет - , ФайлОтвета); - Иначе - ОбработатьОтвет(Ответ, ПолныйОтвет); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ВыполнитьЗапросСДвоичнымиДанными(Знач URL - , Знач Вид - , Знач Данные - , Знач ДопЗаголовки - , Знач ПолныйОтвет - , Знач ТипДанных) - - СтруктураURL = РазбитьURL(URL); - Сервер = СтруктураURL["Сервер"]; - Адрес = СтруктураURL["Адрес"]; - - Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); - Соединение = СоздатьСоединение(Сервер); - - Запрос.УстановитьТелоИзДвоичныхДанных(Данные); - - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - - Если ЭтоПереадресация(Ответ) Тогда - Ответ = ВыполнитьЗапросСДвоичнымиДанными(Ответ.Заголовки["Location"] - , Вид - , Данные - , ДопЗаголовки - , ПолныйОтвет - , ТипДанных); - Иначе - ОбработатьОтвет(Ответ, ПолныйОтвет); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ВыполнитьЗапросБезТела(Знач URL - , Знач Вид - , Знач Параметры = "" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) - - Если Не ЗначениеЗаполнено(Параметры) Тогда - Параметры = Новый Структура; - КонецЕсли; - - СтруктураURL = РазбитьURL(URL); - Сервер = СтруктураURL["Сервер"]; - Адрес = СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры); - - Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки); - Соединение = СоздатьСоединение(Сервер); - - Если ЗначениеЗаполнено(ФайлОтвета) Тогда - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); - Иначе - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - КонецЕсли; - - Если ЭтоПереадресация(Ответ) Тогда - Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, ФайлОтвета); - Иначе - ОбработатьОтвет(Ответ); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ВыполнитьЗапросМультипарт(Знач URL - , Знач Вид - , Знач Параметры = "" - , Знач Файлы = "" - , Знач ТипКонтента = "image/jpeg" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) - - Если Не ЗначениеЗаполнено(Параметры) Тогда - Параметры = Новый Структура; - КонецЕсли; - - Если Не ЗначениеЗаполнено(Файлы) Тогда - Файлы = Новый Соответствие; - КонецЕсли; - - Переадресация = 300; - Ошибка = 400; - Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); - РазделительСтрок = Символы.ВК + Символы.ПС; - ТипДанных = "multipart/form-data; boundary=" + Boundary; - СтруктураURL = РазбитьURL(URL); - Сервер = СтруктураURL["Сервер"]; - Адрес = СтруктураURL["Адрес"]; - - Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); - Соединение = СоздатьСоединение(Сервер); - - ТелоЗапроса = ПолучитьИмяВременногоФайла(); - ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса - , КодировкаТекста.UTF8 - , ПорядокБайтов.LittleEndian - , "" - , Ложь - , "" - , Ложь); - - ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры); - ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы); - - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок); - ЗаписьТекста.Закрыть(); - - Запрос.УстановитьИмяФайлаТела(ТелоЗапроса); - - Если ЗначениеЗаполнено(ФайлОтвета) Тогда - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); - Иначе - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - КонецЕсли; - - ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; - - Если ЭтоПереадресация Тогда - Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"] - , Вид - , Параметры - , Файлы - , ТипКонтента - , ДопЗаголовки - , ФайлОтвета); - Иначе - ОбработатьОтвет(Ответ); - КонецЕсли; - - Запрос = Неопределено; - ЗаписьТекста = Неопределено; - - УдалитьФайлы(ТелоЗапроса); - Возврат Ответ; - -КонецФункции - -Функция ВыполнитьЗапросМультипартРелэйтед(Знач URL - , Знач Вид - , Знач JSON = "" - , Знач Файлы = "" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) - - Переадресация = 300; - Ошибка = 400; - Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); - РазделительСтрок = Символы.ВК + Символы.ПС; - ТипДанных = "multipart/related; boundary=" + Boundary; - СтруктураURL = РазбитьURL(URL); - Сервер = СтруктураURL["Сервер"]; - Адрес = СтруктураURL["Адрес"]; - - Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); - Соединение = СоздатьСоединение(Сервер); - - ТелоЗапроса = ПолучитьИмяВременногоФайла(); - ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса - , КодировкаТекста.UTF8 - , ПорядокБайтов.LittleEndian - , "" - , Ложь - , "" - , Ложь); - - ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON); - ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы); - - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок); - ЗаписьТекста.Закрыть(); - - ДобавитьContentLength(Запрос); - - Запрос.УстановитьИмяФайлаТела(ТелоЗапроса); - - Если ЗначениеЗаполнено(ФайлОтвета) Тогда - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); - Иначе - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - КонецЕсли; - - ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; - - Если ЭтоПереадресация Тогда - Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"] - , Вид - , JSON - , Файлы - , ДопЗаголовки - , ФайлОтвета); - Иначе - ОбработатьОтвет(Ответ); - КонецЕсли; - - Запрос = Неопределено; - ЗаписьТекста = Неопределено; - - УдалитьФайлы(ТелоЗапроса); - Возврат Ответ; - -КонецФункции - -Функция ЭтоПереадресация(Знач Ответ) - - Переадресация = 300; - Ошибка = 400; - - ЭтоПереадресация = Ответ.КодСостояния >= Переадресация - И Ответ.КодСостояния < Ошибка - И ЗначениеЗаполнено(Ответ.Заголовки["Location"]); - - Возврат ЭтоПереадресация; - -КонецФункции - -Функция ПреобразоватьПараметрВСтроку(Знач Значение) - - Если ТипЗнч(Значение) = Тип("Массив") Тогда - Значение = СтрСоединить(Значение, ","); - Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL); - Значение = "[" + Значение + "]"; - Иначе - Значение = ЧислоВСтроку(Значение); - Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL); - КонецЕсли; - - Возврат Значение; - -КонецФункции - -Процедура УстановитьТелоЗапроса(Запрос, Знач Параметры, Знач JSON) - - Коллекция = ТипЗнч(Параметры) = Тип("Структура") - Или ТипЗнч(Параметры) = Тип("Соответствие") - Или ТипЗнч(Параметры) = Тип("Массив"); - - Если JSON Тогда - Данные = JSONСтрокой(Параметры); - ИначеЕсли Не Коллекция Тогда - Данные = Параметры; - Иначе - СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры); - Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); - КонецЕсли; - - Если ТипЗнч(Данные) = Тип("Строка") Тогда - Запрос.УстановитьТелоИзСтроки(Данные); - Иначе - //@skip-check wrong-type-expression - Запрос.УстановитьТелоИзДвоичныхДанных(Данные); - КонецЕсли; - -КонецПроцедуры - -Процедура ЗаписатьПараметрыМультипарт(ЗаписьТекста, Знач Boundary, Знач Параметры) - - РазделительСтрок = Символы.ВК + Символы.ПС; - - Для Каждого Параметр Из Параметры Цикл - - Если Параметр.Значение = Неопределено - Или Параметр.Значение = NULL Тогда - Продолжить; - КонецЕсли; - - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """"); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - - Если ТипЗнч(Параметр.Значение) = Тип("Строка") - Или ТипЗнч(Параметр.Значение) = Тип("Число") Тогда - - ЗначениеСтрокой = ЧислоВСтроку(Параметр.Значение); - ЗаписьТекста.ЗаписатьСтроку(ЗначениеСтрокой); - - ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Булево") Тогда - - ЗаписьТекста.ЗаписатьСтроку(?(Параметр.Значение, "true", "false")); - - Иначе - - ЗаписьТекста.Записать(Параметр.Значение); - - КонецЕсли; - - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - - КонецЦикла; - -КонецПроцедуры - -Процедура ЗаписатьФайлыМультипарт(ЗаписьТекста, Знач Boundary, Знач ТипКонтента, Знач Файлы) - - ТипКонтента = СокрЛП(ТипКонтента); - РазделительСтрок = Символы.ВК + Символы.ПС; - ЗаменаТочки = "___"; - - Для Каждого Файл Из Файлы Цикл - - ПутьФайл = СтрЗаменить(Файл.Ключ, ЗаменаТочки, "."); - - Если ТипКонтента = "image/jpeg" Тогда - ИмяФайлаОтправки = "photo"; - Иначе - ИмяФайлаОтправки = СтрЗаменить(Файл.Ключ, ЗаменаТочки, "."); - ИмяФайлаОтправки = Лев(ИмяФайлаОтправки, СтрНайти(ИмяФайлаОтправки, ".") - 1); - ИмяФайлаОтправки = ?(ЗначениеЗаполнено(ИмяФайлаОтправки), ИмяФайлаОтправки, СтрЗаменить(Файл.Ключ, - ЗаменаТочки, ".")); - КонецЕсли; - - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" - + ИмяФайлаОтправки - + """; filename=""" - + ПутьФайл - + """"); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - - Если ЗначениеЗаполнено(ТипКонтента) Тогда - ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + ТипКонтента); - КонецЕсли; - - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Значение); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - - КонецЦикла; - -КонецПроцедуры - -Процедура ЗаписатьФайлыРелэйтед(ЗаписьТекста, Знач Boundary, Знач Файлы) - - Если Не ЗначениеЗаполнено(Файлы) Тогда - Возврат; - КонецЕсли; - - РазделительСтрок = Символы.ВК + Символы.ПС; - - Если ТипЗнч(Файлы) = Тип("Соответствие") Тогда - Для Каждого Файл Из Файлы Цикл - - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + Файл.Значение); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Ключ); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры - -Процедура ЗаписатьДвоичныеДанные(ЗаписьДанных, Знач ДвоичныеДанные) - - РазмерЧасти = 268435456; - ПрочитанноБайт = 0; - ТекущаяПозиция = 0; - ОбщийРазмер = ДвоичныеДанные.Размер(); - - Пока ПрочитанноБайт < ОбщийРазмер Цикл - - ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные); - ПрочитанноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция); - Результат = ЧтениеДанных.Прочитать(РазмерЧасти); - ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); - РазмерТекущих = ТекущиеДанные.Размер(); - - Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда - Прервать; - КонецЕсли; - - ЗаписьДанных.Записать(ТекущиеДанные); - - ОсвободитьОбъект(ТекущиеДанные); - ВыполнитьСборкуМусора(); - - ТекущаяПозиция = ТекущаяПозиция + РазмерТекущих; - - КонецЦикла; - -КонецПроцедуры - -Процедура ЗаписатьJSONМультипарт(ЗаписьТекста, Знач Boundary, Знач JSON) - - Если Не ЗначениеЗаполнено(JSON) Тогда - Возврат; - КонецЕсли; - - РазделительСтрок = Символы.ВК + Символы.ПС; - - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку("Content-Type: application/json; charset=UTF-8"); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(JSON); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - -КонецПроцедуры - -Процедура ДобавитьContentLength(Запрос) - - ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные(); - - Если ЗначениеЗаполнено(ТелоЗапроса) Тогда - - Размер = ТелоЗапроса.Размер(); - Запрос.Заголовки.Вставить("Content-Length", ЧислоВСтроку(Размер)); - - КонецЕсли; - -КонецПроцедуры - -Процедура УдалитьПустыеКлючиЗначения(Знач Коллекция, ВыходнаяКоллекция) - - Для Каждого ЭлементКоллекции Из Коллекция Цикл - - Если Не ЭлементКоллекции.Значение = Неопределено И Не ЭлементКоллекции.Значение = NULL Тогда - ВыходнаяКоллекция.Вставить(ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Процедура УдалитьПустыеЭлементыМассива(Знач Коллекция, ВыходнаяКоллекция) - - Для Каждого ЭлементКоллекции Из Коллекция Цикл - - Если Не ЭлементКоллекции = Неопределено И Не ЭлементКоллекции = NULL Тогда - ВыходнаяКоллекция.Добавить(ЭлементКоллекции); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -#Область GZip - -// Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT -// Источник: https://github.com/vbondarevsky/Connector - -// Коннектор: удобный HTTP-клиент для 1С:Предприятие 8 -// -// Copyright 2017-2023 Vladimir Bondarevskiy -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// -// URL: https://github.com/vbondarevsky/Connector -// e-mail: vbondarevsky@gmail.com -// Версия: 2.4.8 -// -// Требования: платформа 1С версии 8.3.10 и выше - -Функция РаспаковатьОтвет(Ответ) - - Попытка - Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные()); - Исключение - Возврат Ответ; - КонецПопытки; - -КонецФункции - -Функция ПрочитатьGZip(СжатыеДанные) Экспорт - - РазмерПрефиксаGZip = 10; - РазмерПостфиксаGZip = 8; - - РазмерДД = ZipРазмерDD(); - РазмерСДХ = ZipРазмерCDH(); - РазмерЕСД = ZipРазмерEOCD(); - РазмерЛФХ = ZipРазмерLFH(); - - ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные); - ЧтениеДанных.Пропустить(РазмерПрефиксаGZip); - РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip; - - ПотокZip = Новый ПотокВПамяти(РазмерЛФХ - + РазмерСжатыхДанных - + РазмерДД - + РазмерСДХ - + РазмерЕСД); - - ЗаписьДанных = Новый ЗаписьДанных(ПотокZip); - ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH()); - ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных); - - ЗаписьДанных.Закрыть(); - ЗаписьДанных = Новый ЗаписьДанных(ПотокZip); - - CRC32 = ЧтениеДанных.ПрочитатьЦелое32(); - РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32(); - ЧтениеДанных.Закрыть(); - - ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)); - ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)); - ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных)); - ЗаписьДанных.Закрыть(); - - Возврат ПрочитатьZip(ПотокZip); - -КонецФункции - -Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено) - - Каталог = ПолучитьИмяВременногоФайла(); - ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные); - ИмяФайла = ЧтениеZip.Элементы[0].Имя; - Попытка - ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); - Исключение - // Игнорируем проверку целостности архива, просто читаем результат - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - КонецПопытки; - ЧтениеZip.Закрыть(); - - Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла); - УдалитьФайлы(Каталог); - - Возврат Результат; - -КонецФункции - -Функция ZipРазмерLFH() - - Возврат 34; - -КонецФункции - -Функция ZipРазмерDD() - - Возврат 16; - -КонецФункции - -Функция ZipРазмерCDH() - - Возврат 50; - -КонецФункции - -Функция ZipРазмерEOCD() - - Возврат 22; - -КонецФункции - -Функция ZipLFH() - - // Local file header - Буфер = Новый БуферДвоичныхДанных(ZipРазмерLFH()); - Буфер.ЗаписатьЦелое32(0, 67324752); // signature 0x04034b50 - Буфер.ЗаписатьЦелое16(4, 20); // version - Буфер.ЗаписатьЦелое16(6, 10); // bit flags - Буфер.ЗаписатьЦелое16(8, 8); // compression method - Буфер.ЗаписатьЦелое16(10, 0); // time - Буфер.ЗаписатьЦелое16(12, 0); // date - Буфер.ЗаписатьЦелое32(14, 0); // crc-32 - Буфер.ЗаписатьЦелое32(18, 0); // compressed size - Буфер.ЗаписатьЦелое32(22, 0); // uncompressed size - Буфер.ЗаписатьЦелое16(26, 4); // filename legth - "data" - Буфер.ЗаписатьЦелое16(28, 0); // extra field length - Буфер.Записать(30, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь)); - - Возврат Буфер; - -КонецФункции - -Функция ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных) - - // Data descriptor - Буфер = Новый БуферДвоичныхДанных(ZipРазмерDD()); - Буфер.ЗаписатьЦелое32(0, 134695760); - Буфер.ЗаписатьЦелое32(4, CRC32); - Буфер.ЗаписатьЦелое32(8, РазмерСжатыхДанных); - Буфер.ЗаписатьЦелое32(12, РазмерНесжатыхДанных); - - Возврат Буфер; - -КонецФункции - -Функция ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных) - - // Central directory header - Буфер = Новый БуферДвоичныхДанных(ZipРазмерCDH()); - Буфер.ЗаписатьЦелое32(0, 33639248); // signature 0x02014b50 - Буфер.ЗаписатьЦелое16(4, 798); // version made by - Буфер.ЗаписатьЦелое16(6, 20); // version needed to extract - Буфер.ЗаписатьЦелое16(8, 10); // bit flags - Буфер.ЗаписатьЦелое16(10, 8); // compression method - Буфер.ЗаписатьЦелое16(12, 0); // time - Буфер.ЗаписатьЦелое16(14, 0); // date - Буфер.ЗаписатьЦелое32(16, CRC32); // crc-32 - Буфер.ЗаписатьЦелое32(20, РазмерСжатыхДанных); // compressed size - Буфер.ЗаписатьЦелое32(24, РазмерНесжатыхДанных); // uncompressed size - Буфер.ЗаписатьЦелое16(28, 4); // file name length - Буфер.ЗаписатьЦелое16(30, 0); // extra field length - Буфер.ЗаписатьЦелое16(32, 0); // file comment length - Буфер.ЗаписатьЦелое16(34, 0); // disk number start - Буфер.ЗаписатьЦелое16(36, 0); // internal file attributes - Буфер.ЗаписатьЦелое32(38, 2176057344); // external file attributes - Буфер.ЗаписатьЦелое32(42, 0); // relative offset of local header - Буфер.Записать(46, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь)); - - Возврат Буфер; - -КонецФункции - -Функция ZipEOCD(РазмерСжатыхДанных) - - // End of central directory - РазмерCDH = 50; - Буфер = Новый БуферДвоичныхДанных(ZipРазмерEOCD()); - Буфер.ЗаписатьЦелое32(0, 101010256); // signature 0x06054b50 - Буфер.ЗаписатьЦелое16(4, 0); // number of this disk - Буфер.ЗаписатьЦелое16(6, 0); // number of the disk with the start of the central directory - Буфер.ЗаписатьЦелое16(8, 1); // total number of entries in the central directory on this disk - Буфер.ЗаписатьЦелое16(10, 1); // total number of entries in the central directory - Буфер.ЗаписатьЦелое32(12, РазмерCDH); // size of the central directory - // offset of start of central directory with respect to the starting disk number - Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD()); - Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number - - Возврат Буфер; - -КонецФункции - -#КонецОбласти - -#КонецОбласти +// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os + +// MIT License + +// Copyright (c) 2023 Anton Tsitavets + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +// https://github.com/Bayselonarrend/OpenIntegrations + +// BSLLS:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UnusedLocalVariable-off +// BSLLS:UsingServiceTag-off +// BSLLS:NumberOfOptionalParams-off + +//@skip-check module-unused-local-variable +//@skip-check method-too-many-params + +#Область СлужебныйПрограммныйИнтерфейс + +#Область HTTPМетоды + +#Область ЗапросыБезТела + +Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт + Возврат ВыполнитьЗапросБезТела(URL, "GET", Параметры, ДопЗаголовки, ФайлОтвета); +КонецФункции + +Функция Delete(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт + Возврат ВыполнитьЗапросБезТела(URL, "DELETE", Параметры, ДопЗаголовки, ФайлОтвета); +КонецФункции + +#КонецОбласти + +#Область ЗапросыСТелом + +Функция Post(Знач URL + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач JSON = Истина + , Знач ПолныйОтвет = Ложь + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросСТелом(URL, "POST", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета); + +КонецФункции + +Функция Patch(Знач URL + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач JSON = Истина + , Знач ПолныйОтвет = Ложь + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросСТелом(URL, "PATCH", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета); + +КонецФункции + +Функция Put(Знач URL + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач JSON = Истина + , Знач ПолныйОтвет = Ложь + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросСТелом(URL, "PUT", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета); + +КонецФункции + +Функция PostBinary(Знач URL + , Знач Тело + , Знач ДопЗаголовки + , Знач ПолныйОтвет = Ложь + , Знач ТипДанных = "application/octet-stream") Экспорт + + Возврат ВыполнитьЗапросСДвоичнымиДанными(URL, "POST", Тело, ДопЗаголовки, ПолныйОтвет, ТипДанных); + +КонецФункции + +#КонецОбласти + +#Область ЗапросыMultipart + +Функция PostMultipart(Знач URL + , Знач Параметры = "" + , Знач Файлы = "" + , Знач ТипКонтента = "image/jpeg" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросМультипарт(URL, "POST", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета); + +КонецФункции + +Функция PutMultipart(Знач URL + , Знач Параметры = "" + , Знач Файлы = "" + , Знач ТипКонтента = "image/jpeg" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросМультипарт(URL, "PUT", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета); + +КонецФункции + +Функция PostMultipartRelated(Знач URL + , Знач JSON = "" + , Знач Файлы = "" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "POST", JSON, Файлы, ДопЗаголовки, ФайлОтвета); + +КонецФункции + +Функция PatchMultipartRelated(Знач URL + , Знач JSON = "" + , Знач Файлы = "" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "PATCH", JSON, Файлы, ДопЗаголовки, ФайлОтвета); + +КонецФункции + +#КонецОбласти + +#Область Прочее + +Процедура ОбработатьОтвет(Ответ, Знач ПолныйОтвет = Ложь) Экспорт + + Если ПолныйОтвет Или ТипЗнч(Ответ) <> Тип("HTTPОтвет") Тогда + Возврат; + КонецЕсли; + + ФайлТела = Ответ.ПолучитьИмяФайлаТела(); + + Если Не ФайлТела = Неопределено Тогда + Ответ = ФайлТела; + Возврат; + КонецЕсли; + + GZip = "gzip"; + НужнаРаспаковка = + Ответ.Заголовки.Получить("Content-Encoding") = GZip + Или Ответ.Заголовки.Получить("content-encoding") = GZip; + + Если НужнаРаспаковка Тогда + Ответ = РаспаковатьОтвет(Ответ); + КонецЕсли; + + Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ); + + Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда + + Попытка + Ответ = JsonВСтруктуру(Ответ); + Исключение + Возврат; + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры + +Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "") Экспорт + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Accept-Encoding", "gzip"); + Заголовки.Вставить("Accept" , "*/*"); + Заголовки.Вставить("Connection" , "keep-alive"); + Заголовки.Вставить("Accept-Charset" , "utf-8"); + + Если ЗначениеЗаполнено(ТипДанных) Тогда + Заголовки.Вставить("Content-Type", ТипДанных); + КонецЕсли; + + Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда + + Для Каждого Заголовок Из ДопЗаголовки Цикл + Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение); + КонецЦикла; + + КонецЕсли; + + НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки); + + Возврат НовыйЗапрос; + +КонецФункции + +Функция СоздатьСоединение(Знач Сервер, Знач Пользователь = "", Знач Пароль = "") Экспорт + + Попытка + SSL = Новый ЗащищенноеСоединениеOpenSSL; + Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000, SSL); + Исключение + Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000); + КонецПопытки; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область Служебные + +Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт + + Если Параметры.Количество() = 0 Тогда + Возврат ""; + КонецЕсли; + + СтрокаПараметров = "?"; + + Для Каждого Параметр Из Параметры Цикл + + ЗначениеПараметра = ПреобразоватьПараметрВСтроку(Параметр.Значение); + + СтрокаПараметров = СтрокаПараметров + + Параметр.Ключ + + "=" + + ЗначениеПараметра + + "&"; + КонецЦикла; + + СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); + + Возврат СтрокаПараметров; + +КонецФункции + +Функция РазбитьURL(Знач URL) Экспорт + + URL = СтрЗаменить(URL, "https://", ""); + URL = СтрЗаменить(URL, "http://", ""); + URL = СтрЗаменить(URL, ":443", ""); + + Адрес = Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1); + Сервер = Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1); + + Попытка + SSL = Новый ЗащищенноеСоединениеOpenSSL; + Исключение + Сервер = "https://" + Сервер; + КонецПопытки; + + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("Сервер", Сервер); + СтруктураВозврата.Вставить("Адрес" , Адрес); + + Возврат СтруктураВозврата; + +КонецФункции + +Функция JsonВСтруктуру(Знач Текст) Экспорт + + Если Не ЗначениеЗаполнено(Текст) Тогда + Возврат ""; + КонецЕсли; + + Текст = ?(ТипЗнч(Текст) = Тип("ДвоичныеДанные"), ПолучитьСтрокуИзДвоичныхДанных(Текст), Текст); + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(Текст); + + Данные = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO); + ЧтениеJSON.Закрыть(); + + Возврат Данные; + +КонецФункции + +Функция JSONСтрокой(Знач Данные, Знач Экранирование = "Нет") Экспорт + + ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows + , " " + , Истина + , ЭкранированиеСимволовJSON[Экранирование] + , Ложь + , Ложь + , Ложь + , Ложь); + + Попытка + + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.УстановитьСтроку(ПараметрыJSON); + + ЗаписатьJSON(ЗаписьJSON, Данные); + Возврат ЗаписьJSON.Закрыть(); + + Исключение + Возврат "НЕ JSON: " + Строка(Данные); + КонецПопытки; + +КонецФункции + +Функция ЧислоВСтроку(Знач Число) Экспорт + Возврат СтрЗаменить(Строка(Число), Символы.НПП, ""); +КонецФункции + +Функция ПрочитатьJSONФайл(Знач Путь) Экспорт + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.ОткрытьФайл(Путь); + Значения = ПрочитатьJSON(ЧтениеJSON); + + ЧтениеJSON.Закрыть(); + + Возврат Значения; + +КонецФункции + +Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт + + СоответствиеВозврата = Новый Соответствие; + КоличествоЧастей = 2; + МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь); + + Для Каждого Параметр Из МассивПараметров Цикл + + МассивКлючЗначение = СтрРазделить(Параметр, "="); + + Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда + СоответствиеВозврата.Вставить(МассивКлючЗначение[0], МассивКлючЗначение[1]); + КонецЕсли; + + КонецЦикла; + + Возврат СоответствиеВозврата; + +КонецФункции + +Функция ПолучитьТекущуюДату() Экспорт + Возврат МестноеВремя(ТекущаяУниверсальнаяДата()); +КонецФункции + +Функция UNIXTime(Знач Дата) Экспорт + + ОТД = Новый ОписаниеТипов("Дата"); + Дата = ОТД.ПривестиЗначение(Дата); + + UNIX = Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧЦ=10; ЧДЦ=0; ЧГ=0"); + UNIX = СтрЗаменить(UNIX, ",", ""); + UNIX = Лев(UNIX, 10); + + Возврат UNIX; + +КонецФункции + +Функция ИнформацияОПрогрессе(Знач Текущее, Знач Всего, Знач ЕдИзм, Знач Делитель = 1) Экспорт + + Целое = 100; + Текущее = Окр(Текущее / Делитель, 2); + Всего = Окр(Всего / Делитель, 2); + Процент = Цел(Текущее / Всего * Целое); + + СтрТекущее = ЧислоВСтроку(Текущее); + СтрВсего = ЧислоВСтроку(Всего); + СтрПроцент = ЧислоВСтроку(Процент); + + Информация = СтрТекущее + "/" + СтрВсего + " " + ЕдИзм + " ( " + СтрПроцент + "% )"; + + Возврат Информация; + +КонецФункции + +Функция ПреобразоватьДанныеСПолучениемРазмера(Данные, Знач МинимальныйРазмерДляПотока = 0) Экспорт + + Размер = 0; + + Если ТипЗнч(Данные) = Тип("Строка") Тогда + + ФайлНаДиске = Новый Файл(Данные); + + Если ФайлНаДиске.Существует() Тогда + Размер = ФайлНаДиске.Размер(); + Иначе + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); + Размер = Данные.Размер(); + КонецЕсли; + + Иначе + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); + Размер = Данные.Размер(); + КонецЕсли; + + Если ЗначениеЗаполнено(МинимальныйРазмерДляПотока) Тогда + Если Размер < МинимальныйРазмерДляПотока Тогда + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); + Иначе + OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные); + КонецЕсли; + Иначе + OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные); + КонецЕсли; + + Возврат Размер; + +КонецФункции + +Процедура ЗначениеВМассив(Значение) Экспорт + + Значение_ = Новый Массив; + Значение_.Добавить(Значение); + Значение = Значение_; + +КонецПроцедуры + +Процедура ЗаменитьСпецСимволы(Текст, Разметка = "Markdown") Экспорт + + СоответствиеСимволов = Новый Соответствие; + + Если Разметка = "HTML" Тогда + + СоответствиеСимволов.Вставить("&", "&"); + + ИначеЕсли Разметка = "MarkdownV2" Тогда + + СоответствиеСимволов.Вставить("-", "\-"); + СоответствиеСимволов.Вставить("+", "\+"); + СоответствиеСимволов.Вставить("#", "\#"); + СоответствиеСимволов.Вставить("=", "\="); + СоответствиеСимволов.Вставить("{", "\{"); + СоответствиеСимволов.Вставить("}", "\}"); + СоответствиеСимволов.Вставить(".", "\."); + + Иначе + Возврат; + КонецЕсли; + + Для Каждого СимволМассива Из СоответствиеСимволов Цикл + Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение); + КонецЦикла; + +КонецПроцедуры + +Процедура УдалитьПустыеПоляКоллекции(Коллекция) Экспорт + + ТипКоллекции = ТипЗнч(Коллекция); + ВыходнаяКоллекция = Новый(ТипКоллекции); + + Если ТипКоллекции = Тип("Соответствие") Или ТипКоллекции = Тип("Структура") Тогда + + УдалитьПустыеКлючиЗначения(Коллекция, ВыходнаяКоллекция); + + ИначеЕсли ТипКоллекции = Тип("Массив") Тогда + + УдалитьПустыеЭлементыМассива(Коллекция, ВыходнаяКоллекция); + + Иначе + + ВыходнаяКоллекция = Коллекция; + + КонецЕсли; + + Коллекция = ВыходнаяКоллекция; + +КонецПроцедуры + +Процедура Пауза(Знач Секунды) Экспорт + + Соединение = Новый HTTPСоединение("1C.ru", 11111, , , , Секунды); + Попытка + Соединение.Получить(Новый HTTPЗапрос("")); + Исключение + Возврат; + КонецПопытки; + +КонецПроцедуры + +Процедура ДобавитьПоле(Знач Имя, Знач Значение, Знач Тип, Коллекция) Экспорт + + Заполнено = ЗначениеЗаполнено(Значение); + + Если Не Заполнено Тогда + Возврат; + КонецЕсли; + + Если Тип = "Дата" Тогда + OPI_ПреобразованиеТипов.ПолучитьДату(Значение); + Значение = UNIXTime(Значение); + + ИначеЕсли Тип = "Коллекция" Тогда + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Значение); + + ИначеЕсли Тип = "Булево" Тогда + OPI_ПреобразованиеТипов.ПолучитьБулево(Значение); + + ИначеЕсли Тип = "СтрокаФайла" Тогда + OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение, Истина); + + ИначеЕсли Тип = "Массив" Тогда + OPI_ПреобразованиеТипов.ПолучитьМассив(Значение); + + ИначеЕсли Тип = "ДвоичныеДанные" Тогда + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Значение); + + ИначеЕсли Тип = "Число" Тогда + OPI_ПреобразованиеТипов.ПолучитьЧисло(Значение); + + Иначе + OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение); + + КонецЕсли; + + Коллекция.Вставить(Имя, Значение); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ВыполнитьЗапросСТелом(Знач URL + , Знач Вид + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач JSON = Истина + , Знач ПолныйОтвет = Ложь + , Знач ФайлОтвета = Неопределено) + + Если Не ЗначениеЗаполнено(Параметры) Тогда + Параметры = Новый Структура; + КонецЕсли; + + ТипДанных = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8"); + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"]; + + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); + Соединение = СоздатьСоединение(Сервер); + + УстановитьТелоЗапроса(Запрос, Параметры, JSON); + + Если ЗначениеЗаполнено(ФайлОтвета) Тогда + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); + Иначе + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + КонецЕсли; + + Если ЭтоПереадресация(Ответ) Тогда + Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"] + , Вид + , Параметры + , ДопЗаголовки + , JSON + , ПолныйОтвет + , ФайлОтвета); + Иначе + ОбработатьОтвет(Ответ, ПолныйОтвет); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ВыполнитьЗапросСДвоичнымиДанными(Знач URL + , Знач Вид + , Знач Данные + , Знач ДопЗаголовки + , Знач ПолныйОтвет + , Знач ТипДанных) + + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"]; + + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); + Соединение = СоздатьСоединение(Сервер); + + Запрос.УстановитьТелоИзДвоичныхДанных(Данные); + + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + + Если ЭтоПереадресация(Ответ) Тогда + Ответ = ВыполнитьЗапросСДвоичнымиДанными(Ответ.Заголовки["Location"] + , Вид + , Данные + , ДопЗаголовки + , ПолныйОтвет + , ТипДанных); + Иначе + ОбработатьОтвет(Ответ, ПолныйОтвет); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ВыполнитьЗапросБезТела(Знач URL + , Знач Вид + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) + + Если Не ЗначениеЗаполнено(Параметры) Тогда + Параметры = Новый Структура; + КонецЕсли; + + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры); + + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки); + Соединение = СоздатьСоединение(Сервер); + + Если ЗначениеЗаполнено(ФайлОтвета) Тогда + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); + Иначе + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + КонецЕсли; + + Если ЭтоПереадресация(Ответ) Тогда + Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, ФайлОтвета); + Иначе + ОбработатьОтвет(Ответ); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ВыполнитьЗапросМультипарт(Знач URL + , Знач Вид + , Знач Параметры = "" + , Знач Файлы = "" + , Знач ТипКонтента = "image/jpeg" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) + + Если Не ЗначениеЗаполнено(Параметры) Тогда + Параметры = Новый Структура; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Файлы) Тогда + Файлы = Новый Соответствие; + КонецЕсли; + + Переадресация = 300; + Ошибка = 400; + Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); + РазделительСтрок = Символы.ВК + Символы.ПС; + ТипДанных = "multipart/form-data; boundary=" + Boundary; + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"]; + + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); + Соединение = СоздатьСоединение(Сервер); + + ТелоЗапроса = ПолучитьИмяВременногоФайла(); + ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса + , КодировкаТекста.UTF8 + , ПорядокБайтов.LittleEndian + , "" + , Ложь + , "" + , Ложь); + + ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры); + ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы); + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок); + ЗаписьТекста.Закрыть(); + + Запрос.УстановитьИмяФайлаТела(ТелоЗапроса); + + Если ЗначениеЗаполнено(ФайлОтвета) Тогда + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); + Иначе + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + КонецЕсли; + + ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; + + Если ЭтоПереадресация Тогда + Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"] + , Вид + , Параметры + , Файлы + , ТипКонтента + , ДопЗаголовки + , ФайлОтвета); + Иначе + ОбработатьОтвет(Ответ); + КонецЕсли; + + Запрос = Неопределено; + ЗаписьТекста = Неопределено; + + УдалитьФайлы(ТелоЗапроса); + Возврат Ответ; + +КонецФункции + +Функция ВыполнитьЗапросМультипартРелэйтед(Знач URL + , Знач Вид + , Знач JSON = "" + , Знач Файлы = "" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) + + Переадресация = 300; + Ошибка = 400; + Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); + РазделительСтрок = Символы.ВК + Символы.ПС; + ТипДанных = "multipart/related; boundary=" + Boundary; + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"]; + + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); + Соединение = СоздатьСоединение(Сервер); + + ТелоЗапроса = ПолучитьИмяВременногоФайла(); + ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса + , КодировкаТекста.UTF8 + , ПорядокБайтов.LittleEndian + , "" + , Ложь + , "" + , Ложь); + + ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON); + ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы); + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок); + ЗаписьТекста.Закрыть(); + + ДобавитьContentLength(Запрос); + + Запрос.УстановитьИмяФайлаТела(ТелоЗапроса); + + Если ЗначениеЗаполнено(ФайлОтвета) Тогда + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); + Иначе + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + КонецЕсли; + + ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; + + Если ЭтоПереадресация Тогда + Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"] + , Вид + , JSON + , Файлы + , ДопЗаголовки + , ФайлОтвета); + Иначе + ОбработатьОтвет(Ответ); + КонецЕсли; + + Запрос = Неопределено; + ЗаписьТекста = Неопределено; + + УдалитьФайлы(ТелоЗапроса); + Возврат Ответ; + +КонецФункции + +Функция ЭтоПереадресация(Знач Ответ) + + Переадресация = 300; + Ошибка = 400; + + ЭтоПереадресация = Ответ.КодСостояния >= Переадресация + И Ответ.КодСостояния < Ошибка + И ЗначениеЗаполнено(Ответ.Заголовки["Location"]); + + Возврат ЭтоПереадресация; + +КонецФункции + +Функция ПреобразоватьПараметрВСтроку(Знач Значение) + + Если ТипЗнч(Значение) = Тип("Массив") Тогда + Значение = СтрСоединить(Значение, ","); + Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL); + Значение = "[" + Значение + "]"; + Иначе + Значение = ЧислоВСтроку(Значение); + Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL); + КонецЕсли; + + Возврат Значение; + +КонецФункции + +Процедура УстановитьТелоЗапроса(Запрос, Знач Параметры, Знач JSON) + + Коллекция = ТипЗнч(Параметры) = Тип("Структура") + Или ТипЗнч(Параметры) = Тип("Соответствие") + Или ТипЗнч(Параметры) = Тип("Массив"); + + Если JSON Тогда + Данные = JSONСтрокой(Параметры); + ИначеЕсли Не Коллекция Тогда + Данные = Параметры; + Иначе + СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры); + Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); + КонецЕсли; + + Если ТипЗнч(Данные) = Тип("Строка") Тогда + Запрос.УстановитьТелоИзСтроки(Данные); + Иначе + //@skip-check wrong-type-expression + Запрос.УстановитьТелоИзДвоичныхДанных(Данные); + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписатьПараметрыМультипарт(ЗаписьТекста, Знач Boundary, Знач Параметры) + + РазделительСтрок = Символы.ВК + Символы.ПС; + + Для Каждого Параметр Из Параметры Цикл + + Если Параметр.Значение = Неопределено + Или Параметр.Значение = NULL Тогда + Продолжить; + КонецЕсли; + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """"); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + + Если ТипЗнч(Параметр.Значение) = Тип("Строка") + Или ТипЗнч(Параметр.Значение) = Тип("Число") Тогда + + ЗначениеСтрокой = ЧислоВСтроку(Параметр.Значение); + ЗаписьТекста.ЗаписатьСтроку(ЗначениеСтрокой); + + ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Булево") Тогда + + ЗаписьТекста.ЗаписатьСтроку(?(Параметр.Значение, "true", "false")); + + Иначе + + ЗаписьТекста.Записать(Параметр.Значение); + + КонецЕсли; + + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаписатьФайлыМультипарт(ЗаписьТекста, Знач Boundary, Знач ТипКонтента, Знач Файлы) + + ТипКонтента = СокрЛП(ТипКонтента); + РазделительСтрок = Символы.ВК + Символы.ПС; + ЗаменаТочки = "___"; + + Для Каждого Файл Из Файлы Цикл + + ПутьФайл = СтрЗаменить(Файл.Ключ, ЗаменаТочки, "."); + + Если ТипКонтента = "image/jpeg" Тогда + ИмяФайлаОтправки = "photo"; + Иначе + ИмяФайлаОтправки = СтрЗаменить(Файл.Ключ, ЗаменаТочки, "."); + ИмяФайлаОтправки = Лев(ИмяФайлаОтправки, СтрНайти(ИмяФайлаОтправки, ".") - 1); + ИмяФайлаОтправки = ?(ЗначениеЗаполнено(ИмяФайлаОтправки), ИмяФайлаОтправки, СтрЗаменить(Файл.Ключ, + ЗаменаТочки, ".")); + КонецЕсли; + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + + ИмяФайлаОтправки + + """; filename=""" + + ПутьФайл + + """"); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + + Если ЗначениеЗаполнено(ТипКонтента) Тогда + ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + ТипКонтента); + КонецЕсли; + + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Значение); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаписатьФайлыРелэйтед(ЗаписьТекста, Знач Boundary, Знач Файлы) + + Если Не ЗначениеЗаполнено(Файлы) Тогда + Возврат; + КонецЕсли; + + РазделительСтрок = Символы.ВК + Символы.ПС; + + Если ТипЗнч(Файлы) = Тип("Соответствие") Тогда + Для Каждого Файл Из Файлы Цикл + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + Файл.Значение); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Ключ); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписатьДвоичныеДанные(ЗаписьДанных, Знач ДвоичныеДанные) + + РазмерЧасти = 268435456; + ПрочитанноБайт = 0; + ТекущаяПозиция = 0; + ОбщийРазмер = ДвоичныеДанные.Размер(); + + Пока ПрочитанноБайт < ОбщийРазмер Цикл + + ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные); + ПрочитанноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция); + Результат = ЧтениеДанных.Прочитать(РазмерЧасти); + ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); + РазмерТекущих = ТекущиеДанные.Размер(); + + Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда + Прервать; + КонецЕсли; + + ЗаписьДанных.Записать(ТекущиеДанные); + + ОсвободитьОбъект(ТекущиеДанные); + ВыполнитьСборкуМусора(); + + ТекущаяПозиция = ТекущаяПозиция + РазмерТекущих; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаписатьJSONМультипарт(ЗаписьТекста, Знач Boundary, Знач JSON) + + Если Не ЗначениеЗаполнено(JSON) Тогда + Возврат; + КонецЕсли; + + РазделительСтрок = Символы.ВК + Символы.ПС; + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку("Content-Type: application/json; charset=UTF-8"); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(JSON); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + +КонецПроцедуры + +Процедура ДобавитьContentLength(Запрос) + + ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные(); + + Если ЗначениеЗаполнено(ТелоЗапроса) Тогда + + Размер = ТелоЗапроса.Размер(); + Запрос.Заголовки.Вставить("Content-Length", ЧислоВСтроку(Размер)); + + КонецЕсли; + +КонецПроцедуры + +Процедура УдалитьПустыеКлючиЗначения(Знач Коллекция, ВыходнаяКоллекция) + + Для Каждого ЭлементКоллекции Из Коллекция Цикл + + Если Не ЭлементКоллекции.Значение = Неопределено И Не ЭлементКоллекции.Значение = NULL Тогда + ВыходнаяКоллекция.Вставить(ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура УдалитьПустыеЭлементыМассива(Знач Коллекция, ВыходнаяКоллекция) + + Для Каждого ЭлементКоллекции Из Коллекция Цикл + + Если Не ЭлементКоллекции = Неопределено И Не ЭлементКоллекции = NULL Тогда + ВыходнаяКоллекция.Добавить(ЭлементКоллекции); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#Область GZip + +// Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT +// Источник: https://github.com/vbondarevsky/Connector + +// Коннектор: удобный HTTP-клиент для 1С:Предприятие 8 +// +// Copyright 2017-2023 Vladimir Bondarevskiy +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// URL: https://github.com/vbondarevsky/Connector +// e-mail: vbondarevsky@gmail.com +// Версия: 2.4.8 +// +// Требования: платформа 1С версии 8.3.10 и выше + +Функция РаспаковатьОтвет(Ответ) + + Попытка + Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные()); + Исключение + Возврат Ответ; + КонецПопытки; + +КонецФункции + +Функция ПрочитатьGZip(СжатыеДанные) Экспорт + + РазмерПрефиксаGZip = 10; + РазмерПостфиксаGZip = 8; + + РазмерДД = ZipРазмерDD(); + РазмерСДХ = ZipРазмерCDH(); + РазмерЕСД = ZipРазмерEOCD(); + РазмерЛФХ = ZipРазмерLFH(); + + ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные); + ЧтениеДанных.Пропустить(РазмерПрефиксаGZip); + РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip; + + ПотокZip = Новый ПотокВПамяти(РазмерЛФХ + + РазмерСжатыхДанных + + РазмерДД + + РазмерСДХ + + РазмерЕСД); + + ЗаписьДанных = Новый ЗаписьДанных(ПотокZip); + ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH()); + ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных); + + ЗаписьДанных.Закрыть(); + ЗаписьДанных = Новый ЗаписьДанных(ПотокZip); + + CRC32 = ЧтениеДанных.ПрочитатьЦелое32(); + РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32(); + ЧтениеДанных.Закрыть(); + + ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)); + ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)); + ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных)); + ЗаписьДанных.Закрыть(); + + Возврат ПрочитатьZip(ПотокZip); + +КонецФункции + +Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено) + + Каталог = ПолучитьИмяВременногоФайла(); + ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные); + ИмяФайла = ЧтениеZip.Элементы[0].Имя; + Попытка + ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); + Исключение + // Игнорируем проверку целостности архива, просто читаем результат + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + ЧтениеZip.Закрыть(); + + Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла); + УдалитьФайлы(Каталог); + + Возврат Результат; + +КонецФункции + +Функция ZipРазмерLFH() + + Возврат 34; + +КонецФункции + +Функция ZipРазмерDD() + + Возврат 16; + +КонецФункции + +Функция ZipРазмерCDH() + + Возврат 50; + +КонецФункции + +Функция ZipРазмерEOCD() + + Возврат 22; + +КонецФункции + +Функция ZipLFH() + + // Local file header + Буфер = Новый БуферДвоичныхДанных(ZipРазмерLFH()); + Буфер.ЗаписатьЦелое32(0, 67324752); // signature 0x04034b50 + Буфер.ЗаписатьЦелое16(4, 20); // version + Буфер.ЗаписатьЦелое16(6, 10); // bit flags + Буфер.ЗаписатьЦелое16(8, 8); // compression method + Буфер.ЗаписатьЦелое16(10, 0); // time + Буфер.ЗаписатьЦелое16(12, 0); // date + Буфер.ЗаписатьЦелое32(14, 0); // crc-32 + Буфер.ЗаписатьЦелое32(18, 0); // compressed size + Буфер.ЗаписатьЦелое32(22, 0); // uncompressed size + Буфер.ЗаписатьЦелое16(26, 4); // filename legth - "data" + Буфер.ЗаписатьЦелое16(28, 0); // extra field length + Буфер.Записать(30, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь)); + + Возврат Буфер; + +КонецФункции + +Функция ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных) + + // Data descriptor + Буфер = Новый БуферДвоичныхДанных(ZipРазмерDD()); + Буфер.ЗаписатьЦелое32(0, 134695760); + Буфер.ЗаписатьЦелое32(4, CRC32); + Буфер.ЗаписатьЦелое32(8, РазмерСжатыхДанных); + Буфер.ЗаписатьЦелое32(12, РазмерНесжатыхДанных); + + Возврат Буфер; + +КонецФункции + +Функция ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных) + + // Central directory header + Буфер = Новый БуферДвоичныхДанных(ZipРазмерCDH()); + Буфер.ЗаписатьЦелое32(0, 33639248); // signature 0x02014b50 + Буфер.ЗаписатьЦелое16(4, 798); // version made by + Буфер.ЗаписатьЦелое16(6, 20); // version needed to extract + Буфер.ЗаписатьЦелое16(8, 10); // bit flags + Буфер.ЗаписатьЦелое16(10, 8); // compression method + Буфер.ЗаписатьЦелое16(12, 0); // time + Буфер.ЗаписатьЦелое16(14, 0); // date + Буфер.ЗаписатьЦелое32(16, CRC32); // crc-32 + Буфер.ЗаписатьЦелое32(20, РазмерСжатыхДанных); // compressed size + Буфер.ЗаписатьЦелое32(24, РазмерНесжатыхДанных); // uncompressed size + Буфер.ЗаписатьЦелое16(28, 4); // file name length + Буфер.ЗаписатьЦелое16(30, 0); // extra field length + Буфер.ЗаписатьЦелое16(32, 0); // file comment length + Буфер.ЗаписатьЦелое16(34, 0); // disk number start + Буфер.ЗаписатьЦелое16(36, 0); // internal file attributes + Буфер.ЗаписатьЦелое32(38, 2176057344); // external file attributes + Буфер.ЗаписатьЦелое32(42, 0); // relative offset of local header + Буфер.Записать(46, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь)); + + Возврат Буфер; + +КонецФункции + +Функция ZipEOCD(РазмерСжатыхДанных) + + // End of central directory + РазмерCDH = 50; + Буфер = Новый БуферДвоичныхДанных(ZipРазмерEOCD()); + Буфер.ЗаписатьЦелое32(0, 101010256); // signature 0x06054b50 + Буфер.ЗаписатьЦелое16(4, 0); // number of this disk + Буфер.ЗаписатьЦелое16(6, 0); // number of the disk with the start of the central directory + Буфер.ЗаписатьЦелое16(8, 1); // total number of entries in the central directory on this disk + Буфер.ЗаписатьЦелое16(10, 1); // total number of entries in the central directory + Буфер.ЗаписатьЦелое32(12, РазмерCDH); // size of the central directory + // offset of start of central directory with respect to the starting disk number + Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD()); + Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number + + Возврат Буфер; + +КонецФункции + +#КонецОбласти + +#КонецОбласти diff --git a/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os b/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os index 57f73e85f9..0c2132b95c 100644 --- a/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os +++ b/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os @@ -1,110 +1,110 @@ -// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os - -// 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:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:UnusedLocalVariable-off - -#Область СлужебныйПрограммныйИнтерфейс - -#Область БСП - -/////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2019, ООО 1С-Софт -// Все права защищены. Эта программа и сопроводительные материалы предоставляются -// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) -// Текст лицензии доступен по ссылке: -// https://creativecommons.org/licenses/by/4.0/legalcode -/////////////////////////////////////////////////////////////////////////////////////////////////////// - -Функция HMACSHA256(Знач Ключ, Знач Данные) Экспорт - - Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64); - -КонецФункции - -Функция Хеш(ДвоичныеДанные, Тип) Экспорт - - Хеширование = Новый ХешированиеДанных(Тип); - Хеширование.Добавить(ДвоичныеДанные); - - Возврат Хеширование.ХешСумма; - -КонецФункции - -Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт - - Дважды = 2; - - Если Ключ.Размер() > РазмерБлока Тогда - Ключ = Хеш(Ключ, Тип); - КонецЕсли; - - Если Ключ.Размер() <= РазмерБлока Тогда - Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ); - Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * Дважды); - КонецЕсли; - - Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ)); - - Ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока)); - Opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока)); - - Ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ); - Ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad); - - Opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ); - Okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad); - - Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип); - -КонецФункции - -Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2) Экспорт - - МассивДвоичныхДанных = Новый Массив; - МассивДвоичныхДанных.Добавить(ДвоичныеДанные1); - МассивДвоичныхДанных.Добавить(ДвоичныеДанные2); - - Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных); - -КонецФункции - -Функция ПовторитьСтроку(Строка, Количество) Экспорт - - Части = Новый Массив(Количество); - - Для К = 1 По Количество Цикл - Части.Добавить(Строка); - КонецЦикла; - - Возврат СтрСоединить(Части, ""); - -КонецФункции - -#КонецОбласти - -#КонецОбласти +// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os + +// 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:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UnusedLocalVariable-off + +#Область СлужебныйПрограммныйИнтерфейс + +#Область БСП + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2019, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +Функция HMACSHA256(Знач Ключ, Знач Данные) Экспорт + + Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64); + +КонецФункции + +Функция Хеш(ДвоичныеДанные, Тип) Экспорт + + Хеширование = Новый ХешированиеДанных(Тип); + Хеширование.Добавить(ДвоичныеДанные); + + Возврат Хеширование.ХешСумма; + +КонецФункции + +Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт + + Дважды = 2; + + Если Ключ.Размер() > РазмерБлока Тогда + Ключ = Хеш(Ключ, Тип); + КонецЕсли; + + Если Ключ.Размер() <= РазмерБлока Тогда + Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ); + Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * Дважды); + КонецЕсли; + + Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ)); + + Ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока)); + Opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока)); + + Ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ); + Ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad); + + Opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ); + Okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad); + + Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип); + +КонецФункции + +Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2) Экспорт + + МассивДвоичныхДанных = Новый Массив; + МассивДвоичныхДанных.Добавить(ДвоичныеДанные1); + МассивДвоичныхДанных.Добавить(ДвоичныеДанные2); + + Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных); + +КонецФункции + +Функция ПовторитьСтроку(Строка, Количество) Экспорт + + Части = Новый Массив(Количество); + + Для К = 1 По Количество Цикл + Части.Добавить(Строка); + КонецЦикла; + + Возврат СтрСоединить(Части, ""); + +КонецФункции + +#КонецОбласти + +#КонецОбласти