mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2025-04-13 11:50:53 +02:00
Форматирование и деффекты SC
This commit is contained in:
parent
32196e8ed9
commit
9fcf1a71bc
@ -1,28 +1,28 @@
|
||||
//MIT License
|
||||
// MIT License
|
||||
|
||||
//Copyright (c) 2023 Anton Tsitavets
|
||||
// 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:
|
||||
// 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 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.
|
||||
// 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
|
||||
//Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
|
||||
//и почитать комментарии
|
||||
// https://github.com/Bayselonarrend/OpenIntegrations
|
||||
// Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
|
||||
// и почитать комментарии
|
||||
|
||||
#Область ПрограммныйИнтерфейс
|
||||
|
||||
@ -36,24 +36,24 @@
|
||||
// Возвращаемое значение:
|
||||
// Строка - 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");
|
||||
|
||||
Линк = "https://twitter.com/i/oauth2/authorize"
|
||||
+ OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры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");
|
||||
|
||||
Линк = "https://twitter.com/i/oauth2/authorize"
|
||||
+ OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
|
||||
|
||||
Возврат Линк;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Получить токен.
|
||||
@ -65,21 +65,21 @@
|
||||
// Возвращаемое значение:
|
||||
// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
|
||||
Функция ПолучитьТокен(Знач Код, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
ПараметрыЗапроса = Новый Структура;
|
||||
ПараметрыЗапроса.Вставить("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"
|
||||
, ПараметрыЗапроса, , Ложь);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
ПараметрыЗапроса = Новый Структура;
|
||||
ПараметрыЗапроса.Вставить("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
|
||||
@ -90,18 +90,19 @@
|
||||
// Возвращаемое значение:
|
||||
// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
|
||||
Функция ОбновитьТокен(Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
ПараметрыЗапроса = Новый Структура;
|
||||
ПараметрыЗапроса.Вставить("refresh_token", Параметры_["refresh_token"]);
|
||||
ПараметрыЗапроса.Вставить("grant_type" , "refresh_token");
|
||||
ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]);
|
||||
|
||||
Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
|
||||
, ПараметрыЗапроса, , Ложь);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Refresh = "refresh_token";
|
||||
|
||||
ПараметрыЗапроса = Новый Структура;
|
||||
ПараметрыЗапроса.Вставить(Refresh , Параметры_[Refresh]);
|
||||
ПараметрыЗапроса.Вставить("grant_type" , Refresh);
|
||||
ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]);
|
||||
|
||||
Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
|
||||
, ПараметрыЗапроса, , Ложь);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
@ -115,15 +116,15 @@
|
||||
// Возвращаемое значение:
|
||||
// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
|
||||
Функция ОбработкаВходящегоЗапросаПослеАвторизации(Запрос) Экспорт
|
||||
|
||||
Код = Запрос.ПараметрыЗапроса["code"];
|
||||
ОтветТокен = ПолучитьТокен(Код);
|
||||
|
||||
//Предпочтительное хранение токенов
|
||||
//Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]);
|
||||
//Константы.TwitterToken.Установить(ОтветТокен["access_token"]);
|
||||
|
||||
Возврат ОтветТокен;
|
||||
|
||||
Код = Запрос.ПараметрыЗапроса["code"];
|
||||
ОтветТокен = ПолучитьТокен(Код);
|
||||
|
||||
// Предпочтительное хранение токенов
|
||||
// Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]);
|
||||
// Константы.TwitterToken.Установить(ОтветТокен["access_token"]);
|
||||
|
||||
Возврат ОтветТокен;
|
||||
|
||||
КонецФункции
|
||||
|
||||
@ -143,53 +144,56 @@
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать произвольный твит
|
||||
//@skip-check method-too-many-params
|
||||
// BSLLS:NumberOfOptionalParams-off
|
||||
Функция СоздатьПроизвольныйТвит(Знач Текст = ""
|
||||
, Знач МассивМедиа = ""
|
||||
, Знач МассивВариантовОпроса = ""
|
||||
, Знач ДлительностьОпроса = ""
|
||||
, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
URL = "https://api.twitter.com/2/tweets";
|
||||
|
||||
Если Не ТипЗнч(МассивМедиа) = Тип("Массив") Тогда
|
||||
МассивМедиа_ = Новый Массив;
|
||||
|
||||
Если ЗначениеЗаполнено(МассивМедиа) Тогда
|
||||
МассивМедиа_.Добавить(МассивМедиа);
|
||||
КонецЕсли;
|
||||
|
||||
МассивМедиа = МассивМедиа_;
|
||||
КонецЕсли;
|
||||
|
||||
Поля = Новый Соответствие;
|
||||
|
||||
Если ЗначениеЗаполнено(Текст) Тогда
|
||||
Поля.Вставить("text", Текст);
|
||||
КонецЕсли;
|
||||
|
||||
Если ТипЗнч(МассивВариантовОпроса) = Тип("Массив") И ЗначениеЗаполнено(ДлительностьОпроса) Тогда
|
||||
|
||||
ДлительностьОпроса = Число(ДлительностьОпроса);
|
||||
|
||||
Если МассивВариантовОпроса.Количество()> 0 Тогда
|
||||
Поля.Вставить("poll"
|
||||
, Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса));
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Если ТипЗнч(МассивМедиа) = Тип("Массив") Тогда
|
||||
Если МассивМедиа.Количество() > 0 Тогда
|
||||
Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа));
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
|
||||
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация);
|
||||
, Знач МассивМедиа = ""
|
||||
, Знач МассивВариантовОпроса = ""
|
||||
, Знач ДлительностьОпроса = ""
|
||||
, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
URL = "https://api.twitter.com/2/tweets";
|
||||
Массив = "Массив";
|
||||
|
||||
Если Не ТипЗнч(МассивМедиа) = Тип(Массив) Тогда
|
||||
МассивМедиа_ = Новый Массив;
|
||||
|
||||
Если ЗначениеЗаполнено(МассивМедиа) Тогда
|
||||
МассивМедиа_.Добавить(МассивМедиа);
|
||||
КонецЕсли;
|
||||
|
||||
МассивМедиа = МассивМедиа_;
|
||||
КонецЕсли;
|
||||
|
||||
Поля = Новый Соответствие;
|
||||
|
||||
Если ЗначениеЗаполнено(Текст) Тогда
|
||||
Поля.Вставить("text", Текст);
|
||||
КонецЕсли;
|
||||
|
||||
Если ТипЗнч(МассивВариантовОпроса) = Тип(Массив) И ЗначениеЗаполнено(ДлительностьОпроса) Тогда
|
||||
|
||||
ДлительностьОпроса = Число(ДлительностьОпроса);
|
||||
|
||||
Если МассивВариантовОпроса.Количество() > 0 Тогда
|
||||
Поля.Вставить("poll"
|
||||
, Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса));
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Если ТипЗнч(МассивМедиа) = Тип(Массив) Тогда
|
||||
Если МассивМедиа.Количество() > 0 Тогда
|
||||
Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа));
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
|
||||
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
// BSLLS:NumberOfOptionalParams-on
|
||||
|
||||
// Создать текстовый твит.
|
||||
//
|
||||
@ -200,7 +204,7 @@
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать текстовый твит
|
||||
Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры);
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры);
|
||||
КонецФункции
|
||||
|
||||
// Создать твит картинки.
|
||||
@ -213,10 +217,10 @@
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит картинки
|
||||
Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт
|
||||
|
||||
МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры);
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
|
||||
|
||||
|
||||
МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры);
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создать твит гифки.
|
||||
@ -229,10 +233,10 @@
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит гифки
|
||||
Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт
|
||||
|
||||
МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры);
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
|
||||
|
||||
|
||||
МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры);
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создать твит видео.
|
||||
@ -245,10 +249,10 @@
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит видео
|
||||
Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт
|
||||
|
||||
МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры);
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
|
||||
|
||||
|
||||
МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры);
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создать твит опрос.
|
||||
@ -262,7 +266,7 @@
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит опрос
|
||||
Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры);
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры);
|
||||
КонецФункции
|
||||
|
||||
// Загрузить массив вложений.
|
||||
@ -275,34 +279,33 @@
|
||||
// Возвращаемое значение:
|
||||
// Массив Из Строка - Массив ID медиа
|
||||
Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт
|
||||
|
||||
МассивМедиа = Новый Массив;
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
Если ЗначениеЗаполнено(МассивФайлов) Тогда
|
||||
|
||||
Если Не ТипЗнч(МассивФайлов) = Тип("Массив") Тогда
|
||||
МассивФайлов_ = Новый Массив;
|
||||
МассивФайлов_.Добавить(МассивФайлов);
|
||||
МассивФайлов = МассивФайлов_;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Для Каждого ФайлОтправки Из МассивФайлов Цикл
|
||||
|
||||
Если Не ТипЗнч(ФайлОтправки) = Тип("ДвоичныеДанные") Тогда
|
||||
ФайлОтправки = Новый ДвоичныеДанные(ФайлОтправки);
|
||||
КонецЕсли;
|
||||
|
||||
IDМедиа = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_)["media_id_string"];
|
||||
МассивМедиа.Добавить(IDМедиа);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат МассивМедиа;
|
||||
|
||||
|
||||
МассивМедиа = Новый Массив;
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
Если ЗначениеЗаполнено(МассивФайлов) Тогда
|
||||
|
||||
Если Не ТипЗнч(МассивФайлов) = Тип("Массив") Тогда
|
||||
МассивФайлов_ = Новый Массив;
|
||||
МассивФайлов_.Добавить(МассивФайлов);
|
||||
МассивФайлов = МассивФайлов_;
|
||||
КонецЕсли;
|
||||
|
||||
Для Каждого ФайлОтправки Из МассивФайлов Цикл
|
||||
|
||||
Если Не ТипЗнч(ФайлОтправки) = Тип("ДвоичныеДанные") Тогда
|
||||
ФайлОтправки = Новый ДвоичныеДанные(ФайлОтправки);
|
||||
КонецЕсли;
|
||||
|
||||
IDМедиа = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_)["media_id_string"];
|
||||
МассивМедиа.Добавить(IDМедиа);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат МассивМедиа;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
@ -312,156 +315,159 @@
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры)
|
||||
|
||||
СоответствиеMIME = Новый Соответствие;
|
||||
СоответствиеMIME.Вставить("tweet_image", "image/jpeg");
|
||||
СоответствиеMIME.Вставить("tweet_video", "video/mp4");
|
||||
СоответствиеMIME.Вставить("tweet_gif" , "image/gif");
|
||||
|
||||
Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
|
||||
Файл = Новый ДвоичныеДанные(Файл);
|
||||
КонецЕсли;
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
URL = "https://upload.twitter.com/1.1/media/upload.json";
|
||||
Размер = Файл.Размер();
|
||||
|
||||
Если Тип = "tweet_image" Тогда
|
||||
|
||||
Поля = Новый Структура;
|
||||
Поля.Вставить("media_data" , Base64Строка(Файл));
|
||||
Поля.Вставить("media_category", Тип);
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL);
|
||||
|
||||
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
|
||||
|
||||
Иначе
|
||||
|
||||
ЧтениеДанных = Новый ЧтениеДанных(Файл);
|
||||
МассивЧтения = ЧтениеДанных.РазделитьНаЧастиПо(4*1024*1024);
|
||||
|
||||
Поля = Новый Структура;
|
||||
Поля.Вставить("command" , "INIT");
|
||||
Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер));
|
||||
Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип));
|
||||
Поля.Вставить("media_category" , Тип);
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL);
|
||||
|
||||
Command = "command";
|
||||
ВидЗапроса = "POST";
|
||||
Единица = 1024;
|
||||
Количество = 4;
|
||||
|
||||
СоответствиеMIME = Новый Соответствие;
|
||||
СоответствиеMIME.Вставить("tweet_image", "image/jpeg");
|
||||
СоответствиеMIME.Вставить("tweet_video", "video/mp4");
|
||||
СоответствиеMIME.Вставить("tweet_gif" , "image/gif");
|
||||
|
||||
Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
|
||||
Файл = Новый ДвоичныеДанные(Файл);
|
||||
КонецЕсли;
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
URL = "https://upload.twitter.com/1.1/media/upload.json";
|
||||
Размер = Файл.Размер();
|
||||
|
||||
Если Тип = "tweet_image" Тогда
|
||||
|
||||
Поля = Новый Структура;
|
||||
Поля.Вставить("media_data" , Base64Строка(Файл));
|
||||
Поля.Вставить("media_category", Тип);
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL);
|
||||
|
||||
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
|
||||
|
||||
Иначе
|
||||
|
||||
ЧтениеДанных = Новый ЧтениеДанных(Файл);
|
||||
МассивЧтения = ЧтениеДанных.РазделитьНаЧастиПо(Количество * Единица * Единица);
|
||||
|
||||
Поля = Новый Структура;
|
||||
Поля.Вставить(Command , "INIT");
|
||||
Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер));
|
||||
Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип));
|
||||
Поля.Вставить("media_category" , Тип);
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL);
|
||||
|
||||
ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
|
||||
KeyИнициализации = ОтветИнициализации["media_key"];
|
||||
IDИнициализации = ОтветИнициализации["media_id_string"];
|
||||
Счетчик = 0;
|
||||
|
||||
Для Каждого Часть Из МассивЧтения Цикл
|
||||
|
||||
ДвоичныеЧасти = Часть.ПолучитьДвоичныеДанные();
|
||||
|
||||
Поля = Новый Структура;
|
||||
Поля.Вставить("command" , "APPEND");
|
||||
Поля.Вставить("media_key" , KeyИнициализации);
|
||||
Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик));
|
||||
Поля.Вставить("media" , ДвоичныеЧасти);
|
||||
ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
|
||||
KeyИнициализации = ОтветИнициализации["media_key"];
|
||||
IDИнициализации = ОтветИнициализации["media_id_string"];
|
||||
Счетчик = 0;
|
||||
|
||||
Для Каждого Часть Из МассивЧтения Цикл
|
||||
|
||||
ДвоичныеЧасти = Часть.ПолучитьДвоичныеДанные();
|
||||
|
||||
Поля = Новый Структура;
|
||||
Поля.Вставить(Command , "APPEND");
|
||||
Поля.Вставить("media_key" , KeyИнициализации);
|
||||
Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик));
|
||||
Поля.Вставить("media" , ДвоичныеЧасти);
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Новый Структура, "POST", URL);
|
||||
|
||||
OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация);
|
||||
|
||||
Счетчик = Счетчик + 1;
|
||||
КонецЦикла;
|
||||
|
||||
Поля = Новый Структура;
|
||||
Поля.Вставить("command" , "FINALIZE");
|
||||
Поля.Вставить("media_id" , IDИнициализации);
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL);
|
||||
|
||||
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
|
||||
СтатусОбработки = Ответ["processing_info"]["state"];
|
||||
Поля = Новый Структура;
|
||||
|
||||
Поля.Вставить("command" , "STATUS");
|
||||
Поля.Вставить("media_id" , IDИнициализации);
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Новый Структура, ВидЗапроса, URL);
|
||||
|
||||
OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация);
|
||||
|
||||
Счетчик = Счетчик + 1;
|
||||
КонецЦикла;
|
||||
|
||||
Поля = Новый Структура;
|
||||
Поля.Вставить(Command , "FINALIZE");
|
||||
Поля.Вставить("media_id", IDИнициализации);
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL);
|
||||
|
||||
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
|
||||
СтатусОбработки = Ответ["processing_info"]["state"];
|
||||
Поля = Новый Структура;
|
||||
|
||||
Поля.Вставить(Command , "STATUS");
|
||||
Поля.Вставить("media_id", IDИнициализации);
|
||||
|
||||
Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "GET", URL);
|
||||
Ответ = OPI_Инструменты.Get(URL, Поля, Авторизация);
|
||||
СтатусОбработки = Ответ["processing_info"]["state"];
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Если СтатусОбработки = "failed" Тогда
|
||||
ВызватьИсключение "Твиттер не смог обработать загруженное вами видео";
|
||||
КонецЕсли;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "GET", URL);
|
||||
Ответ = OPI_Инструменты.Get(URL, Поля, Авторизация);
|
||||
СтатусОбработки = Ответ["processing_info"]["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 - ПолучитьСсылкуАвторизации() -> Браузер -> http-запрос с 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
|
||||
|
||||
//Эти токены обновлять не надо
|
||||
|
||||
|
||||
// Здесь собрано определение данных, необходимых для работы.
|
||||
// Для 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", "");
|
||||
|
||||
Параметры_.Вставить("scope" , Разрешения);
|
||||
Параметры_.Вставить("client_id" , "");
|
||||
Параметры_.Вставить("client_secret" , "");
|
||||
Параметры_.Вставить("access_token" , ""); // Должно быть нечто вроде Константы.TwitterToken.Получить()
|
||||
Параметры_.Вставить("refresh_token" , ""); // Должно быть нечто вроде Константы.TwitterRefresh.Получить()
|
||||
Параметры_.Вставить("oauth_token" , "");
|
||||
Параметры_.Вставить("oauth_token_secret" , "");
|
||||
Параметры_.Вставить("oauth_consumer_key" , "");
|
||||
Параметры_.Вставить("oauth_consumer_secret", "");
|
||||
|
||||
Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда
|
||||
Для Каждого ПереданныйПараметр Из Параметры Цикл
|
||||
Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
|
||||
@ -473,112 +479,116 @@
|
||||
КонецФункции
|
||||
|
||||
Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL)
|
||||
|
||||
ЗаголовокАвторизации = "";
|
||||
МетодХэширования = "HMAC-SHA1";
|
||||
ВерсияАпи = "1.0";
|
||||
СтрокаСигнатуры = "";
|
||||
Подпись = "";
|
||||
ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДатаСеанса());
|
||||
ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
|
||||
ТаблицаПараметров = Новый ТаблицаЗначений;
|
||||
ТаблицаПараметров.Колонки.Добавить("Ключ");
|
||||
ТаблицаПараметров.Колонки.Добавить("Значение");
|
||||
|
||||
Для Каждого Поле Из Поля Цикл
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = Поле.Ключ;
|
||||
НоваяСтрока.Значение = Поле.Значение;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = "oauth_consumer_key";
|
||||
НоваяСтрока.Значение = Параметры["oauth_consumer_key"];
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = "oauth_token";
|
||||
НоваяСтрока.Значение = Параметры["oauth_token"];
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = "oauth_version";
|
||||
НоваяСтрока.Значение = ВерсияАпи;
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = "oauth_signature_method";
|
||||
НоваяСтрока.Значение = МетодХэширования;
|
||||
|
||||
ЗаголовокАвторизации = "";
|
||||
МетодХэширования = "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_timestamp";
|
||||
НоваяСтрока.Значение = ТекущаяДатаUNIX;
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = "oauth_nonce";
|
||||
НоваяСтрока.Значение = ТекущаяДата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=""" + Параметры["oauth_consumer_key"] + ""","
|
||||
+ "oauth_token=""" + Параметры["oauth_token"] + ""","
|
||||
+ "oauth_signature_method=""" + МетодХэширования + ""","
|
||||
+ "oauth_timestamp=""" + ТекущаяДатаUNIX + ""","
|
||||
+ "oauth_nonce=""" + ТекущаяДатаUNIX + ""","
|
||||
+ "oauth_version=""" + ВерсияАпи + ""","
|
||||
+ "oauth_signature=""" + Сигнатура;
|
||||
|
||||
СоответствиеЗаголовка = Новый Соответствие;
|
||||
СоответствиеЗаголовка.Вставить("authorization", ЗаголовокАвторизации);
|
||||
|
||||
Возврат СоответствиеЗаголовка;
|
||||
|
||||
Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
|
||||
|
||||
СтрокаТаблицы.Ключ = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.Кодировка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", ЗаголовокАвторизации);
|
||||
|
||||
Возврат СоответствиеЗаголовка;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// BSLLS:LatinAndCyrillicSymbolInWord-off
|
||||
Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры)
|
||||
|
||||
СоответствиеВозврата = Новый Соответствие;
|
||||
СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]);
|
||||
|
||||
Возврат СоответствиеВозврата;
|
||||
|
||||
|
||||
СоответствиеВозврата = Новый Соответствие;
|
||||
СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]);
|
||||
|
||||
Возврат СоответствиеВозврата;
|
||||
|
||||
КонецФункции
|
||||
// BSLLS:LatinAndCyrillicSymbolInWord-on
|
||||
|
||||
#КонецОбласти
|
@ -1,24 +1,24 @@
|
||||
//MIT License
|
||||
// MIT License
|
||||
|
||||
//Copyright (c) 2023 Anton Tsitavets
|
||||
// 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:
|
||||
// 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 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.
|
||||
// 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
|
||||
//Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
|
||||
@ -38,7 +38,7 @@
|
||||
// Строка - URL, по которому необходимо перейти в браузере
|
||||
Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт
|
||||
|
||||
//access_token нужно будет забрать из параметра в строке адреса браузера
|
||||
// access_token нужно будет забрать из параметра в строке адреса браузера
|
||||
Возврат "https://oauth.vk.com/authorize?client_id=" + OPI_Инструменты.ЧислоВСтроку(App_id)
|
||||
+ "&scope=offline,wall,groups,photos,stats,stories,ads"
|
||||
+ "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html";
|
||||
@ -61,13 +61,16 @@
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция СоздатьПост(Знач Текст
|
||||
, Знач МассивКартинок
|
||||
, Знач Рекламный = Ложь
|
||||
, Знач СсылкаПодЗаписью = ""
|
||||
, Знач Параметры = "") Экспорт
|
||||
, Знач МассивКартинок
|
||||
, Знач Рекламный = Ложь
|
||||
, Знач СсылкаПодЗаписью = ""
|
||||
, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
СтрокаВложений = "";
|
||||
Hash = "hash";
|
||||
Photo = "photo";
|
||||
Serv = "server";
|
||||
|
||||
Для Каждого КартинкаПоста Из МассивКартинок Цикл
|
||||
|
||||
@ -82,8 +85,7 @@
|
||||
КлючКартинка = СтрЗаменить(ПолучитьИмяВременногоФайла("jpeg"), ".", "___");
|
||||
ЗначениеКартинка = КартинкаПоста;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
|
||||
Файлы.Вставить(КлючКартинка, ЗначениеКартинка);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.getWallUploadServer", Параметры_);
|
||||
@ -92,20 +94,20 @@
|
||||
Параметры_.Вставить("upload_url", URL);
|
||||
|
||||
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы);
|
||||
СерверФото = OPI_Инструменты.ЧислоВСтроку(Ответ["server"]);
|
||||
СерверФото = OPI_Инструменты.ЧислоВСтроку(Ответ[Serv]);
|
||||
|
||||
Параметры_.Вставить("hash" , Ответ["hash"]);
|
||||
Параметры_.Вставить("photo" , Ответ["photo"]);
|
||||
Параметры_.Вставить("server" , СерверФото);
|
||||
Параметры_.Вставить(Hash , Ответ[Hash]);
|
||||
Параметры_.Вставить(Photo , Ответ[Photo]);
|
||||
Параметры_.Вставить(Serv , СерверФото);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.saveWallPhoto", Параметры_);
|
||||
ОтветСоответствие = Ответ.Получить("response")[0];
|
||||
|
||||
Параметры_.Удалить("hash");
|
||||
Параметры_.Удалить("photo");
|
||||
Параметры_.Удалить("server");
|
||||
Параметры_.Удалить(Hash);
|
||||
Параметры_.Удалить(Photo);
|
||||
Параметры_.Удалить(Serv);
|
||||
|
||||
ФотоID = "photo"
|
||||
ФотоID = Photo
|
||||
+ OPI_Инструменты.ЧислоВСтроку(ОтветСоответствие.Получить("owner_id"))
|
||||
+ "_"
|
||||
+ OPI_Инструменты.ЧислоВСтроку(ОтветСоответствие.Получить("id"));
|
||||
@ -160,35 +162,36 @@
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/polls.getPhotoUploadServer", Параметры_);
|
||||
URL = Ответ["response"]["upload_url"];
|
||||
IDФото = "";
|
||||
|
||||
Response = "response";
|
||||
URL = Ответ[Response]["upload_url"];
|
||||
IDФото = "";
|
||||
|
||||
Параметры_.Вставить("upload_url", URL);
|
||||
|
||||
Если Не Картинка = "" Тогда
|
||||
|
||||
Если ТипЗнч(Картинка) = Тип("Строка") Тогда
|
||||
Путь = Картинка;
|
||||
Картинка = Новый ДвоичныеДанные(Картинка);
|
||||
Иначе
|
||||
//@skip-check missing-temporary-file-deletion
|
||||
// BSLLS:MissingTemporaryFileDeletion-off
|
||||
Путь = ПолучитьИмяВременногоФайла("jpeg");
|
||||
КонецЕсли;
|
||||
|
||||
Файлы = Новый Соответствие;
|
||||
Файлы.Вставить(Путь, Картинка);
|
||||
|
||||
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы);
|
||||
|
||||
Параметры_.Вставить("hash" , Ответ["hash"]);
|
||||
Параметры_.Вставить("photo" , Ответ["photo"]);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/polls.savePhoto", Параметры_);
|
||||
IDФото = Ответ.Получить("response")["id"];
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Если ТипЗнч(Картинка) = Тип("Строка") Тогда
|
||||
Путь = Картинка;
|
||||
Картинка = Новый ДвоичныеДанные(Картинка);
|
||||
Иначе
|
||||
//@skip-check missing-temporary-file-deletion
|
||||
// BSLLS:MissingTemporaryFileDeletion-off
|
||||
Путь = ПолучитьИмяВременногоФайла("jpeg");
|
||||
КонецЕсли;
|
||||
|
||||
Файлы = Новый Соответствие;
|
||||
Файлы.Вставить(Путь, Картинка);
|
||||
|
||||
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы);
|
||||
|
||||
Параметры_.Вставить("hash" , Ответ["hash"]);
|
||||
Параметры_.Вставить("photo" , Ответ["photo"]);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/polls.savePhoto", Параметры_);
|
||||
IDФото = Ответ.Получить(Response)["id"];
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Параметры_.Вставить("is_anonymous" , 1);
|
||||
Параметры_.Вставить("is_multiple" , 0);
|
||||
|
||||
@ -198,12 +201,12 @@
|
||||
Для Каждого Ответ Из МассивОтветов Цикл
|
||||
|
||||
Если Первый Тогда
|
||||
Первый = Ложь
|
||||
Первый = Ложь;
|
||||
Иначе
|
||||
Ответы = Ответы + ", ";
|
||||
КонецЕсли;
|
||||
|
||||
Ответы = Ответы + """"+ Ответ + """";
|
||||
Ответы = Ответы + """" + Ответ + """";
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
@ -214,14 +217,13 @@
|
||||
Параметры_.Вставить("question" , Вопрос);
|
||||
|
||||
Опрос = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_);
|
||||
ОпросСоответствие = Опрос.Получить("response");
|
||||
ОпросСоответствие = Опрос.Получить(Response);
|
||||
|
||||
ОпросID = "poll"
|
||||
+ OPI_Инструменты.ЧислоВСтроку(ОпросСоответствие.Получить("owner_id"))
|
||||
+ "_"
|
||||
+ OPI_Инструменты.ЧислоВСтроку(ОпросСоответствие.Получить("id"));
|
||||
|
||||
|
||||
|
||||
Параметры_.Вставить("attachments", ОпросID);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_);
|
||||
@ -282,8 +284,7 @@
|
||||
// BSLLS:MissingTemporaryFileDeletion-off
|
||||
Путь = ПолучитьИмяВременногоФайла("jpeg");
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
|
||||
Файлы = Новый Соответствие;
|
||||
Файлы.Вставить(Путь, Картинка);
|
||||
|
||||
@ -325,7 +326,6 @@
|
||||
Путь = ПолучитьИмяВременногоФайла("jpeg");
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Файлы = Новый Соответствие;
|
||||
Файлы.Вставить(Путь, Картинка);
|
||||
|
||||
@ -464,12 +464,13 @@
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
IDСтены = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]);
|
||||
ОбъектВК = "wall" + OPI_Инструменты.ЧислоВСтроку(IDСтены) + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста);
|
||||
|
||||
Параметры_.Вставить("type" , "post");
|
||||
Параметры_.Вставить("object" , "wall" + OPI_Инструменты.ЧислоВСтроку(IDСтены) + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста));
|
||||
Параметры_.Вставить("object" , ОбъектВК);
|
||||
Параметры_.Вставить("item_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста));
|
||||
Параметры_.Вставить("owner_id" , OPI_Инструменты.ЧислоВСтроку(IDСтены));
|
||||
Параметры_.Вставить("from_group" , 0);
|
||||
Параметры_.Вставить("from_group" , 0);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_);
|
||||
|
||||
@ -489,21 +490,22 @@
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
//@skip-check method-too-many-params
|
||||
// BSLLS:NumberOfOptionalParams-off
|
||||
Функция СделатьРепост(Знач IDПоста
|
||||
, Знач IDСтены = ""
|
||||
, Знач ЦелеваяСтена = ""
|
||||
, Знач Рекламный = Ложь
|
||||
, Знач Параметры = "") Экспорт
|
||||
, Знач IDСтены = ""
|
||||
, Знач ЦелеваяСтена = ""
|
||||
, Знач Рекламный = Ложь
|
||||
, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
Источник = ?(ЗначениеЗаполнено(IDСтены)
|
||||
, OPI_Инструменты.ЧислоВСтроку(IDСтены)
|
||||
, OPI_Инструменты.ЧислоВСтроку(Параметры_["owner_id"]));
|
||||
|
||||
, OPI_Инструменты.ЧислоВСтроку(IDСтены)
|
||||
, OPI_Инструменты.ЧислоВСтроку(Параметры_["owner_id"]));
|
||||
|
||||
Приемник = ?(ЗначениеЗаполнено(ЦелеваяСтена)
|
||||
, СтрЗаменить(OPI_Инструменты.ЧислоВСтроку(ЦелеваяСтена), "-", "")
|
||||
, OPI_Инструменты.ЧислоВСтроку(Параметры_["group_id"]));
|
||||
, СтрЗаменить(OPI_Инструменты.ЧислоВСтроку(ЦелеваяСтена), "-", "")
|
||||
, OPI_Инструменты.ЧислоВСтроку(Параметры_["group_id"]));
|
||||
|
||||
Параметры_.Вставить("object" , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста));
|
||||
Параметры_.Вставить("group_id" , Приемник);
|
||||
@ -514,6 +516,7 @@
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
// BSLLS:NumberOfOptionalParams-on
|
||||
|
||||
// Написать сообщение.
|
||||
//
|
||||
@ -527,10 +530,10 @@
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция НаписатьСообщение(Знач Текст
|
||||
, Знач IDПользователя
|
||||
, Знач Communitytoken
|
||||
, Знач Клавиатура = ""
|
||||
, Знач Параметры = "") Экспорт
|
||||
, Знач IDПользователя
|
||||
, Знач Communitytoken
|
||||
, Знач Клавиатура = ""
|
||||
, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Параметры_.Вставить("access_token", Communitytoken);
|
||||
@ -565,7 +568,7 @@
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
Параметры_.Вставить("owner_id", OPI_Инструменты.ЧислоВСтроку(IDСтены));
|
||||
Параметры_.Вставить("owner_id" , OPI_Инструменты.ЧислоВСтроку(IDСтены));
|
||||
Параметры_.Вставить("from_group" , OPI_Инструменты.ЧислоВСтроку(Параметры_["group_id"]));
|
||||
Параметры_.Вставить("post_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста));
|
||||
Параметры_.Вставить("message" , Текст);
|
||||
@ -615,8 +618,8 @@
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
ДатаНачала = Формат(ДатаНачала - Дата(1970,1,1,1,0,0), "ЧГ=0");
|
||||
ДатаОкончания = Формат(ДатаОкончания - дата(1970,1,1,1,0,0), "ЧГ=0");
|
||||
ДатаНачала = Формат(ДатаНачала - Дата(1970, 1, 1, 1, 0, 0), "ЧГ=0");
|
||||
ДатаОкончания = Формат(ДатаОкончания - дата(1970, 1, 1, 1, 0, 0), "ЧГ=0");
|
||||
|
||||
Параметры_.Вставить("timestamp_from" , ДатаНачала);
|
||||
Параметры_.Вставить("timestamp_to" , ДатаОкончания);
|
||||
@ -631,22 +634,23 @@
|
||||
// Получить статистику постов.
|
||||
//
|
||||
// Параметры:
|
||||
// МассивIDПостов - Массив из Строка,Число - Массив ID постов
|
||||
// МассивИДПостов - Массив из Строка,Число - Массив ID постов
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Массив из Произвольный - Массив данных статистики по постам
|
||||
Функция ПолучитьСтатистикуПостов(Знач МассивIDПостов, Знач Параметры = "") Экспорт
|
||||
Функция ПолучитьСтатистикуПостов(Знач МассивИДПостов, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
МассивОтветов = Новый Массив;
|
||||
МассивНабора = Новый Массив;
|
||||
МаксимумПостов = 30;
|
||||
|
||||
Для Каждого Пост Из МассивIDПостов Цикл
|
||||
Для Каждого Пост Из МассивИДПостов Цикл
|
||||
|
||||
МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост));
|
||||
|
||||
Если МассивНабора.Количество() = 30 Тогда
|
||||
Если МассивНабора.Количество() = МаксимумПостов Тогда
|
||||
|
||||
СтрокаНомеров = СтрСоединить(МассивНабора, ",");
|
||||
Параметры_.Вставить("post_ids", СтрокаНомеров);
|
||||
@ -658,7 +662,8 @@
|
||||
МассивОтветов.Добавить(ЭлементСтатистики);
|
||||
КонецЦикла;
|
||||
|
||||
МассивНабора = Новый Массив
|
||||
МассивНабора = Новый Массив;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
@ -696,14 +701,16 @@
|
||||
Параметры_.Вставить("account_id", OPI_Инструменты.ЧислоВСтроку(IDКабинета));
|
||||
|
||||
МассивСтруктур = Новый Массив;
|
||||
ДатаСтарт = Формат(ТекущаяДатаСеанса() - Дата(1970, 1, 1, 1, 0, 0), "ЧГ=0");
|
||||
ДатаСтоп = Формат(ДобавитьМесяц(ТекущаяДатаСеанса(), 24) - Дата(1970, 1, 1, 1, 0, 0), "ЧГ=0");
|
||||
|
||||
СтруктураКампании = Новый Структура;
|
||||
СтруктураКампании.Вставить("type" , "promoted_posts");
|
||||
СтруктураКампании.Вставить("name" , Наименование);
|
||||
СтруктураКампании.Вставить("day_limit" , 0);
|
||||
СтруктураКампании.Вставить("all_limit" , 0);
|
||||
СтруктураКампании.Вставить("start_time" , Формат(ТекущаяДатаСеанса() - Дата(1970,1,1,1,0,0), "ЧГ=0"));
|
||||
СтруктураКампании.Вставить("stop_time" , Формат(ДобавитьМесяц(ТекущаяДатаСеанса(), 24) - Дата(1970,1,1,1,0,0), "ЧГ=0"));
|
||||
СтруктураКампании.Вставить("start_time" , ДатаСтарт);
|
||||
СтруктураКампании.Вставить("stop_time" , ДатаСтоп);
|
||||
СтруктураКампании.Вставить("status" , 1);
|
||||
|
||||
МассивСтруктур.Добавить(СтруктураКампании);
|
||||
@ -731,17 +738,17 @@
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция СоздатьРекламноеОбъявление(Знач НомерКампании
|
||||
, Знач ДневнойЛимит
|
||||
, Знач НомерКатегории
|
||||
, Знач IDПоста
|
||||
, Знач IDКабинета
|
||||
, Знач Параметры = "") Экспорт
|
||||
, Знач ДневнойЛимит
|
||||
, Знач НомерКатегории
|
||||
, Знач IDПоста
|
||||
, Знач IDКабинета
|
||||
, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Линк = "https://vk.com/wall-"
|
||||
+ Параметры_["group_id"]
|
||||
+ "_"
|
||||
+ OPI_Инструменты.ЧислоВСтроку(IDПоста);
|
||||
+ Параметры_["group_id"]
|
||||
+ "_"
|
||||
+ OPI_Инструменты.ЧислоВСтроку(IDПоста);
|
||||
|
||||
МассивСтруктур = Новый Массив;
|
||||
СтруктураКампании = Новый Структура;
|
||||
@ -815,9 +822,9 @@
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, ДвоичныеДанные, Неопределено - Получить список рекламных категорий
|
||||
Функция ПолучитьСписокРекламныхКатегорий(Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_);
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
@ -869,20 +876,20 @@
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
|
||||
|
||||
//Здесь собрано определение данных для работы с VK API
|
||||
//Вы можете переопределять их, передавая в качестве параметра
|
||||
//Совпадающие поля будут перезаписаны с приоритетом параметра функции
|
||||
|
||||
|
||||
// Здесь собрано определение данных для работы с VK API
|
||||
// Вы можете переопределять их, передавая в качестве параметра
|
||||
// Совпадающие поля будут перезаписаны с приоритетом параметра функции
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
|
||||
//access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена()
|
||||
//from_group - действия будут выполняться от лица группы
|
||||
//owner_id - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был
|
||||
// установлен свой
|
||||
//app_id - id приложения, которое необходимо создать в профиле на странице для разработчиков
|
||||
//group_id - owner_id, но без "-"
|
||||
|
||||
|
||||
// access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена()
|
||||
// from_group - действия будут выполняться от лица группы
|
||||
// owner_id - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был
|
||||
// установлен свой
|
||||
// app_id - id приложения, которое необходимо создать в профиле на странице для разработчиков
|
||||
// group_id - owner_id, но без "-"
|
||||
|
||||
Параметры_.Вставить("access_token" , "");
|
||||
Параметры_.Вставить("from_group" , "1");
|
||||
Параметры_.Вставить("owner_id" , "");
|
||||
|
@ -1,26 +1,27 @@
|
||||
//MIT License
|
||||
// MIT License
|
||||
|
||||
//Copyright (c) 2023 Anton Tsitavets
|
||||
// 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:
|
||||
// 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 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.
|
||||
// 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
|
||||
|
||||
//https://github.com/Bayselonarrend/OpenIntegrations
|
||||
#Область ПрограммныйИнтерфейс
|
||||
|
||||
#Область НастройкиИИнформация
|
||||
@ -99,7 +100,7 @@
|
||||
Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт
|
||||
|
||||
Если Не ТипЗнч(IDПользователей) = Тип("Массив") Тогда
|
||||
|
||||
|
||||
ОдиночныйID = IDПользователей;
|
||||
IDПользователей = Новый Массив;
|
||||
IDПользователей.Добавить(ОдиночныйID);
|
||||
@ -136,7 +137,11 @@
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Ответ сервера Viber
|
||||
Функция ОтправитьТекстовоеСообщение(Знач Токен, Знач Текст, Знач IDПользователя, Знач ОтправкаВКанал, Знач Клавиатура = "") Экспорт
|
||||
Функция ОтправитьТекстовоеСообщение(Знач Токен
|
||||
, Знач Текст
|
||||
, Знач IDПользователя
|
||||
, Знач ОтправкаВКанал
|
||||
, Знач Клавиатура = "") Экспорт
|
||||
|
||||
Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура);
|
||||
|
||||
@ -171,7 +176,12 @@
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Ответ сервера Viber
|
||||
Функция ОтправитьФайл(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Расширение, Знач Размер = "") Экспорт
|
||||
Функция ОтправитьФайл(Знач Токен
|
||||
, Знач URL
|
||||
, Знач IDПользователя
|
||||
, Знач ОтправкаВКанал
|
||||
, Знач Расширение
|
||||
, Знач Размер = "") Экспорт
|
||||
|
||||
Если Не ЗначениеЗаполнено(Размер) Тогда
|
||||
|
||||
@ -207,7 +217,11 @@
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Ответ сервера Viber
|
||||
Функция ОтправитьКонтакт(Знач Токен, Знач ИмяКонтакта, Знач НомерТелефона, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
|
||||
Функция ОтправитьКонтакт(Знач Токен
|
||||
, Знач ИмяКонтакта
|
||||
, Знач НомерТелефона
|
||||
, Знач IDПользователя
|
||||
, Знач ОтправкаВКанал) Экспорт
|
||||
|
||||
СтруктураКонтакта = Новый Структура;
|
||||
СтруктураКонтакта.Вставить("name", ИмяКонтакта);
|
||||
@ -389,4 +403,4 @@
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
#КонецОбласти
|
||||
|
@ -1,363 +1,353 @@
|
||||
//MIT License
|
||||
// MIT License
|
||||
|
||||
//Copyright (c) 2023 Anton Tsitavets
|
||||
// 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:
|
||||
// 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 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.
|
||||
// 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
|
||||
#Область СлужебныйПрограммныйИнтерфейс
|
||||
|
||||
#Область HTTPМетоды
|
||||
|
||||
Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "") Экспорт
|
||||
|
||||
Если Не ЗначениеЗаполнено(Параметры) Тогда
|
||||
Параметры = Новый Структура;
|
||||
КонецЕсли;
|
||||
|
||||
Заголовки = Новый Соответствие;
|
||||
|
||||
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
|
||||
|
||||
Для Каждого Заголовок Из ДопЗаголовки Цикл
|
||||
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
Если Не ЗначениеЗаполнено(Параметры) Тогда
|
||||
Параметры = Новый Структура;
|
||||
КонецЕсли;
|
||||
|
||||
Заголовки = Новый Соответствие;
|
||||
|
||||
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
|
||||
|
||||
Для Каждого Заголовок Из ДопЗаголовки Цикл
|
||||
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
СтруктураURL = РазбитьURL(URL);
|
||||
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL);
|
||||
Запрос = Новый HTTPЗапрос(СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры), Заголовки);
|
||||
Ответ = Соединение.Получить(Запрос);
|
||||
|
||||
Попытка
|
||||
ТелоОтвета = JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
|
||||
Исключение
|
||||
ТелоОтвета = Ответ.ПолучитьТелоКакДвоичныеДанные();
|
||||
КонецПопытки;
|
||||
|
||||
Возврат ТелоОтвета;
|
||||
|
||||
СтруктураURL = РазбитьURL(URL);
|
||||
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL());
|
||||
Запрос = Новый HTTPЗапрос(СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры), Заголовки);
|
||||
Ответ = Соединение.Получить(Запрос);
|
||||
|
||||
Попытка
|
||||
ТелоОтвета = JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
|
||||
Исключение
|
||||
ТелоОтвета = Ответ.ПолучитьТелоКакДвоичныеДанные();
|
||||
КонецПопытки;
|
||||
|
||||
Возврат ТелоОтвета;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// BSLLS:CognitiveComplexity-off
|
||||
|
||||
Функция PostMultipart(Знач URL
|
||||
, Знач Параметры
|
||||
, Знач Файлы = ""
|
||||
, Знач ТипКонтента = "image/jpeg"
|
||||
, Знач ДопЗаголовки = "") Экспорт
|
||||
Функция PostMultipart(Знач URL, Знач Параметры, Знач Файлы = "", Знач ТипКонтента = "image/jpeg",
|
||||
Знач ДопЗаголовки = "") Экспорт
|
||||
|
||||
Если Не ЗначениеЗаполнено(Параметры) Тогда
|
||||
Параметры = Новый Структура;
|
||||
КонецЕсли;
|
||||
|
||||
Если Не ЗначениеЗаполнено(Файлы) Тогда
|
||||
Файлы = Новый Соответствие;
|
||||
КонецЕсли;
|
||||
|
||||
ЗаменаТочки = "___";
|
||||
GZip = "gzip";
|
||||
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
|
||||
СтруктураURL = РазбитьURL(URL);
|
||||
|
||||
Заголовки = Новый Соответствие;
|
||||
Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
|
||||
Заголовки.Вставить("Accept-Encoding", GZip);
|
||||
Заголовки.Вставить("Accept", "*/*");
|
||||
Заголовки.Вставить("Connection", "keep-alive");
|
||||
|
||||
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
|
||||
|
||||
Для Каждого Заголовок Из ДопЗаголовки Цикл
|
||||
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL);
|
||||
НовыйЗапрос = Новый HTTPЗапрос(СтруктураURL["Адрес"], Заголовки);
|
||||
ТелоЗапроса = НовыйЗапрос.ПолучитьТелоКакПоток();
|
||||
ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, "", "", Ложь);
|
||||
|
||||
РазделительСтрок = Символы.ВК + Символы.ПС;
|
||||
|
||||
Для Каждого Параметр Из Параметры Цикл
|
||||
|
||||
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
|
||||
ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """");
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
|
||||
Если Не ЗначениеЗаполнено(Параметры) Тогда
|
||||
Параметры = Новый Структура;
|
||||
КонецЕсли;
|
||||
|
||||
Если Не ЗначениеЗаполнено(Файлы) Тогда
|
||||
Файлы = Новый Соответствие;
|
||||
КонецЕсли;
|
||||
|
||||
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
|
||||
СтруктураURL = РазбитьURL(URL);
|
||||
|
||||
Заголовки = Новый Соответствие();
|
||||
Заголовки.Вставить("Content-Type" , "multipart/form-data; boundary=" + Boundary);
|
||||
Заголовки.Вставить("Accept-Encoding" , "gzip");
|
||||
Заголовки.Вставить("Accept" , "*/*");
|
||||
Заголовки.Вставить("Connection" , "keep-alive");
|
||||
|
||||
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
|
||||
|
||||
Для Каждого Заголовок Из ДопЗаголовки Цикл
|
||||
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL());
|
||||
НовыйЗапрос = Новый HTTPЗапрос(СтруктураURL["Адрес"], Заголовки);
|
||||
ТелоЗапроса = НовыйЗапрос.ПолучитьТелоКакПоток();
|
||||
ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, "", "", Ложь);
|
||||
|
||||
РазделительСтрок = Символы.ВК + Символы.ПС;
|
||||
|
||||
Для Каждого Параметр Из Параметры Цикл
|
||||
|
||||
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
|
||||
ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """");
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
|
||||
Если ТипЗнч(Параметр.Значение) = Тип("Строка") Тогда
|
||||
ЗаписьТекста.ЗаписатьСтроку(Параметр.Значение);
|
||||
Иначе
|
||||
ЗаписьТекста.Записать(Параметр.Значение);
|
||||
КонецЕсли;
|
||||
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Счетчик = 0;
|
||||
Для Каждого Файл Из Файлы Цикл
|
||||
|
||||
Если ТипКонтента = "image/jpeg" Тогда
|
||||
ИмяФайлаОтправки = "photo";
|
||||
Иначе
|
||||
ИмяФайлаОтправки = СтрЗаменить(Файл.Ключ, "___", ".");
|
||||
ИмяФайлаОтправки = Лев(ИмяФайлаОтправки, СтрНайти(ИмяФайлаОтправки, ".") - 1);
|
||||
ИмяФайлаОтправки = ?(ЗначениеЗаполнено(ИмяФайлаОтправки)
|
||||
, ИмяФайлаОтправки
|
||||
, СтрЗаменить(Файл.Ключ, "___", "."));
|
||||
КонецЕсли;
|
||||
|
||||
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
|
||||
ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name="""
|
||||
+ ИмяФайлаОтправки
|
||||
+"""; filename="""
|
||||
+ СтрЗаменить(Файл.Ключ, "___", ".")
|
||||
+ """");
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + ТипКонтента);
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
ЗаписьТекста.Записать(Файл.Значение);
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
|
||||
Счетчик = Счетчик + 1;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
|
||||
|
||||
ЗаписьТекста.Закрыть();
|
||||
|
||||
Ответ = Соединение.ВызватьHTTPМетод("POST", НовыйЗапрос);
|
||||
|
||||
НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = "gzip" Или
|
||||
Ответ.Заголовки.Получить("content-encoding") = "gzip";
|
||||
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Счетчик = 0;
|
||||
Для Каждого Файл Из Файлы Цикл
|
||||
|
||||
ПутьФайл = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
|
||||
|
||||
Если ТипКонтента = "image/jpeg" Тогда
|
||||
ИмяФайлаОтправки = "photo";
|
||||
Иначе
|
||||
ИмяФайлаОтправки = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
|
||||
ИмяФайлаОтправки = Лев(ИмяФайлаОтправки, СтрНайти(ИмяФайлаОтправки, ".") - 1);
|
||||
ИмяФайлаОтправки = ?(ЗначениеЗаполнено(ИмяФайлаОтправки), ИмяФайлаОтправки, СтрЗаменить(Файл.Ключ,
|
||||
ЗаменаТочки, "."));
|
||||
КонецЕсли;
|
||||
|
||||
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
|
||||
ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + ИмяФайлаОтправки + """; filename=""" + ПутьФайл
|
||||
+ """");
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + ТипКонтента);
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
ЗаписьТекста.Записать(Файл.Значение);
|
||||
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
|
||||
|
||||
Счетчик = Счетчик + 1;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
|
||||
|
||||
ЗаписьТекста.Закрыть();
|
||||
|
||||
Ответ = Соединение.ВызватьHTTPМетод("POST", НовыйЗапрос);
|
||||
|
||||
НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = GZip Или Ответ.Заголовки.Получить(
|
||||
"content-encoding") = GZip;
|
||||
|
||||
Если НужнаРаспаковка Тогда
|
||||
Ответ = РаспаковатьОтвет(Ответ);
|
||||
КонецЕсли;
|
||||
|
||||
Возврат ?(ТипЗнч(Ответ) = Тип("ДвоичныеДанные")
|
||||
, JsonВСтруктуру(Ответ)
|
||||
, JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные()));
|
||||
|
||||
Ответ = РаспаковатьОтвет(Ответ);
|
||||
КонецЕсли;
|
||||
|
||||
Возврат ?(ТипЗнч(Ответ) = Тип("ДвоичныеДанные"), JsonВСтруктуру(Ответ), JsonВСтруктуру(
|
||||
Ответ.ПолучитьТелоКакДвоичныеДанные()));
|
||||
|
||||
КонецФункции
|
||||
|
||||
// BSLLS:CognitiveComplexity-on
|
||||
|
||||
Функция Post(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач JSON = Истина) Экспорт
|
||||
|
||||
Если Не ЗначениеЗаполнено(Параметры) Тогда
|
||||
Параметры = Новый Структура;
|
||||
КонецЕсли;
|
||||
|
||||
ТипДанных = ?(JSON, "application/json", "application/x-www-form-urlencoded");
|
||||
СтруктураURL = РазбитьURL(URL);
|
||||
|
||||
Заголовки = Новый Соответствие();
|
||||
Заголовки.Вставить("Content-Type" , ТипДанных);
|
||||
Заголовки.Вставить("Accept-Encoding" , "gzip");
|
||||
Заголовки.Вставить("Accept" , "*/*");
|
||||
Заголовки.Вставить("Connection" , "keep-alive");
|
||||
|
||||
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
|
||||
|
||||
Для Каждого Заголовок Из ДопЗаголовки Цикл
|
||||
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL());
|
||||
НовыйЗапрос = Новый HTTPЗапрос(СтруктураURL["Адрес"], Заголовки);
|
||||
Если Не ЗначениеЗаполнено(Параметры) Тогда
|
||||
Параметры = Новый Структура;
|
||||
КонецЕсли;
|
||||
|
||||
GZip = "gzip";
|
||||
ТипДанных = ?(JSON, "application/json", "application/x-www-form-urlencoded");
|
||||
СтруктураURL = РазбитьURL(URL);
|
||||
|
||||
Заголовки = Новый Соответствие;
|
||||
Заголовки.Вставить("Content-Type", ТипДанных);
|
||||
Заголовки.Вставить("Accept-Encoding", GZip);
|
||||
Заголовки.Вставить("Accept", "*/*");
|
||||
Заголовки.Вставить("Connection", "keep-alive");
|
||||
|
||||
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
|
||||
|
||||
Для Каждого Заголовок Из ДопЗаголовки Цикл
|
||||
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL);
|
||||
НовыйЗапрос = Новый HTTPЗапрос(СтруктураURL["Адрес"], Заголовки);
|
||||
|
||||
Если JSON Тогда
|
||||
Данные = JSONСтрокой(Параметры);
|
||||
Данные = JSONСтрокой(Параметры);
|
||||
Иначе
|
||||
СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры);
|
||||
Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
|
||||
Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
|
||||
КонецЕсли;
|
||||
|
||||
НовыйЗапрос.УстановитьТелоИзСтроки(Данные);
|
||||
|
||||
Ответ = Соединение.ВызватьHTTPМетод("POST", НовыйЗапрос);
|
||||
|
||||
НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = "gzip" Или
|
||||
Ответ.Заголовки.Получить("content-encoding") = "gzip";
|
||||
|
||||
НовыйЗапрос.УстановитьТелоИзСтроки(Данные);
|
||||
|
||||
Ответ = Соединение.ВызватьHTTPМетод("POST", НовыйЗапрос);
|
||||
|
||||
НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = GZip Или Ответ.Заголовки.Получить(
|
||||
"content-encoding") = GZip;
|
||||
|
||||
Если НужнаРаспаковка Тогда
|
||||
Ответ = РаспаковатьОтвет(Ответ);
|
||||
Ответ = РаспаковатьОтвет(Ответ);
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ);
|
||||
|
||||
|
||||
Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
|
||||
|
||||
|
||||
Попытка
|
||||
Ответ = JsonВСтруктуру(Ответ)
|
||||
Ответ = JsonВСтруктуру(Ответ);
|
||||
Исключение
|
||||
Ответ = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
|
||||
Ответ = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
|
||||
КонецПопытки;
|
||||
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
|
||||
|
||||
СоответствиеВозврата = Новый Соответствие;
|
||||
КоличествоЧастей = 2;
|
||||
МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь);
|
||||
|
||||
Для Каждого Параметр Из МассивПараметров Цикл
|
||||
|
||||
МассивКлючЗначение = СтрРазделить(Параметр, "=");
|
||||
|
||||
|
||||
Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда
|
||||
СоответствиеВозврата.Вставить(МассивКлючЗначение[0]
|
||||
, МассивКлючЗначение[1]);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат СоответствиеВозврата;
|
||||
|
||||
|
||||
СоответствиеВозврата = Новый Соответствие;
|
||||
КоличествоЧастей = 2;
|
||||
МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь);
|
||||
|
||||
Для Каждого Параметр Из МассивПараметров Цикл
|
||||
|
||||
МассивКлючЗначение = СтрРазделить(Параметр, "=");
|
||||
|
||||
Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда
|
||||
СоответствиеВозврата.Вставить(МассивКлючЗначение[0], МассивКлючЗначение[1]);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат СоответствиеВозврата;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура ЗаменитьСпецСимволы(Текст) Экспорт
|
||||
|
||||
МассивСимволов = Новый Соответствие;
|
||||
МассивСимволов.Вставить("<", "<");
|
||||
МассивСимволов.Вставить(">", ">");
|
||||
МассивСимволов.Вставить("&", "&");
|
||||
МассивСимволов.Вставить("_", " ");
|
||||
МассивСимволов.Вставить("[", "(");
|
||||
МассивСимволов.Вставить("]", ")");
|
||||
|
||||
Для Каждого СимволМассива Из МассивСимволов Цикл
|
||||
Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
|
||||
МассивСимволов = Новый Соответствие;
|
||||
МассивСимволов.Вставить("<", "<");
|
||||
МассивСимволов.Вставить(">", ">");
|
||||
МассивСимволов.Вставить("&", "&");
|
||||
МассивСимволов.Вставить("_", " ");
|
||||
МассивСимволов.Вставить("[", "(");
|
||||
МассивСимволов.Вставить("]", ")");
|
||||
|
||||
Для Каждого СимволМассива Из МассивСимволов Цикл
|
||||
Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция UNIXTime(Знач Дата) Экспорт
|
||||
Возврат Формат(Дата - Дата(1970,1,1,1,0,0), "ЧГ=0");
|
||||
Возврат Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧГ=0");
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область Служебные
|
||||
|
||||
Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт
|
||||
|
||||
Если Параметры.Количество() = 0 Тогда
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт
|
||||
|
||||
Если Параметры.Количество() = 0 Тогда
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
|
||||
СтрокаПараметров = "?";
|
||||
|
||||
Для Каждого Параметр Из Параметры Цикл
|
||||
СтрокаПараметров = СтрокаПараметров + Параметр.Ключ + "=" + КодироватьСтроку(Параметр.Значение,
|
||||
СпособКодированияСтроки.КодировкаURL) + "&";
|
||||
КонецЦикла;
|
||||
|
||||
СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
|
||||
|
||||
Возврат СтрокаПараметров;
|
||||
|
||||
СтрокаПараметров = "?";
|
||||
|
||||
Для Каждого Параметр Из Параметры Цикл
|
||||
СтрокаПараметров = СтрокаПараметров + Параметр.Ключ + "=" + КодироватьСтроку(Параметр.Значение, СпособКодированияСтроки.КодировкаURL) + "&";
|
||||
КонецЦикла;
|
||||
|
||||
СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
|
||||
|
||||
Возврат СтрокаПараметров;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция РазбитьURL(Знач URL) Экспорт
|
||||
|
||||
URL = СтрЗаменить(URL, "https://", "");
|
||||
URL = СтрЗаменить(URL, "http://" , "");
|
||||
URL = СтрЗаменить(URL, "www." , "");
|
||||
|
||||
СтруктураВозврата = Новый Структура;
|
||||
СтруктураВозврата.Вставить("Сервер" , Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1));
|
||||
СтруктураВозврата.Вставить("Адрес" , Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1));
|
||||
|
||||
Возврат СтруктураВозврата;
|
||||
|
||||
|
||||
URL = СтрЗаменить(URL, "https://", "");
|
||||
URL = СтрЗаменить(URL, "http://", "");
|
||||
URL = СтрЗаменить(URL, "www.", "");
|
||||
|
||||
СтруктураВозврата = Новый Структура;
|
||||
СтруктураВозврата.Вставить("Сервер", Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1));
|
||||
СтруктураВозврата.Вставить("Адрес", Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1));
|
||||
|
||||
Возврат СтруктураВозврата;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция JsonВСтруктуру(Знач Текст, Знач Кодировка = "utf-8") Экспорт
|
||||
|
||||
|
||||
Если Не ЗначениеЗаполнено(Текст) Тогда
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
|
||||
ЧтениеJSON = Новый ЧтениеJSON;
|
||||
ЧтениеJSON.ОткрытьПоток(Текст.ОткрытьПотокДляЧтения());
|
||||
|
||||
Данные = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
|
||||
Чтение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.Windows, " ", Истина, ЭкранированиеСимволовJSON.Нет,
|
||||
Ложь, Ложь, Ложь, Ложь);
|
||||
|
||||
ЗаписьJSON = Новый ЗаписьJSON;
|
||||
ЗаписьJSON.ПроверятьСтруктуру = Истина;
|
||||
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
|
||||
|
||||
ЗаписатьJSON(ЗаписьJSON, Данные);
|
||||
Возврат ЗаписьJSON.Закрыть();
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЧислоВСтроку(Знач Число) Экспорт
|
||||
Возврат СтрЗаменить(Строка(Число), Символы.НПП, "");
|
||||
Возврат СтрЗаменить(Строка(Число), Символы.НПП, "");
|
||||
КонецФункции
|
||||
|
||||
Процедура ВыполнитьСкрипт(Знач Текст) Экспорт
|
||||
|
||||
|
||||
ИмяСкрипта = ПолучитьИмяВременногоФайла(".ps1");
|
||||
ТекстСкрипта = Новый ТекстовыйДокумент();
|
||||
|
||||
ТекстСкрипта.УстановитьТекст(Текст);
|
||||
|
||||
ТекстСкрипта = Новый ТекстовыйДокумент;
|
||||
|
||||
ТекстСкрипта.УстановитьТекст(Текст);
|
||||
|
||||
ТекстСкрипта.Записать(ИмяСкрипта, КодировкаТекста.UTF8);
|
||||
|
||||
КодВозврата = 0;
|
||||
ЗапуститьПриложение("powershell -file " + ИмяСкрипта + " -noexit", , Истина, КодВозврата);
|
||||
|
||||
УдалитьФайлы(ИмяСкрипта);
|
||||
|
||||
КодВозврата = 0;
|
||||
ЗапуститьПриложение("powershell -file " + ИмяСкрипта + " -noexit", , Истина, КодВозврата);
|
||||
|
||||
УдалитьФайлы(ИмяСкрипта);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция РазмерДанныхB64(Знач Base64Строка) Экспорт
|
||||
|
||||
РазмерДанных = СтрДлина(Base64Строка)
|
||||
- ?(Прав(Base64Строка, 1) = "=", 1, 0)
|
||||
- ?(Прав(Base64Строка, 2) = "==", 1, 0);
|
||||
|
||||
Возврат Цел(РазмерДанных / 4 * 3);
|
||||
|
||||
Конецфункции
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
@ -392,170 +382,175 @@
|
||||
//
|
||||
// Требования: платформа 1С версии 8.3.10 и выше
|
||||
|
||||
// BSLLS:LatinAndCyrillicSymbolInWord-off
|
||||
|
||||
Функция РаспаковатьОтвет(Ответ)
|
||||
|
||||
Попытка
|
||||
Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные());
|
||||
Исключение
|
||||
Возврат Ответ;
|
||||
|
||||
Попытка
|
||||
Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные());
|
||||
Исключение
|
||||
Возврат Ответ;
|
||||
КонецПопытки;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПрочитатьGZip(СжатыеДанные) Экспорт
|
||||
|
||||
РазмерПрефиксаGZip = 10;
|
||||
РазмерПостфиксаGZip = 8;
|
||||
|
||||
ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные);
|
||||
ЧтениеДанных.Пропустить(РазмерПрефиксаGZip);
|
||||
РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip;
|
||||
|
||||
ПотокZip = Новый ПотокВПамяти(ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD() + ZipРазмерCDH() + ZipРазмерEOCD());
|
||||
ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
|
||||
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH());
|
||||
ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных);
|
||||
|
||||
ЗаписьДанных.Закрыть();
|
||||
ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
|
||||
|
||||
CRC32 = ЧтениеДанных.ПрочитатьЦелое32();
|
||||
РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32();
|
||||
ЧтениеДанных.Закрыть();
|
||||
|
||||
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
|
||||
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
|
||||
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных));
|
||||
ЗаписьДанных.Закрыть();
|
||||
|
||||
Возврат ПрочитатьZip(ПотокZip);
|
||||
|
||||
|
||||
РазмерПрефиксаGZip = 10;
|
||||
РазмерПостфиксаGZip = 8;
|
||||
|
||||
ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные);
|
||||
ЧтениеДанных.Пропустить(РазмерПрефиксаGZip);
|
||||
РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip;
|
||||
|
||||
ПотокZip = Новый ПотокВПамяти(ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD() + ZipРазмерCDH()
|
||||
+ ZipРазмерEOCD());
|
||||
ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
|
||||
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH());
|
||||
ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных);
|
||||
|
||||
ЗаписьДанных.Закрыть();
|
||||
ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
|
||||
|
||||
CRC32 = ЧтениеДанных.ПрочитатьЦелое32();
|
||||
РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32();
|
||||
ЧтениеДанных.Закрыть();
|
||||
|
||||
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
|
||||
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
|
||||
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных));
|
||||
ЗаписьДанных.Закрыть();
|
||||
|
||||
Возврат ПрочитатьZip(ПотокZip);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено)
|
||||
|
||||
Каталог = ПолучитьИмяВременногоФайла();
|
||||
ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные);
|
||||
ИмяФайла = ЧтениеZip.Элементы[0].Имя;
|
||||
Попытка
|
||||
ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
|
||||
Исключение
|
||||
|
||||
Каталог = ПолучитьИмяВременногоФайла();
|
||||
ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные);
|
||||
ИмяФайла = ЧтениеZip.Элементы[0].Имя;
|
||||
Попытка
|
||||
ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
|
||||
Исключение
|
||||
// Игнорируем проверку целостности архива, просто читаем результат
|
||||
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
|
||||
КонецПопытки;
|
||||
ЧтениеZip.Закрыть();
|
||||
|
||||
Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
|
||||
УдалитьФайлы(Каталог);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
|
||||
КонецПопытки;
|
||||
ЧтениеZip.Закрыть();
|
||||
|
||||
Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
|
||||
УдалитьФайлы(Каталог);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ZipРазмерLFH()
|
||||
|
||||
Возврат 34;
|
||||
|
||||
|
||||
Возврат 34;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ZipРазмерDD()
|
||||
|
||||
Возврат 16;
|
||||
|
||||
|
||||
Возврат 16;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ZipРазмерCDH()
|
||||
|
||||
Возврат 50;
|
||||
|
||||
|
||||
Возврат 50;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ZipРазмерEOCD()
|
||||
|
||||
Возврат 22;
|
||||
|
||||
|
||||
Возврат 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", Ложь));
|
||||
|
||||
Возврат Буфер;
|
||||
|
||||
Буфер = Новый БуферДвоичныхДанных(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, РазмерНесжатыхДанных);
|
||||
|
||||
Возврат Буфер;
|
||||
|
||||
Буфер = Новый БуферДвоичныхДанных(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", Ложь));
|
||||
|
||||
Возврат Буфер;
|
||||
Буфер = Новый БуферДвоичныхДанных(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
|
||||
Размер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
|
||||
|
||||
Возврат Буфер;
|
||||
|
||||
Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD());
|
||||
Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number
|
||||
|
||||
Возврат Буфер;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// BSLLS:LatinAndCyrillicSymbolInWord-on
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
@ -27,13 +27,15 @@
|
||||
|
||||
Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт
|
||||
|
||||
Дважды = 2;
|
||||
|
||||
Если Ключ.Размер() > РазмерБлока Тогда
|
||||
Ключ = Хеш(Ключ, Тип);
|
||||
КонецЕсли;
|
||||
|
||||
Если Ключ.Размер() <= РазмерБлока Тогда
|
||||
Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
|
||||
Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * 2);
|
||||
Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * Дважды);
|
||||
КонецЕсли;
|
||||
|
||||
Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));
|
||||
|
Loading…
x
Reference in New Issue
Block a user