1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-11-24 08:52:18 +02:00

VK: Изменение механизма загрузки фото, начало методов market

This commit is contained in:
Anton 2024-02-14 19:12:01 +03:00
parent c3353d91cc
commit 725090fece
3 changed files with 290 additions and 107 deletions

View File

@ -40,7 +40,7 @@
// access_token нужно будет забрать из параметра в строке адреса браузера
Возврат "https://oauth.vk.com/authorize?client_id=" + OPI_Инструменты.ЧислоВСтроку(App_id)
+ "&scope=offline,wall,groups,photos,stats,stories,ads"
+ "&scope=offline,wall,groups,photos,stats,stories,ads,market"
+ "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html";
КонецФункции
@ -68,9 +68,6 @@
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
СтрокаВложений = "";
Hash = "hash";
Photo = "photo";
Serv = "server";
Если Не ТипЗнч(МассивКартинок) = Тип("Массив") Тогда
@ -82,44 +79,15 @@
Для Каждого КартинкаПоста Из МассивКартинок Цикл
Файлы = Новый Соответствие;
Ответ = ЗагрузитьФотоНаСервер(КартинкаПоста, Параметры_);
Если ТипЗнч(КартинкаПоста) = Тип("Строка") Тогда
КлючКартинка = СтрЗаменить(КартинкаПоста, ".", "___");
ЗначениеКартинка = Новый ДвоичныеДанные(КартинкаПоста);
Иначе
//@skip-check missing-temporary-file-deletion
// BSLLS:MissingTemporaryFileDeletion-off
КлючКартинка = СтрЗаменить(ПолучитьИмяВременногоФайла("jpeg"), ".", "___");
ЗначениеКартинка = КартинкаПоста;
КонецЕсли;
Файлы.Вставить(КлючКартинка, ЗначениеКартинка);
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.getWallUploadServer", Параметры_);
URL = Ответ["response"]["upload_url"];
Параметры_.Вставить("upload_url", URL);
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы);
СерверФото = OPI_Инструменты.ЧислоВСтроку(Ответ[Serv]);
Параметры_.Вставить(Hash , Ответ[Hash]);
Параметры_.Вставить(Photo , Ответ[Photo]);
Параметры_.Вставить(Serv , СерверФото);
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.saveWallPhoto", Параметры_);
ОтветСоответствие = Ответ.Получить("response")[0];
Параметры_.Удалить(Hash);
Параметры_.Удалить(Photo);
Параметры_.Удалить(Serv);
ФотоID = Photo
+ OPI_Инструменты.ЧислоВСтроку(ОтветСоответствие.Получить("owner_id"))
+ "_"
+ OPI_Инструменты.ЧислоВСтроку(ОтветСоответствие.Получить("id"));
ОтветСоответствие = Ответ.Получить("response")[0];
ФотоID = "photo"
+ OPI_Инструменты.ЧислоВСтроку(ОтветСоответствие.Получить("owner_id"))
+ "_"
+ OPI_Инструменты.ЧислоВСтроку(ОтветСоответствие.Получить("id"));
СтрокаВложений = СтрокаВложений + ФотоID + ",";
КонецЦикла;
@ -298,28 +266,7 @@
Параметры_.Вставить("link_url" , URL);
Параметры_.Вставить("add_to_news" , "1");
Ответ = OPI_Инструменты.Get("api.vk.com/method/stories.getPhotoUploadServer", Параметры_);
URL = Ответ["response"]["upload_url"];
Параметры_.Вставить("upload_url", URL);
Если ТипЗнч(Картинка) = Тип("Строка") Тогда
Путь = Картинка;
Картинка = Новый ДвоичныеДанные(Картинка);
Иначе
//@skip-check missing-temporary-file-deletion
// BSLLS:MissingTemporaryFileDeletion-off
Путь = ПолучитьИмяВременногоФайла("jpeg");
КонецЕсли;
Файлы = Новый Соответствие;
Файлы.Вставить(Путь, Картинка);
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы);
Параметры_.Вставить("upload_results", Ответ["response"]["upload_result"]);
Ответ = OPI_Инструменты.Get("api.vk.com/method/stories.save", Параметры_);
Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "История");
Возврат Ответ;
КонецФункции
@ -340,32 +287,8 @@
Параметры_.Вставить("album_id" , OPI_Инструменты.ЧислоВСтроку(IDАльбома));
Параметры_.Вставить("caption" , Описание);
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.getUploadServer", Параметры_);
URL = Ответ["response"]["upload_url"];
Если ТипЗнч(Картинка) = Тип("Строка") Тогда
Путь = Картинка;
Картинка = Новый ДвоичныеДанные(Картинка);
Иначе
//@skip-check missing-temporary-file-deletion
// BSLLS:MissingTemporaryFileDeletion-off
Путь = ПолучитьИмяВременногоФайла("jpeg");
КонецЕсли;
Файлы = Новый Соответствие;
Файлы.Вставить(Путь, Картинка);
ОтветАльбома = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы);
Параметры_.Вставить("server" , OPI_Инструменты.ЧислоВСтроку(ОтветАльбома["server"]));
Параметры_.Вставить("photos_list" , ОтветАльбома["photos_list"]);
Параметры_.Вставить("hash" , ОтветАльбома["hash"]);
Параметры_.Вставить("aid" , ОтветАльбома["aid"]);
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.save", Параметры_);
Возврат Ответ;
Возврат ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Альбом");
КонецФункции
@ -859,6 +782,77 @@
#КонецОбласти
#Область РаботаСТоварами
Функция ДобавитьТовар(Знач ОписаниеТовара, Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
ОсновноеФото = ОписаниеТовара["ОсновноеФото"];
Если ЗначениеЗаполнено(ОсновноеФото) Тогда
Ответ = ЗагрузитьФотоНаСервер(ОсновноеФото, Параметры_, "Товар");
ИДФото = Ответ["response"]["photo_id"];
ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото);
Параметры_.Вставить("main_photo_id", ИДФото);
КонецЕсли;
Для Каждого Поле Из ПолучитьСоответствиеПараметровТовара() Цикл
Параметры_.Вставить(Поле.Значение, ОписаниеТовара[Поле.Ключ]);
КонецЦикла;
Ответ = OPI_Инструменты.Get("api.vk.com/method/market.add", Параметры_);
Возврат Ответ;
КонецФункции
Функция ПолучитьОписаниеТовара() Экспорт
Товар = Новый Соответствие();
Товар.Вставить("Имя" , "Новый товар"); // Имя товара
Товар.Вставить("Описание" , "Описание товара"); // Описание товара
Товар.Вставить("Категория" , "1210"); // См ПолучитьСписокКатегорийТоваров()
Товар.Вставить("Цена" , 1); // Цена в руб.
Товар.Вставить("СтараяЦена" , Неопределено); // Для отражения изменения цены
Товар.Вставить("ОсновноеФото" , Неопределено); // ДД или путь к осн. фото
Товар.Вставить("Удален" , Ложь); // Признак неактивности
Товар.Вставить("URL" , Неопределено); // Ссылка на страницу магазина
Товар.Вставить("ДополнительныеФото" , Новый Массив); // Массив путей или ДД для доп. фото
Товар.Вставить("ГлавныйВГруппе" , Ложь); // Сделать главным в своей группе
Товар.Вставить("НомерГруппы" , Неопределено);
Товар.Вставить("Ширина" , Неопределено); // В миллиметрах
Товар.Вставить("Высота" , Неопределено); // В миллиметрах
Товар.Вставить("Глубина" , Неопределено); // В миллиметрах
Товар.Вставить("Вес" , Неопределено); // В граммах
Товар.Вставить("SKU" , Неопределено);
Возврат Товар;
КонецФункции
Функция ПолучитьСписокКатегорийТоваров(Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_);
Количество = Ответ["response"]["count"];
Параметры_.Вставить("count", Количество);
Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_);
Категории = Ответ["response"]["items"];
СоответствиеКатегорий = Новый Соответствие;
Для Каждого Категория Из Категории Цикл
СоответствиеКатегорий.Вставить(Категория["id"], Категория["name"]);
КонецЦикла;
Возврат СоответствиеКатегорий;
КонецФункции
#КонецОбласти
#Область Прочие
// Сформировать клавиатуру.
@ -934,4 +928,132 @@
КонецФункции
Функция ЗагрузитьФотоНаСервер(Знач Картинка, Параметры, Знач Вид = "Пост")
Файлы = Новый Соответствие;
Метод = ОпределитьМетодЗагрузкиИзображений(Вид);
URL = "api.vk.com/method/";
Загрузка = URL + Метод["Загрузка"];
Сохранение = URL + Метод["Сохранение"];
Если ТипЗнч(Картинка) = Тип("Строка") Тогда
КлючКартинка = СтрЗаменить(Картинка, ".", "___");
ЗначениеКартинка = Новый ДвоичныеДанные(Картинка);
Иначе
//@skip-check missing-temporary-file-deletion
// BSLLS:MissingTemporaryFileDeletion-off
КлючКартинка = СтрЗаменить(ПолучитьИмяВременногоФайла("jpeg"), ".", "___");
ЗначениеКартинка = Картинка;
КонецЕсли;
Файлы.Вставить(КлючКартинка, ЗначениеКартинка);
Ответ = OPI_Инструменты.Get(Загрузка, Параметры);
URL = Ответ["response"]["upload_url"];
Параметры.Вставить("upload_url", URL);
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, Файлы);
ЗаполнитьПараметрыЗагрузкиФото(Метод, Ответ, Параметры);
Ответ = OPI_Инструменты.Get(Сохранение, Параметры);
Возврат Ответ;
КонецФункции
Функция ОпределитьМетодЗагрузкиИзображений(Знач Вид)
СоответствиеМетодов = Новый Соответствие;
Если Вид = "Пост" Тогда
СоответствиеМетодов.Вставить("Загрузка" , "photos.getWallUploadServer");
СоответствиеМетодов.Вставить("Сохранение", "photos.saveWallPhoto");
СоответствиеМетодов.Вставить("Фото" , "photo");
СоответствиеМетодов.Вставить("Способ" , 1);
ИначЕесли Вид = "Товар" Тогда
СоответствиеМетодов.Вставить("Загрузка" , "market.getProductPhotoUploadServer");
СоответствиеМетодов.Вставить("Сохранение", "market.saveProductPhoto");
СоответствиеМетодов.Вставить("Способ" , 2);
ИначеЕсли Вид = "История" Тогда
СоответствиеМетодов.Вставить("Загрузка" , "stories.getPhotoUploadServer");
СоответствиеМетодов.Вставить("Сохранение", "stories.save");
СоответствиеМетодов.Вставить("Способ" , 3);
Иначе
СоответствиеМетодов.Вставить("Загрузка" , "photos.getUploadServer");
СоответствиеМетодов.Вставить("Сохранение", "photos.save");
СоответствиеМетодов.Вставить("Фото" , "photos_list");
СоответствиеМетодов.Вставить("Способ" , 1);
КонецЕсли;
Возврат СоответствиеМетодов;
КонецФункции
Функция ПолучитьСоответствиеПараметровТовара()
Поля = Новый Соответствие();
Поля.Вставить("Имя" , "name");
Поля.Вставить("Описание" , "description");
Поля.Вставить("Категория" , "category_id");
Поля.Вставить("Цена" , "price");
Поля.Вставить("СтараяЦена" , "old_price");
Поля.Вставить("Удален" , "deleted");
Поля.Вставить("URL" , "url");
Поля.Вставить("ГлавныйВГруппе" , "is_main_variant");
Поля.Вставить("НомерГруппы" , "variant_ids");
Поля.Вставить("Ширина" , "dimension_width");
Поля.Вставить("Высота" , "dimension_height");
Поля.Вставить("Глубина" , "dimension_length");
Поля.Вставить("Вес" , "weight");
Поля.Вставить("SKU" , "sku");
Возврат Поля;
КонецФункции
Процедура ЗаполнитьПараметрыЗагрузкиФото(Знач Метод, Знач Ответ, Параметры)
Способ = Метод["Способ"];
Если Способ = 1 Тогда
Hash = "hash";
Serv = "server";
Aid = "aid";
Фото = Метод["Фото"];
СерверФото = OPI_Инструменты.ЧислоВСтроку(Ответ[Serv]);
Параметры.Вставить(Hash , Ответ[Hash]);
Параметры.Вставить(Фото , Ответ[Фото]);
Параметры.Вставить(Serv , СерверФото);
Идентификатор = Ответ.Получить(Aid);
Идентификатор = OPI_Инструменты.ЧислоВСтроку(Идентификатор);
Если ЗначениеЗаполнено(Идентификатор) Тогда
Параметры.Вставить(Aid , Идентификатор);
КонецЕсли;
ИначеЕсли Способ = 2 Тогда
ОтветСтрокой = OPI_Инструменты.JSONСтрокой(Ответ);
Параметры.Вставить("upload_response", ОтветСтрокой);
Иначе
Параметры.Вставить("upload_results", Ответ["response"]["upload_result"]);
КонецЕсли;
КонецПроцедуры
#КонецОбласти

View File

@ -173,7 +173,7 @@
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, Данные);
ЗаписатьJSON(ЗаписьJSON, Данные,);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
@ -347,14 +347,26 @@
РазделительСтрок = Символы.ВК + Символы.ПС;
Для Каждого Параметр Из Параметры Цикл
Если Параметр.Значение = Неопределено
Или Параметр.Значение = NULL Тогда
Продолжить;
КонецЕсли;
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """");
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
Если ТипЗнч(Параметр.Значение) = Тип("Строка") Тогда
ЗаписьТекста.ЗаписатьСтроку(Параметр.Значение);
Если ТипЗнч(Параметр.Значение) = Тип("Строка")
Или ТипЗнч(Параметр.Значение) = Тип("Число") Тогда
ЗначениеСтрокой = ЧислоВСтроку(Параметр.Значение);
ЗаписьТекста.ЗаписатьСтроку(ЗначениеСтрокой);
ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Булево") Тогда
ЗаписьТекста.ЗаписатьСтроку(?(Параметр.Значение, "true", "false"));
Иначе
ЗаписьТекста.Записать(Параметр.Значение);
КонецЕсли;

View File

@ -29,6 +29,7 @@
.ДобавитьСерверныйТест("Телеграм_ПолучитьЧислоУчастников" , "Получить число участников")
.ДобавитьТестовыйНабор("ВКонтакте")
.ДобавитьСерверныйТест("ВК_СоздатьСсылкуТокена" , "Создать ссылку получения токена")
.ДобавитьСерверныйТест("ВК_СоздатьУдалитьПост" , "Создать/Удалить пост")
.ДобавитьСерверныйТест("ВК_СоздатьОпрос" , "Создать опрос")
.ДобавитьСерверныйТест("ВК_СохранитьУдалитьКартинку" , "Добавить/удалить картинку и альбом")
@ -39,6 +40,8 @@
.ДобавитьСерверныйТест("ВК_ПолучитьСтатистикуПостов" , "Получить статистику постов")
.ДобавитьСерверныйТест("ВК_СоздатьРекламнуюКампанию" , "Создать рекламную кампанию")
.ДобавитьСерверныйТест("ВК_ОтправитьСообщение" , "Отправить сообщение")
.ДобавитьСерверныйТест("ВК_ПолучитьКатегорииТоваров" , "Получить категории товаров")
.ДобавитьСерверныйТест("ВК_СоздатьТовар" , "Создать товар")
.ДобавитьТестовыйНабор("Яндекс.Диск")
.ДобавитьСерверныйТест("ЯДиск_ПолучитьИнформациюОДиске" , "Получить информацию о диске")
@ -520,6 +523,17 @@
#Область ВК
Процедура ВК_СоздатьСсылкуТокена() Экспорт
Приложение = ПолучитьПараметр("ВК_Приложение");
Результат = OPI_VK.СоздатьСсылкуПолученияТокена(Приложение);
ЮТест.ОжидаетЧто(Результат)
.ИмеетТип("Строка")
.Заполнено();
КонецПроцедуры
Процедура ВК_СоздатьУдалитьПост() Экспорт
Параметры = ПолучитьПараметрыВК();
@ -672,6 +686,7 @@
Сообщение = "Сообщение из автотеста";
Результат = OPI_VK.СоздатьОбсуждение(Название, Сообщение, Параметры);
ЮТОбщий.Пауза(5);
ЮТест.ОжидаетЧто(Результат)
.ИмеетТип("Соответствие")
@ -687,6 +702,7 @@
.Свойство("response").ИмеетТип("Число").Равно(1);
Открытие = OPI_VK.ОткрытьОбсуждение(ИДОбсуждения, Параметры);
ЮТОбщий.Пауза(5);
ЮТест.ОжидаетЧто(Открытие)
.ИмеетТип("Соответствие")
@ -701,6 +717,7 @@
.Свойство("response").ИмеетТип("Число").Заполнено();
Удаление = OPI_VK.ЗакрытьОбсуждение(ИДОбсуждения, Истина, Параметры);
ЮТОбщий.Пауза(5);
ЮТест.ОжидаетЧто(Удаление)
.ИмеетТип("Соответствие")
@ -719,6 +736,7 @@
ИДПоста = Результат["response"]["post_id"];
Лайк = OPI_VK.ПоставитьЛайк(ИДПоста, , Параметры);
ЮТОбщий.Пауза(5);
ЮТест.ОжидаетЧто(Лайк)
.ИмеетТип("Соответствие")
@ -729,6 +747,7 @@
ВнешняяСтена = -218704372;
Репост = OPI_VK.СделатьРепост(ВнешнийПост, ВнешняяСтена, , , Параметры);
ЮТОбщий.Пауза(5);
ЮТест.ОжидаетЧто(Репост)
.ИмеетТип("Соответствие")
@ -737,6 +756,7 @@
.Свойство("response.wall_repost_count").ИмеетТип("Число").Равно(1);
Комментарий = OPI_VK.НаписатьКомментарий(ИДПоста, Параметры["owner_id"], Сообщение, Параметры);
ЮТОбщий.Пауза(5);
ЮТест.ОжидаетЧто(Комментарий)
.ИмеетТип("Соответствие")
@ -753,9 +773,9 @@
Параметры = ПолучитьПараметрыВК();
Дата0 = НачалоДня(ТекущаяДатаСеанса());
Дата1 = КонецДня(Дата0);
Результат = OPI_VK.ПолучитьСтатистику(Дата0, Дата1, Параметры);
ЮТОбщий.Пауза(10);
ЮТест.ОжидаетЧто(Результат)
.ИмеетТип("Соответствие")
@ -774,6 +794,7 @@
МассивПостов.Добавить(215);
Результат = OPI_VK.ПолучитьСтатистикуПостов(МассивПостов, Параметры);
ЮТОбщий.Пауза(10);
ЮТест.ОжидаетЧто(Результат)
.ИмеетТип("Массив")
@ -817,6 +838,7 @@
ИДОбъявления = Объявление["id"];
Остановка = OPI_VK.ПриостановитьРекламноеОбъявление(ИДКабинета, ИДОбъявления, Параметры);
Остановка = Остановка["response"][0];
ЮТест.ОжидаетЧто(Остановка)
.ИмеетТип("Соответствие")
@ -846,6 +868,33 @@
КонецПроцедуры
Процедура ВК_ПолучитьКатегорииТоваров() Экспорт
Параметры = ПолучитьПараметрыВК();
Результат = OPI_VK.ПолучитьСписокКатегорийТоваров(Параметры);
ЮТест.ОжидаетЧто(Результат)
.ИмеетТип("Соответствие")
.Заполнено();
КонецПроцедуры
Процедура ВК_СоздатьТовар() Экспорт
Параметры = ПолучитьПараметрыВК();
Картинка = ПолучитьДвоичные("Картинка");
Товар = OPI_VK.ПолучитьОписаниеТовара();
Товар.Вставить("ОсновноеФото", Картинка);
Результат = OPI_VK.ДобавитьТовар(Товар, Параметры);
ЮТест.ОжидаетЧто(Результат)
.ИмеетТип("Соответствие")
.Свойство("response.market_item_id").ИмеетТип("Число").Заполнено();
КонецПроцедуры
#КонецОбласти
#Область YandexDisk
@ -1136,6 +1185,20 @@
КонецФункции
Функция ПолучитьПараметрыВК()
Параметры = Новый Структура;
НомерГруппы = ПолучитьПараметр("ВК_НомерГруппы");
Параметры.Вставить("access_token" , ПолучитьПараметр("ВК_Токен"));
Параметры.Вставить("owner_id" , "-" + НомерГруппы);
Параметры.Вставить("app_id" , ПолучитьПараметр("ВК_Приложение"));
Параметры.Вставить("group_id" , НомерГруппы);
Возврат Параметры;
КонецФункции
Процедура ЗаписатьПараметр(Параметр, Значение)
ИмяСправочника = "ЮТПараметры";
@ -1155,19 +1218,5 @@
КонецПроцедуры
Функция ПолучитьПараметрыВК()
Параметры = Новый Структура;
НомерГруппы = ПолучитьПараметр("ВК_НомерГруппы");
Параметры.Вставить("access_token" , ПолучитьПараметр("ВК_Токен"));
Параметры.Вставить("owner_id" , "-" + НомерГруппы);
Параметры.Вставить("app_id" , ПолучитьПараметр("ВК_Приложение"));
Параметры.Вставить("group_id" , НомерГруппы);
Возврат Параметры;
КонецФункции
#КонецОбласти
// BSLLS:Typo-on