1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-04-17 12:06:34 +02:00

Форматирование и деффекты SC

This commit is contained in:
Anton 2024-01-20 14:39:18 +03:00
parent 32196e8ed9
commit 9fcf1a71bc
5 changed files with 962 additions and 934 deletions

View File

@ -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 // Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights // in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is // copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions: // furnished to do so, subject to the following conditions:
//The above copyright notice and this permission notice shall be included in all // The above copyright notice and this permission notice shall be included in all
//copies or substantial portions of the Software. // copies or substantial portions of the Software.
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // 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 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
//SOFTWARE. // SOFTWARE.
//https://github.com/Bayselonarrend/OpenIntegrations // https://github.com/Bayselonarrend/OpenIntegrations
//Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры() // Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
//и почитать комментарии // и почитать комментарии
#Область ПрограммныйИнтерфейс #Область ПрограммныйИнтерфейс
@ -36,24 +36,24 @@
// Возвращаемое значение: // Возвращаемое значение:
// Строка - URL для перехода в браузере // Строка - URL для перехода в браузере
Функция ПолучитьСсылкуАвторизации(Параметры = "") Экспорт Функция ПолучитьСсылкуАвторизации(Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
ПараметрыURL = Новый Структура; ПараметрыURL = Новый Структура;
ПараметрыURL.Вставить("response_type" , "code"); ПараметрыURL.Вставить("response_type" , "code");
ПараметрыURL.Вставить("client_id" , Параметры_["client_id"]); ПараметрыURL.Вставить("client_id" , Параметры_["client_id"]);
ПараметрыURL.Вставить("redirect_uri" , Параметры_["redirect_uri"]); ПараметрыURL.Вставить("redirect_uri" , Параметры_["redirect_uri"]);
ПараметрыURL.Вставить("scope" , Параметры_["scope"]); ПараметрыURL.Вставить("scope" , Параметры_["scope"]);
ПараметрыURL.Вставить("state" , "state"); ПараметрыURL.Вставить("state" , "state");
ПараметрыURL.Вставить("code_challenge" , "challenge"); ПараметрыURL.Вставить("code_challenge" , "challenge");
ПараметрыURL.Вставить("code_challenge_method", "plain"); ПараметрыURL.Вставить("code_challenge_method", "plain");
Линк = "https://twitter.com/i/oauth2/authorize" Линк = "https://twitter.com/i/oauth2/authorize"
+ OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
Возврат Линк; Возврат Линк;
КонецФункции КонецФункции
// Получить токен. // Получить токен.
@ -65,21 +65,21 @@
// Возвращаемое значение: // Возвращаемое значение:
// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера // HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
Функция ПолучитьТокен(Знач Код, Знач Параметры = "") Экспорт Функция ПолучитьТокен(Знач Код, Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
ПараметрыЗапроса = Новый Структура; ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("code" , Код); ПараметрыЗапроса.Вставить("code" , Код);
ПараметрыЗапроса.Вставить("grant_type" , "authorization_code"); ПараметрыЗапроса.Вставить("grant_type" , "authorization_code");
ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]); ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]);
ПараметрыЗапроса.Вставить("redirect_uri" , Параметры_["redirect_uri"]); ПараметрыЗапроса.Вставить("redirect_uri" , Параметры_["redirect_uri"]);
ПараметрыЗапроса.Вставить("code_verifier", "challenge"); ПараметрыЗапроса.Вставить("code_verifier", "challenge");
Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token" Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
, ПараметрыЗапроса, , Ложь); , ПараметрыЗапроса, , Ложь);
Возврат Ответ; Возврат Ответ;
КонецФункции КонецФункции
// Обновить токен v2 токен при помощи refresh_token // Обновить токен v2 токен при помощи refresh_token
@ -90,18 +90,19 @@
// Возвращаемое значение: // Возвращаемое значение:
// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера // HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
Функция ОбновитьТокен(Знач Параметры = "") Экспорт Функция ОбновитьТокен(Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Refresh = "refresh_token";
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("refresh_token", Параметры_["refresh_token"]); ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("grant_type" , "refresh_token"); ПараметрыЗапроса.Вставить(Refresh , Параметры_[Refresh]);
ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]); ПараметрыЗапроса.Вставить("grant_type" , Refresh);
ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]);
Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
, ПараметрыЗапроса, , Ложь); Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
, ПараметрыЗапроса, , Ложь);
Возврат Ответ;
Возврат Ответ;
КонецФункции КонецФункции
@ -115,15 +116,15 @@
// Возвращаемое значение: // Возвращаемое значение:
// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера // HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
Функция ОбработкаВходящегоЗапросаПослеАвторизации(Запрос) Экспорт Функция ОбработкаВходящегоЗапросаПослеАвторизации(Запрос) Экспорт
Код = Запрос.ПараметрыЗапроса["code"]; Код = Запрос.ПараметрыЗапроса["code"];
ОтветТокен = ПолучитьТокен(Код); ОтветТокен = ПолучитьТокен(Код);
//Предпочтительное хранение токенов // Предпочтительное хранение токенов
//Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]); // Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]);
//Константы.TwitterToken.Установить(ОтветТокен["access_token"]); // Константы.TwitterToken.Установить(ОтветТокен["access_token"]);
Возврат ОтветТокен; Возврат ОтветТокен;
КонецФункции КонецФункции
@ -143,53 +144,56 @@
// Возвращаемое значение: // Возвращаемое значение:
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать произвольный твит // Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать произвольный твит
//@skip-check method-too-many-params //@skip-check method-too-many-params
// BSLLS:NumberOfOptionalParams-off
Функция СоздатьПроизвольныйТвит(Знач Текст = "" Функция СоздатьПроизвольныйТвит(Знач Текст = ""
, Знач МассивМедиа = "" , Знач МассивМедиа = ""
, Знач МассивВариантовОпроса = "" , Знач МассивВариантовОпроса = ""
, Знач ДлительностьОпроса = "" , Знач ДлительностьОпроса = ""
, Знач Параметры = "") Экспорт , Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
URL = "https://api.twitter.com/2/tweets"; URL = "https://api.twitter.com/2/tweets";
Массив = "Массив";
Если Не ТипЗнч(МассивМедиа) = Тип("Массив") Тогда
МассивМедиа_ = Новый Массив; Если Не ТипЗнч(МассивМедиа) = Тип(Массив) Тогда
МассивМедиа_ = Новый Массив;
Если ЗначениеЗаполнено(МассивМедиа) Тогда
МассивМедиа_.Добавить(МассивМедиа); Если ЗначениеЗаполнено(МассивМедиа) Тогда
КонецЕсли; МассивМедиа_.Добавить(МассивМедиа);
КонецЕсли;
МассивМедиа = МассивМедиа_;
КонецЕсли; МассивМедиа = МассивМедиа_;
КонецЕсли;
Поля = Новый Соответствие;
Поля = Новый Соответствие;
Если ЗначениеЗаполнено(Текст) Тогда
Поля.Вставить("text", Текст); Если ЗначениеЗаполнено(Текст) Тогда
КонецЕсли; Поля.Вставить("text", Текст);
КонецЕсли;
Если ТипЗнч(МассивВариантовОпроса) = Тип("Массив") И ЗначениеЗаполнено(ДлительностьОпроса) Тогда
Если ТипЗнч(МассивВариантовОпроса) = Тип(Массив) И ЗначениеЗаполнено(ДлительностьОпроса) Тогда
ДлительностьОпроса = Число(ДлительностьОпроса);
ДлительностьОпроса = Число(ДлительностьОпроса);
Если МассивВариантовОпроса.Количество()> 0 Тогда
Поля.Вставить("poll" Если МассивВариантовОпроса.Количество() > 0 Тогда
, Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса)); Поля.Вставить("poll"
КонецЕсли; , Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса));
КонецЕсли; КонецЕсли;
КонецЕсли;
Если ТипЗнч(МассивМедиа) = Тип("Массив") Тогда
Если МассивМедиа.Количество() > 0 Тогда Если ТипЗнч(МассивМедиа) = Тип(Массив) Тогда
Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа)); Если МассивМедиа.Количество() > 0 Тогда
КонецЕсли; Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа));
КонецЕсли; КонецЕсли;
КонецЕсли;
Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация); Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация);
Возврат Ответ; Возврат Ответ;
КонецФункции КонецФункции
// BSLLS:NumberOfOptionalParams-on
// Создать текстовый твит. // Создать текстовый твит.
// //
@ -200,7 +204,7 @@
// Возвращаемое значение: // Возвращаемое значение:
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать текстовый твит // Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать текстовый твит
Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт
Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры); Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры);
КонецФункции КонецФункции
// Создать твит картинки. // Создать твит картинки.
@ -213,10 +217,10 @@
// Возвращаемое значение: // Возвращаемое значение:
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит картинки // Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит картинки
Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт
МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры); МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
КонецФункции КонецФункции
// Создать твит гифки. // Создать твит гифки.
@ -229,10 +233,10 @@
// Возвращаемое значение: // Возвращаемое значение:
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит гифки // Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит гифки
Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт
МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры); МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
КонецФункции КонецФункции
// Создать твит видео. // Создать твит видео.
@ -245,10 +249,10 @@
// Возвращаемое значение: // Возвращаемое значение:
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит видео // Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит видео
Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт
МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры); МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
КонецФункции КонецФункции
// Создать твит опрос. // Создать твит опрос.
@ -262,7 +266,7 @@
// Возвращаемое значение: // Возвращаемое значение:
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит опрос // Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит опрос
Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт
Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры); Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры);
КонецФункции КонецФункции
// Загрузить массив вложений. // Загрузить массив вложений.
@ -275,34 +279,33 @@
// Возвращаемое значение: // Возвращаемое значение:
// Массив Из Строка - Массив ID медиа // Массив Из Строка - Массив ID медиа
Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт
МассивМедиа = Новый Массив; МассивМедиа = Новый Массив;
Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Если ЗначениеЗаполнено(МассивФайлов) Тогда Если ЗначениеЗаполнено(МассивФайлов) Тогда
Если Не ТипЗнч(МассивФайлов) = Тип("Массив") Тогда Если Не ТипЗнч(МассивФайлов) = Тип("Массив") Тогда
МассивФайлов_ = Новый Массив; МассивФайлов_ = Новый Массив;
МассивФайлов_.Добавить(МассивФайлов); МассивФайлов_.Добавить(МассивФайлов);
МассивФайлов = МассивФайлов_; МассивФайлов = МассивФайлов_;
КонецЕсли; КонецЕсли;
Для Каждого ФайлОтправки Из МассивФайлов Цикл
Для Каждого ФайлОтправки Из МассивФайлов Цикл
Если Не ТипЗнч(ФайлОтправки) = Тип("ДвоичныеДанные") Тогда
Если Не ТипЗнч(ФайлОтправки) = Тип("ДвоичныеДанные") Тогда ФайлОтправки = Новый ДвоичныеДанные(ФайлОтправки);
ФайлОтправки = Новый ДвоичныеДанные(ФайлОтправки); КонецЕсли;
КонецЕсли;
IDМедиа = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_)["media_id_string"];
IDМедиа = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_)["media_id_string"]; МассивМедиа.Добавить(IDМедиа);
МассивМедиа.Добавить(IDМедиа);
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат МассивМедиа;
Возврат МассивМедиа;
КонецФункции КонецФункции
#КонецОбласти #КонецОбласти
@ -312,156 +315,159 @@
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры) Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры)
СоответствиеMIME = Новый Соответствие; Command = "command";
СоответствиеMIME.Вставить("tweet_image", "image/jpeg"); ВидЗапроса = "POST";
СоответствиеMIME.Вставить("tweet_video", "video/mp4"); Единица = 1024;
СоответствиеMIME.Вставить("tweet_gif" , "image/gif"); Количество = 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" Тогда
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Поля = Новый Структура; URL = "https://upload.twitter.com/1.1/media/upload.json";
Поля.Вставить("media_data" , Base64Строка(Файл)); Размер = Файл.Размер();
Поля.Вставить("media_category", Тип);
Если Тип = "tweet_image" Тогда
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL);
Поля = Новый Структура;
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); Поля.Вставить("media_data" , Base64Строка(Файл));
Поля.Вставить("media_category", Тип);
Иначе
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL);
ЧтениеДанных = Новый ЧтениеДанных(Файл);
МассивЧтения = ЧтениеДанных.РазделитьНаЧастиПо(4*1024*1024); Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
Поля = Новый Структура; Иначе
Поля.Вставить("command" , "INIT");
Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер)); ЧтениеДанных = Новый ЧтениеДанных(Файл);
Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип)); МассивЧтения = ЧтениеДанных.РазделитьНаЧастиПо(Количество * Единица * Единица);
Поля.Вставить("media_category" , Тип);
Поля = Новый Структура;
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL); Поля.Вставить(Command , "INIT");
Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер));
Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип));
Поля.Вставить("media_category" , Тип);
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL);
ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
KeyИнициализации = ОтветИнициализации["media_key"]; KeyИнициализации = ОтветИнициализации["media_key"];
IDИнициализации = ОтветИнициализации["media_id_string"]; IDИнициализации = ОтветИнициализации["media_id_string"];
Счетчик = 0; Счетчик = 0;
Для Каждого Часть Из МассивЧтения Цикл Для Каждого Часть Из МассивЧтения Цикл
ДвоичныеЧасти = Часть.ПолучитьДвоичныеДанные(); ДвоичныеЧасти = Часть.ПолучитьДвоичныеДанные();
Поля = Новый Структура; Поля = Новый Структура;
Поля.Вставить("command" , "APPEND"); Поля.Вставить(Command , "APPEND");
Поля.Вставить("media_key" , KeyИнициализации); Поля.Вставить("media_key" , KeyИнициализации);
Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик)); Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик));
Поля.Вставить("media" , ДвоичныеЧасти); Поля.Вставить("media" , ДвоичныеЧасти);
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Новый Структура, "POST", URL); Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Новый Структура, ВидЗапроса, URL);
OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация); OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация);
Счетчик = Счетчик + 1; Счетчик = Счетчик + 1;
КонецЦикла; КонецЦикла;
Поля = Новый Структура; Поля = Новый Структура;
Поля.Вставить("command" , "FINALIZE"); Поля.Вставить(Command , "FINALIZE");
Поля.Вставить("media_id" , IDИнициализации); Поля.Вставить("media_id", IDИнициализации);
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL); Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL);
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
СтатусОбработки = Ответ["processing_info"]["state"]; СтатусОбработки = Ответ["processing_info"]["state"];
Поля = Новый Структура; Поля = Новый Структура;
Поля.Вставить("command" , "STATUS"); Поля.Вставить(Command , "STATUS");
Поля.Вставить("media_id" , IDИнициализации); Поля.Вставить("media_id", IDИнициализации);
Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "GET", URL); Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "GET", URL);
Ответ = OPI_Инструменты.Get(URL, Поля, Авторизация); Ответ = OPI_Инструменты.Get(URL, Поля, Авторизация);
СтатусОбработки = Ответ["processing_info"]["state"]; СтатусОбработки = Ответ["processing_info"]["state"];
КонецЦикла; КонецЦикла;
Если СтатусОбработки = "failed" Тогда Если СтатусОбработки = "failed" Тогда
ВызватьИсключение "Твиттер не смог обработать загруженное вами видео"; ВызватьИсключение "Твиттер не смог обработать загруженное вами видео";
КонецЕсли; КонецЕсли;
КонецЕсли; КонецЕсли;
Возврат Ответ; Возврат Ответ;
КонецФункции КонецФункции
Функция ПолучитьСтандартныеПараметры(Знач Параметры = "") Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
//Здесь собрано определение данных, необходимых для работы. // Здесь собрано определение данных, необходимых для работы.
//Для Twitter это довольно значительный набор, что обсуловлено наличием сразу 2-х API, // Для Twitter это довольно значительный набор, что обсуловлено наличием сразу 2-х API,
//которые, при этом, созданы не для разныз задач, но просто являются версиями друг друга. // которые, при этом, созданы не для разныз задач, но просто являются версиями друг друга.
//Актуальной версией API является v2 и она требует получения временных токенов. Несмотря на то, // Актуальной версией API является v2 и она требует получения временных токенов. Несмотря на то,
//что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести // что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести
//механизм загрузки файлов и некоторые другие из старой версии - v1.1. Поэтому что-то нужно делать // механизм загрузки файлов и некоторые другие из старой версии - v1.1. Поэтому что-то нужно делать
//на версии 1.1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1.1, // на версии 1.1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1.1,
//но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные // но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные
//Мировая гигокорпорация Илона Маска, кстати, напоминаю ;) // Мировая гигокорпорация Илона Маска, кстати, напоминаю ;)
//P.S Далее часто упоминается "страница настроек Twitter Developer" - это // P.S Далее часто упоминается "страница настроек Twitter Developer" - это
//https://developer.twitter.com/en/portal/dashboard и выбор конкретного проекта из списка (значек c ключем) // https://developer.twitter.com/en/portal/dashboard и выбор конкретного проекта из списка (значек c ключем)
Параметры_ = Новый Соответствие; Параметры_ = Новый Соответствие;
Разрешения = "tweet.read tweet.write tweet.moderate.write users.read "
Разрешения = "tweet.read tweet.write tweet.moderate.write users.read " + "follows.read follows.write offline.access space.read mute.read "
+ "follows.read follows.write offline.access space.read mute.read " + "mute.write like.read like.write list.read list.write block.read "
+ "mute.write like.read like.write list.read list.write block.read " + "block.write bookmark.read bookmark.write";
+ "block.write bookmark.read bookmark.write";
// Данные для API v2
//Данные для API v2 // redirect_uri - URL вашего http-сервиса (или другого обработчика запросов) для авторизации
// scope - набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен
//redirect_uri - URL вашего http-сервиса (или другого обработчика запросов) для авторизации // client_id - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
//scope - набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен // client_secret - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
//client_id - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer // access_token - ПолучитьСсылкуАвторизации() -> Браузер -> code придет на redirect_uri -> ПолучитьТокен(code)
//client_secret - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer // refresh_token - Приходит вместе с access_token и используется для его обновления (время жизни access_token - 2 ч)
//access_token - ПолучитьСсылкуАвторизации() -> Браузер -> http-запрос с code придет на адрес redirect_uri -> ПолучитьТокен(code) // Обновление происходит методом ОбновитьТокен с новыми access_token и refresh_token.
//refresh_token - Приходит вместе с access_token и используется для его обновления (время жизни access_token - 2 часа). // При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить
// Обновление происходит методом ОбновитьТокен с новыми access_token и refresh_token. При следующем обновлении // не получится (access_token тоже не получится)
// нужно использовать уже новый refresh_token, так что захардкодить не получится (access_token тоже не получится)
// |--> ОбновитьТокен() ->|access_token --> Используется в т-нии 2-х часов для запросов
// |--> ОбновитьТокен() ->|access_token --> Используется в т-нии 2-х часов для запросов // | |refresh_token --|
// | |refresh_token --| // |--------[через 2 ч.]-------------------|
// |--------[через 2 ч.]-------------------|
// Данные для API v1.1
//Данные для 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_token - из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer // oauth_consumer_key - из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
//oauth_token_secret - из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer // oauth_consumer_secret - из Consumer Keys -> 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" , ""); Параметры_.Вставить("redirect_uri" , "");
Параметры_.Вставить("scope" , Разрешения); Параметры_.Вставить("scope" , Разрешения);
Параметры_.Вставить("client_id" , ""); Параметры_.Вставить("client_id" , "");
Параметры_.Вставить("client_secret" , ""); Параметры_.Вставить("client_secret" , "");
Параметры_.Вставить("access_token" , ""); //Должно быть нечто вроде Константы.TwitterToken.Получить() Параметры_.Вставить("access_token" , ""); // Должно быть нечто вроде Константы.TwitterToken.Получить()
Параметры_.Вставить("refresh_token" , ""); //Должно быть нечто вроде Константы.TwitterRefresh.Получить() Параметры_.Вставить("refresh_token" , ""); // Должно быть нечто вроде Константы.TwitterRefresh.Получить()
Параметры_.Вставить("oauth_token" , ""); Параметры_.Вставить("oauth_token" , "");
Параметры_.Вставить("oauth_token_secret" , ""); Параметры_.Вставить("oauth_token_secret" , "");
Параметры_.Вставить("oauth_consumer_key" , ""); Параметры_.Вставить("oauth_consumer_key" , "");
Параметры_.Вставить("oauth_consumer_secret", ""); Параметры_.Вставить("oauth_consumer_secret", "");
Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда
Для Каждого ПереданныйПараметр Из Параметры Цикл Для Каждого ПереданныйПараметр Из Параметры Цикл
Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение)); Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
@ -473,112 +479,116 @@
КонецФункции КонецФункции
Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL) Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL)
ЗаголовокАвторизации = ""; ЗаголовокАвторизации = "";
МетодХэширования = "HMAC-SHA1"; МетодХэширования = "HMAC-SHA1";
ВерсияАпи = "1.0"; ВерсияАпи = "1.0";
СтрокаСигнатуры = ""; СтрокаСигнатуры = "";
Подпись = ""; Подпись = "";
ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДатаСеанса()); OCK = "oauth_consumer_key";
ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX); OTK = "oauth_token";
ТаблицаПараметров = Новый ТаблицаЗначений; ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДатаСеанса());
ТаблицаПараметров.Колонки.Добавить("Ключ"); ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
ТаблицаПараметров.Колонки.Добавить("Значение"); ТаблицаПараметров = Новый ТаблицаЗначений;
ТаблицаПараметров.Колонки.Добавить("Ключ");
Для Каждого Поле Из Поля Цикл ТаблицаПараметров.Колонки.Добавить("Значение");
НоваяСтрока = ТаблицаПараметров.Добавить(); Для Каждого Поле Из Поля Цикл
НоваяСтрока.Ключ = Поле.Ключ;
НоваяСтрока.Значение = Поле.Значение; НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = Поле.Ключ;
КонецЦикла; НоваяСтрока.Значение = Поле.Значение;
НоваяСтрока = ТаблицаПараметров.Добавить(); КонецЦикла;
НоваяСтрока.Ключ = "oauth_consumer_key";
НоваяСтрока.Значение = Параметры["oauth_consumer_key"]; НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = OCK;
НоваяСтрока = ТаблицаПараметров.Добавить(); НоваяСтрока.Значение = Параметры[OCK];
НоваяСтрока.Ключ = "oauth_token";
НоваяСтрока.Значение = Параметры["oauth_token"]; НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = OTK;
НоваяСтрока = ТаблицаПараметров.Добавить(); НоваяСтрока.Значение = Параметры[OTK];
НоваяСтрока.Ключ = "oauth_version";
НоваяСтрока.Значение = ВерсияАпи; НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_version";
НоваяСтрока = ТаблицаПараметров.Добавить(); НоваяСтрока.Значение = ВерсияАпи;
НоваяСтрока.Ключ = "oauth_signature_method";
НоваяСтрока.Значение = МетодХэширования; НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_signature_method";
НоваяСтрока.Значение = МетодХэширования;
НоваяСтрока = ТаблицаПараметров.Добавить(); НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_timestamp"; НоваяСтрока.Ключ = "oauth_timestamp";
НоваяСтрока.Значение = ТекущаяДатаUNIX; НоваяСтрока.Значение = ТекущаяДатаUNIX;
НоваяСтрока = ТаблицаПараметров.Добавить(); НоваяСтрока = ТаблицаПараметров.Добавить();
НоваяСтрока.Ключ = "oauth_nonce"; НоваяСтрока.Ключ = "oauth_nonce";
НоваяСтрока.Значение = ТекущаяДатаUNIX; НоваяСтрока.Значение = ТекущаяДатаUNIX;
Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
СтрокаТаблицы.Ключ = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL); СтрокаТаблицы.Ключ = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL);
СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL); СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL);
КонецЦикла; КонецЦикла;
ТаблицаПараметров.Сортировать("Ключ"); ТаблицаПараметров.Сортировать("Ключ");
Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
СтрокаСигнатуры = СтрокаСигнатуры СтрокаСигнатуры = СтрокаСигнатуры
+ СтрокаТаблицы.Ключ + СтрокаТаблицы.Ключ
+ "=" + "="
+ СтрокаТаблицы.Значение + СтрокаТаблицы.Значение
+ "&"; + "&";
КонецЦикла; КонецЦикла;
СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1); СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1);
СтрокаСигнатуры = вРег(ВидЗапроса) СтрокаСигнатуры = вРег(ВидЗапроса)
+ "&" + "&"
+ КодироватьСтроку(URL, СпособКодированияСтроки.КодировкаURL) + КодироватьСтроку(URL, СпособКодированияСтроки.КодировкаURL)
+ "&" + "&"
+ КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL); + КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL);
Подпись = КодироватьСтроку(Параметры["oauth_consumer_secret"], СпособКодированияСтроки.КодировкаURL) Подпись = КодироватьСтроку(Параметры["oauth_consumer_secret"], СпособКодированияСтроки.КодировкаURL)
+ "&" + "&"
+ КодироватьСтроку(Параметры["oauth_token_secret"], СпособКодированияСтроки.КодировкаURL); + КодироватьСтроку(Параметры["oauth_token_secret"], СпособКодированияСтроки.КодировкаURL);
Сигнатура = OPI_Криптография.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Подпись)
Сигнатура = OPI_Криптография.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Подпись) , ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры)
, ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры) , ХешФункция.SHA1
, ХешФункция.SHA1 , 64);
, 64);
Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL);
Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL);
Разделитель = """,";
ЗаголовокАвторизации = ЗаголовокАвторизации ЗаголовокАвторизации = ЗаголовокАвторизации
+ "OAuth " + "OAuth "
+ "oauth_consumer_key=""" + Параметры["oauth_consumer_key"] + """," + "oauth_consumer_key=""" + Параметры[OCK] + Разделитель
+ "oauth_token=""" + Параметры["oauth_token"] + """," + "oauth_token=""" + Параметры[OTK] + Разделитель
+ "oauth_signature_method=""" + МетодХэширования + """," + "oauth_signature_method=""" + МетодХэширования + Разделитель
+ "oauth_timestamp=""" + ТекущаяДатаUNIX + """," + "oauth_timestamp=""" + ТекущаяДатаUNIX + Разделитель
+ "oauth_nonce=""" + ТекущаяДатаUNIX + """," + "oauth_nonce=""" + ТекущаяДатаUNIX + Разделитель
+ "oauth_version=""" + ВерсияАпи + """," + "oauth_version=""" + ВерсияАпи + Разделитель
+ "oauth_signature=""" + Сигнатура; + "oauth_signature=""" + Сигнатура;
СоответствиеЗаголовка = Новый Соответствие; СоответствиеЗаголовка = Новый Соответствие;
СоответствиеЗаголовка.Вставить("authorization", ЗаголовокАвторизации); СоответствиеЗаголовка.Вставить("authorization", ЗаголовокАвторизации);
Возврат СоответствиеЗаголовка; Возврат СоответствиеЗаголовка;
КонецФункции КонецФункции
// BSLLS:LatinAndCyrillicSymbolInWord-off
Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры) Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры)
СоответствиеВозврата = Новый Соответствие; СоответствиеВозврата = Новый Соответствие;
СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]); СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]);
Возврат СоответствиеВозврата; Возврат СоответствиеВозврата;
КонецФункции КонецФункции
// BSLLS:LatinAndCyrillicSymbolInWord-on
#КонецОбласти #КонецОбласти

View File

@ -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 // Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights // in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is // copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions: // furnished to do so, subject to the following conditions:
//The above copyright notice and this permission notice shall be included in all // The above copyright notice and this permission notice shall be included in all
//copies or substantial portions of the Software. // copies or substantial portions of the Software.
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // 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 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
//SOFTWARE. // SOFTWARE.
//https://github.com/Bayselonarrend/OpenIntegrations //https://github.com/Bayselonarrend/OpenIntegrations
//Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры() //Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
@ -38,7 +38,7 @@
// Строка - URL, по которому необходимо перейти в браузере // Строка - URL, по которому необходимо перейти в браузере
Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт
//access_token нужно будет забрать из параметра в строке адреса браузера // access_token нужно будет забрать из параметра в строке адреса браузера
Возврат "https://oauth.vk.com/authorize?client_id=" + OPI_Инструменты.ЧислоВСтроку(App_id) Возврат "https://oauth.vk.com/authorize?client_id=" + OPI_Инструменты.ЧислоВСтроку(App_id)
+ "&scope=offline,wall,groups,photos,stats,stories,ads" + "&scope=offline,wall,groups,photos,stats,stories,ads"
+ "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html"; + "&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"), ".", "___"); КлючКартинка = СтрЗаменить(ПолучитьИмяВременногоФайла("jpeg"), ".", "___");
ЗначениеКартинка = КартинкаПоста; ЗначениеКартинка = КартинкаПоста;
КонецЕсли; КонецЕсли;
Файлы.Вставить(КлючКартинка, ЗначениеКартинка); Файлы.Вставить(КлючКартинка, ЗначениеКартинка);
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.getWallUploadServer", Параметры_); Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.getWallUploadServer", Параметры_);
@ -92,20 +94,20 @@
Параметры_.Вставить("upload_url", URL); Параметры_.Вставить("upload_url", URL);
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы); Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы);
СерверФото = OPI_Инструменты.ЧислоВСтроку(Ответ["server"]); СерверФото = OPI_Инструменты.ЧислоВСтроку(Ответ[Serv]);
Параметры_.Вставить("hash" , Ответ["hash"]); Параметры_.Вставить(Hash , Ответ[Hash]);
Параметры_.Вставить("photo" , Ответ["photo"]); Параметры_.Вставить(Photo , Ответ[Photo]);
Параметры_.Вставить("server" , СерверФото); Параметры_.Вставить(Serv , СерверФото);
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.saveWallPhoto", Параметры_); Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.saveWallPhoto", Параметры_);
ОтветСоответствие = Ответ.Получить("response")[0]; ОтветСоответствие = Ответ.Получить("response")[0];
Параметры_.Удалить("hash"); Параметры_.Удалить(Hash);
Параметры_.Удалить("photo"); Параметры_.Удалить(Photo);
Параметры_.Удалить("server"); Параметры_.Удалить(Serv);
ФотоID = "photo" ФотоID = Photo
+ OPI_Инструменты.ЧислоВСтроку(ОтветСоответствие.Получить("owner_id")) + OPI_Инструменты.ЧислоВСтроку(ОтветСоответствие.Получить("owner_id"))
+ "_" + "_"
+ OPI_Инструменты.ЧислоВСтроку(ОтветСоответствие.Получить("id")); + OPI_Инструменты.ЧислоВСтроку(ОтветСоответствие.Получить("id"));
@ -160,35 +162,36 @@
Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Ответ = OPI_Инструменты.Get("api.vk.com/method/polls.getPhotoUploadServer", Параметры_); Ответ = OPI_Инструменты.Get("api.vk.com/method/polls.getPhotoUploadServer", Параметры_);
URL = Ответ["response"]["upload_url"]; Response = "response";
IDФото = ""; URL = Ответ[Response]["upload_url"];
IDФото = "";
Параметры_.Вставить("upload_url", URL); Параметры_.Вставить("upload_url", URL);
Если Не Картинка = "" Тогда Если Не Картинка = "" Тогда
Если ТипЗнч(Картинка) = Тип("Строка") Тогда Если ТипЗнч(Картинка) = Тип("Строка") Тогда
Путь = Картинка; Путь = Картинка;
Картинка = Новый ДвоичныеДанные(Картинка); Картинка = Новый ДвоичныеДанные(Картинка);
Иначе Иначе
//@skip-check missing-temporary-file-deletion //@skip-check missing-temporary-file-deletion
// BSLLS:MissingTemporaryFileDeletion-off // BSLLS:MissingTemporaryFileDeletion-off
Путь = ПолучитьИмяВременногоФайла("jpeg"); Путь = ПолучитьИмяВременногоФайла("jpeg");
КонецЕсли; КонецЕсли;
Файлы = Новый Соответствие; Файлы = Новый Соответствие;
Файлы.Вставить(Путь, Картинка); Файлы.Вставить(Путь, Картинка);
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы); Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы);
Параметры_.Вставить("hash" , Ответ["hash"]); Параметры_.Вставить("hash" , Ответ["hash"]);
Параметры_.Вставить("photo" , Ответ["photo"]); Параметры_.Вставить("photo" , Ответ["photo"]);
Ответ = OPI_Инструменты.Get("api.vk.com/method/polls.savePhoto", Параметры_); Ответ = OPI_Инструменты.Get("api.vk.com/method/polls.savePhoto", Параметры_);
IDФото = Ответ.Получить("response")["id"]; IDФото = Ответ.Получить(Response)["id"];
КонецЕсли; КонецЕсли;
Параметры_.Вставить("is_anonymous" , 1); Параметры_.Вставить("is_anonymous" , 1);
Параметры_.Вставить("is_multiple" , 0); Параметры_.Вставить("is_multiple" , 0);
@ -198,12 +201,12 @@
Для Каждого Ответ Из МассивОтветов Цикл Для Каждого Ответ Из МассивОтветов Цикл
Если Первый Тогда Если Первый Тогда
Первый = Ложь Первый = Ложь;
Иначе Иначе
Ответы = Ответы + ", "; Ответы = Ответы + ", ";
КонецЕсли; КонецЕсли;
Ответы = Ответы + """"+ Ответ + """"; Ответы = Ответы + """" + Ответ + """";
КонецЦикла; КонецЦикла;
@ -214,14 +217,13 @@
Параметры_.Вставить("question" , Вопрос); Параметры_.Вставить("question" , Вопрос);
Опрос = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_); Опрос = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_);
ОпросСоответствие = Опрос.Получить("response"); ОпросСоответствие = Опрос.Получить(Response);
ОпросID = "poll" ОпросID = "poll"
+ OPI_Инструменты.ЧислоВСтроку(ОпросСоответствие.Получить("owner_id")) + OPI_Инструменты.ЧислоВСтроку(ОпросСоответствие.Получить("owner_id"))
+ "_" + "_"
+ OPI_Инструменты.ЧислоВСтроку(ОпросСоответствие.Получить("id")); + OPI_Инструменты.ЧислоВСтроку(ОпросСоответствие.Получить("id"));
Параметры_.Вставить("attachments", ОпросID); Параметры_.Вставить("attachments", ОпросID);
Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_); Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_);
@ -282,8 +284,7 @@
// BSLLS:MissingTemporaryFileDeletion-off // BSLLS:MissingTemporaryFileDeletion-off
Путь = ПолучитьИмяВременногоФайла("jpeg"); Путь = ПолучитьИмяВременногоФайла("jpeg");
КонецЕсли; КонецЕсли;
Файлы = Новый Соответствие; Файлы = Новый Соответствие;
Файлы.Вставить(Путь, Картинка); Файлы.Вставить(Путь, Картинка);
@ -325,7 +326,6 @@
Путь = ПолучитьИмяВременногоФайла("jpeg"); Путь = ПолучитьИмяВременногоФайла("jpeg");
КонецЕсли; КонецЕсли;
Файлы = Новый Соответствие; Файлы = Новый Соответствие;
Файлы.Вставить(Путь, Картинка); Файлы.Вставить(Путь, Картинка);
@ -464,12 +464,13 @@
Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
IDСтены = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]); IDСтены = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]);
ОбъектВК = "wall" + OPI_Инструменты.ЧислоВСтроку(IDСтены) + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста);
Параметры_.Вставить("type" , "post"); Параметры_.Вставить("type" , "post");
Параметры_.Вставить("object" , "wall" + OPI_Инструменты.ЧислоВСтроку(IDСтены) + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста)); Параметры_.Вставить("object" , ОбъектВК);
Параметры_.Вставить("item_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста)); Параметры_.Вставить("item_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста));
Параметры_.Вставить("owner_id" , OPI_Инструменты.ЧислоВСтроку(IDСтены)); Параметры_.Вставить("owner_id" , OPI_Инструменты.ЧислоВСтроку(IDСтены));
Параметры_.Вставить("from_group" , 0); Параметры_.Вставить("from_group" , 0);
Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_); Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_);
@ -489,21 +490,22 @@
// Возвращаемое значение: // Возвращаемое значение:
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
//@skip-check method-too-many-params //@skip-check method-too-many-params
// BSLLS:NumberOfOptionalParams-off
Функция СделатьРепост(Знач IDПоста Функция СделатьРепост(Знач IDПоста
, Знач IDСтены = "" , Знач IDСтены = ""
, Знач ЦелеваяСтена = "" , Знач ЦелеваяСтена = ""
, Знач Рекламный = Ложь , Знач Рекламный = Ложь
, Знач Параметры = "") Экспорт , Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Источник = ?(ЗначениеЗаполнено(IDСтены) Источник = ?(ЗначениеЗаполнено(IDСтены)
, OPI_Инструменты.ЧислоВСтроку(IDСтены) , OPI_Инструменты.ЧислоВСтроку(IDСтены)
, OPI_Инструменты.ЧислоВСтроку(Параметры_["owner_id"])); , OPI_Инструменты.ЧислоВСтроку(Параметры_["owner_id"]));
Приемник = ?(ЗначениеЗаполнено(ЦелеваяСтена) Приемник = ?(ЗначениеЗаполнено(ЦелеваяСтена)
, СтрЗаменить(OPI_Инструменты.ЧислоВСтроку(ЦелеваяСтена), "-", "") , СтрЗаменить(OPI_Инструменты.ЧислоВСтроку(ЦелеваяСтена), "-", "")
, OPI_Инструменты.ЧислоВСтроку(Параметры_["group_id"])); , OPI_Инструменты.ЧислоВСтроку(Параметры_["group_id"]));
Параметры_.Вставить("object" , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста)); Параметры_.Вставить("object" , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста));
Параметры_.Вставить("group_id" , Приемник); Параметры_.Вставить("group_id" , Приемник);
@ -514,6 +516,7 @@
Возврат Ответ; Возврат Ответ;
КонецФункции КонецФункции
// BSLLS:NumberOfOptionalParams-on
// Написать сообщение. // Написать сообщение.
// //
@ -527,10 +530,10 @@
// Возвращаемое значение: // Возвращаемое значение:
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
Функция НаписатьСообщение(Знач Текст Функция НаписатьСообщение(Знач Текст
, Знач IDПользователя , Знач IDПользователя
, Знач Communitytoken , Знач Communitytoken
, Знач Клавиатура = "" , Знач Клавиатура = ""
, Знач Параметры = "") Экспорт , Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Параметры_.Вставить("access_token", Communitytoken); Параметры_.Вставить("access_token", Communitytoken);
@ -565,7 +568,7 @@
Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Параметры_.Вставить("owner_id", OPI_Инструменты.ЧислоВСтроку(IDСтены)); Параметры_.Вставить("owner_id" , OPI_Инструменты.ЧислоВСтроку(IDСтены));
Параметры_.Вставить("from_group" , OPI_Инструменты.ЧислоВСтроку(Параметры_["group_id"])); Параметры_.Вставить("from_group" , OPI_Инструменты.ЧислоВСтроку(Параметры_["group_id"]));
Параметры_.Вставить("post_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста)); Параметры_.Вставить("post_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста));
Параметры_.Вставить("message" , Текст); Параметры_.Вставить("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_from" , ДатаНачала);
Параметры_.Вставить("timestamp_to" , ДатаОкончания); Параметры_.Вставить("timestamp_to" , ДатаОкончания);
@ -631,22 +634,23 @@
// Получить статистику постов. // Получить статистику постов.
// //
// Параметры: // Параметры:
// МассивIDПостов - Массив из Строка,Число - Массив ID постов // МассивИДПостов - Массив из Строка,Число - Массив ID постов
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры // Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
// //
// Возвращаемое значение: // Возвращаемое значение:
// Массив из Произвольный - Массив данных статистики по постам // Массив из Произвольный - Массив данных статистики по постам
Функция ПолучитьСтатистикуПостов(Знач МассивIDПостов, Знач Параметры = "") Экспорт Функция ПолучитьСтатистикуПостов(Знач МассивИДПостов, Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
МассивОтветов = Новый Массив; МассивОтветов = Новый Массив;
МассивНабора = Новый Массив; МассивНабора = Новый Массив;
МаксимумПостов = 30;
Для Каждого Пост Из МассивIDПостов Цикл Для Каждого Пост Из МассивИДПостов Цикл
МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост)); МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост));
Если МассивНабора.Количество() = 30 Тогда Если МассивНабора.Количество() = МаксимумПостов Тогда
СтрокаНомеров = СтрСоединить(МассивНабора, ","); СтрокаНомеров = СтрСоединить(МассивНабора, ",");
Параметры_.Вставить("post_ids", СтрокаНомеров); Параметры_.Вставить("post_ids", СтрокаНомеров);
@ -658,7 +662,8 @@
МассивОтветов.Добавить(ЭлементСтатистики); МассивОтветов.Добавить(ЭлементСтатистики);
КонецЦикла; КонецЦикла;
МассивНабора = Новый Массив МассивНабора = Новый Массив;
КонецЕсли; КонецЕсли;
КонецЦикла; КонецЦикла;
@ -696,14 +701,16 @@
Параметры_.Вставить("account_id", OPI_Инструменты.ЧислоВСтроку(IDКабинета)); Параметры_.Вставить("account_id", OPI_Инструменты.ЧислоВСтроку(IDКабинета));
МассивСтруктур = Новый Массив; МассивСтруктур = Новый Массив;
ДатаСтарт = Формат(ТекущаяДатаСеанса() - Дата(1970, 1, 1, 1, 0, 0), "ЧГ=0");
ДатаСтоп = Формат(ДобавитьМесяц(ТекущаяДатаСеанса(), 24) - Дата(1970, 1, 1, 1, 0, 0), "ЧГ=0");
СтруктураКампании = Новый Структура; СтруктураКампании = Новый Структура;
СтруктураКампании.Вставить("type" , "promoted_posts"); СтруктураКампании.Вставить("type" , "promoted_posts");
СтруктураКампании.Вставить("name" , Наименование); СтруктураКампании.Вставить("name" , Наименование);
СтруктураКампании.Вставить("day_limit" , 0); СтруктураКампании.Вставить("day_limit" , 0);
СтруктураКампании.Вставить("all_limit" , 0); СтруктураКампании.Вставить("all_limit" , 0);
СтруктураКампании.Вставить("start_time" , Формат(ТекущаяДатаСеанса() - Дата(1970,1,1,1,0,0), "ЧГ=0")); СтруктураКампании.Вставить("start_time" , ДатаСтарт);
СтруктураКампании.Вставить("stop_time" , Формат(ДобавитьМесяц(ТекущаяДатаСеанса(), 24) - Дата(1970,1,1,1,0,0), "ЧГ=0")); СтруктураКампании.Вставить("stop_time" , ДатаСтоп);
СтруктураКампании.Вставить("status" , 1); СтруктураКампании.Вставить("status" , 1);
МассивСтруктур.Добавить(СтруктураКампании); МассивСтруктур.Добавить(СтруктураКампании);
@ -731,17 +738,17 @@
// Возвращаемое значение: // Возвращаемое значение:
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
Функция СоздатьРекламноеОбъявление(Знач НомерКампании Функция СоздатьРекламноеОбъявление(Знач НомерКампании
, Знач ДневнойЛимит , Знач ДневнойЛимит
, Знач НомерКатегории , Знач НомерКатегории
, Знач IDПоста , Знач IDПоста
, Знач IDКабинета , Знач IDКабинета
, Знач Параметры = "") Экспорт , Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры); Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Линк = "https://vk.com/wall-" Линк = "https://vk.com/wall-"
+ Параметры_["group_id"] + Параметры_["group_id"]
+ "_" + "_"
+ OPI_Инструменты.ЧислоВСтроку(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 из функции СоздатьСсылкуПолученияТокена() // access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена()
//from_group - действия будут выполняться от лица группы // from_group - действия будут выполняться от лица группы
//owner_id - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был // owner_id - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был
// установлен свой // установлен свой
//app_id - id приложения, которое необходимо создать в профиле на странице для разработчиков // app_id - id приложения, которое необходимо создать в профиле на странице для разработчиков
//group_id - owner_id, но без "-" // group_id - owner_id, но без "-"
Параметры_.Вставить("access_token" , ""); Параметры_.Вставить("access_token" , "");
Параметры_.Вставить("from_group" , "1"); Параметры_.Вставить("from_group" , "1");
Параметры_.Вставить("owner_id" , ""); Параметры_.Вставить("owner_id" , "");

View File

@ -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 // Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights // in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is // copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions: // furnished to do so, subject to the following conditions:
//The above copyright notice and this permission notice shall be included in all // The above copyright notice and this permission notice shall be included in all
//copies or substantial portions of the Software. // copies or substantial portions of the Software.
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // 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 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
//SOFTWARE. // SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
//https://github.com/Bayselonarrend/OpenIntegrations
#Область ПрограммныйИнтерфейс #Область ПрограммныйИнтерфейс
#Область НастройкиИИнформация #Область НастройкиИИнформация
@ -99,7 +100,7 @@
Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт
Если Не ТипЗнч(IDПользователей) = Тип("Массив") Тогда Если Не ТипЗнч(IDПользователей) = Тип("Массив") Тогда
ОдиночныйID = IDПользователей; ОдиночныйID = IDПользователей;
IDПользователей = Новый Массив; IDПользователей = Новый Массив;
IDПользователей.Добавить(ОдиночныйID); IDПользователей.Добавить(ОдиночныйID);
@ -136,7 +137,11 @@
// //
// Возвращаемое значение: // Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber // Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьТекстовоеСообщение(Знач Токен, Знач Текст, Знач IDПользователя, Знач ОтправкаВКанал, Знач Клавиатура = "") Экспорт Функция ОтправитьТекстовоеСообщение(Знач Токен
, Знач Текст
, Знач IDПользователя
, Знач ОтправкаВКанал
, Знач Клавиатура = "") Экспорт
Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура); Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура);
@ -171,7 +176,12 @@
// //
// Возвращаемое значение: // Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber // Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьФайл(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Расширение, Знач Размер = "") Экспорт Функция ОтправитьФайл(Знач Токен
, Знач URL
, Знач IDПользователя
, Знач ОтправкаВКанал
, Знач Расширение
, Знач Размер = "") Экспорт
Если Не ЗначениеЗаполнено(Размер) Тогда Если Не ЗначениеЗаполнено(Размер) Тогда
@ -207,7 +217,11 @@
// //
// Возвращаемое значение: // Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber // Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьКонтакт(Знач Токен, Знач ИмяКонтакта, Знач НомерТелефона, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт Функция ОтправитьКонтакт(Знач Токен
, Знач ИмяКонтакта
, Знач НомерТелефона
, Знач IDПользователя
, Знач ОтправкаВКанал) Экспорт
СтруктураКонтакта = Новый Структура; СтруктураКонтакта = Новый Структура;
СтруктураКонтакта.Вставить("name", ИмяКонтакта); СтруктураКонтакта.Вставить("name", ИмяКонтакта);
@ -389,4 +403,4 @@
КонецФункции КонецФункции
#КонецОбласти #КонецОбласти

View File

@ -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 // Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights // in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is // copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions: // furnished to do so, subject to the following conditions:
//The above copyright notice and this permission notice shall be included in all // The above copyright notice and this permission notice shall be included in all
//copies or substantial portions of the Software. // copies or substantial portions of the Software.
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // 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 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
//SOFTWARE. // SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
#Область СлужебныйПрограммныйИнтерфейс #Область СлужебныйПрограммныйИнтерфейс
#Область HTTPМетоды #Область HTTPМетоды
Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "") Экспорт Функция 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 // BSLLS:CognitiveComplexity-off
Функция PostMultipart(Знач URL Функция PostMultipart(Знач URL, Знач Параметры, Знач Файлы = "", Знач ТипКонтента = "image/jpeg",
, Знач Параметры Знач ДопЗаголовки = "") Экспорт
, Знач Файлы = ""
, Знач ТипКонтента = "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", НовыйЗапрос); Счетчик = 0;
Для Каждого Файл Из Файлы Цикл
НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = "gzip" Или
Ответ.Заголовки.Получить("content-encoding") = "gzip"; ПутьФайл = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
Если ТипКонтента = "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 // BSLLS:CognitiveComplexity-on
Функция Post(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач JSON = Истина) Экспорт Функция Post(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач JSON = Истина) Экспорт
Если Не ЗначениеЗаполнено(Параметры) Тогда
Параметры = Новый Структура;
КонецЕсли;
ТипДанных = ?(JSON, "application/json", "application/x-www-form-urlencoded"); Если Не ЗначениеЗаполнено(Параметры) Тогда
СтруктураURL = РазбитьURL(URL); Параметры = Новый Структура;
КонецЕсли;
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type" , ТипДанных); GZip = "gzip";
Заголовки.Вставить("Accept-Encoding" , "gzip"); ТипДанных = ?(JSON, "application/json", "application/x-www-form-urlencoded");
Заголовки.Вставить("Accept" , "*/*"); СтруктураURL = РазбитьURL(URL);
Заголовки.Вставить("Connection" , "keep-alive");
Заголовки = Новый Соответствие;
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда Заголовки.Вставить("Content-Type", ТипДанных);
Заголовки.Вставить("Accept-Encoding", GZip);
Для Каждого Заголовок Из ДопЗаголовки Цикл Заголовки.Вставить("Accept", "*/*");
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение); Заголовки.Вставить("Connection", "keep-alive");
КонецЦикла;
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
КонецЕсли;
Для Каждого Заголовок Из ДопЗаголовки Цикл
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL()); Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
НовыйЗапрос = Новый HTTPЗапрос(СтруктураURL["Адрес"], Заголовки); КонецЦикла;
КонецЕсли;
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , 300, Новый ЗащищенноеСоединениеOpenSSL);
НовыйЗапрос = Новый HTTPЗапрос(СтруктураURL["Адрес"], Заголовки);
Если JSON Тогда Если JSON Тогда
Данные = JSONСтрокой(Параметры); Данные = JSONСтрокой(Параметры);
Иначе Иначе
СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры); СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры);
Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
КонецЕсли; КонецЕсли;
НовыйЗапрос.УстановитьТелоИзСтроки(Данные); НовыйЗапрос.УстановитьТелоИзСтроки(Данные);
Ответ = Соединение.ВызватьHTTPМетод("POST", НовыйЗапрос); Ответ = Соединение.ВызватьHTTPМетод("POST", НовыйЗапрос);
НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = "gzip" Или НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = GZip Или Ответ.Заголовки.Получить(
Ответ.Заголовки.Получить("content-encoding") = "gzip"; "content-encoding") = GZip;
Если НужнаРаспаковка Тогда Если НужнаРаспаковка Тогда
Ответ = РаспаковатьОтвет(Ответ); Ответ = РаспаковатьОтвет(Ответ);
КонецЕсли; КонецЕсли;
Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ); Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ);
Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
Попытка Попытка
Ответ = JsonВСтруктуру(Ответ) Ответ = JsonВСтруктуру(Ответ);
Исключение Исключение
Ответ = ПолучитьСтрокуИзДвоичныхДанных(Ответ); Ответ = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
КонецПопытки; КонецПопытки;
КонецЕсли; КонецЕсли;
Возврат Ответ; Возврат Ответ;
КонецФункции КонецФункции
Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
СоответствиеВозврата = Новый Соответствие; СоответствиеВозврата = Новый Соответствие;
КоличествоЧастей = 2; КоличествоЧастей = 2;
МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь); МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь);
Для Каждого Параметр Из МассивПараметров Цикл Для Каждого Параметр Из МассивПараметров Цикл
МассивКлючЗначение = СтрРазделить(Параметр, "="); МассивКлючЗначение = СтрРазделить(Параметр, "=");
Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда
Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда СоответствиеВозврата.Вставить(МассивКлючЗначение[0], МассивКлючЗначение[1]);
СоответствиеВозврата.Вставить(МассивКлючЗначение[0] КонецЕсли;
, МассивКлючЗначение[1]);
КонецЕсли; КонецЦикла;
КонецЦикла; Возврат СоответствиеВозврата;
Возврат СоответствиеВозврата;
КонецФункции КонецФункции
Процедура ЗаменитьСпецСимволы(Текст) Экспорт Процедура ЗаменитьСпецСимволы(Текст) Экспорт
МассивСимволов = Новый Соответствие; МассивСимволов = Новый Соответствие;
МассивСимволов.Вставить("<", "&lt;"); МассивСимволов.Вставить("<", "&lt;");
МассивСимволов.Вставить(">", "&gt;"); МассивСимволов.Вставить(">", "&gt;");
МассивСимволов.Вставить("&", "&amp;"); МассивСимволов.Вставить("&", "&amp;");
МассивСимволов.Вставить("_", " "); МассивСимволов.Вставить("_", " ");
МассивСимволов.Вставить("[", "("); МассивСимволов.Вставить("[", "(");
МассивСимволов.Вставить("]", ")"); МассивСимволов.Вставить("]", ")");
Для Каждого СимволМассива Из МассивСимволов Цикл Для Каждого СимволМассива Из МассивСимволов Цикл
Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение); Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение);
КонецЦикла; КонецЦикла;
КонецПроцедуры КонецПроцедуры
Функция UNIXTime(Знач Дата) Экспорт Функция 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) Экспорт
URL = СтрЗаменить(URL, "https://", ""); URL = СтрЗаменить(URL, "https://", "");
URL = СтрЗаменить(URL, "http://" , ""); URL = СтрЗаменить(URL, "http://", "");
URL = СтрЗаменить(URL, "www." , ""); URL = СтрЗаменить(URL, "www.", "");
СтруктураВозврата = Новый Структура; СтруктураВозврата = Новый Структура;
СтруктураВозврата.Вставить("Сервер" , Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1)); СтруктураВозврата.Вставить("Сервер", Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1));
СтруктураВозврата.Вставить("Адрес" , Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1)); СтруктураВозврата.Вставить("Адрес", Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1));
Возврат СтруктураВозврата; Возврат СтруктураВозврата;
КонецФункции КонецФункции
Функция JsonВСтруктуру(Знач Текст, Знач Кодировка = "utf-8") Экспорт Функция JsonВСтруктуру(Знач Текст, Знач Кодировка = "utf-8") Экспорт
Если Не ЗначениеЗаполнено(Текст) Тогда Если Не ЗначениеЗаполнено(Текст) Тогда
Возврат ""; Возврат "";
КонецЕсли; КонецЕсли;
ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьПоток(Текст.ОткрытьПотокДляЧтения()); ЧтениеJSON.ОткрытьПоток(Текст.ОткрытьПотокДляЧтения());
Данные = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO); Данные = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
ЧтениеJSON.Закрыть(); ЧтениеJSON.Закрыть();
Возврат Данные; Возврат Данные;
КонецФункции КонецФункции
Функция JSONСтрокой(Знач Данные) Экспорт Функция JSONСтрокой(Знач Данные) Экспорт
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь); ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows, " ", Истина, ЭкранированиеСимволовJSON.Нет,
ЗаписьJSON = Новый ЗаписьJSON; Ложь, Ложь, Ложь, Ложь);
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON); ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписатьJSON(ЗаписьJSON, Данные); ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
Возврат ЗаписьJSON.Закрыть();
ЗаписатьJSON(ЗаписьJSON, Данные);
Возврат ЗаписьJSON.Закрыть();
КонецФункции КонецФункции
Функция ЧислоВСтроку(Знач Число) Экспорт Функция ЧислоВСтроку(Знач Число) Экспорт
Возврат СтрЗаменить(Строка(Число), Символы.НПП, ""); Возврат СтрЗаменить(Строка(Число), Символы.НПП, "");
КонецФункции КонецФункции
Процедура ВыполнитьСкрипт(Знач Текст) Экспорт Процедура ВыполнитьСкрипт(Знач Текст) Экспорт
ИмяСкрипта = ПолучитьИмяВременногоФайла(".ps1"); ИмяСкрипта = ПолучитьИмяВременногоФайла(".ps1");
ТекстСкрипта = Новый ТекстовыйДокумент(); ТекстСкрипта = Новый ТекстовыйДокумент;
ТекстСкрипта.УстановитьТекст(Текст); ТекстСкрипта.УстановитьТекст(Текст);
ТекстСкрипта.Записать(ИмяСкрипта, КодировкаТекста.UTF8); ТекстСкрипта.Записать(ИмяСкрипта, КодировкаТекста.UTF8);
КодВозврата = 0; КодВозврата = 0;
ЗапуститьПриложение("powershell -file " + ИмяСкрипта + " -noexit", , Истина, КодВозврата); ЗапуститьПриложение("powershell -file " + ИмяСкрипта + " -noexit", , Истина, КодВозврата);
УдалитьФайлы(ИмяСкрипта); УдалитьФайлы(ИмяСкрипта);
КонецПроцедуры КонецПроцедуры
Функция РазмерДанныхB64(Знач Base64Строка) Экспорт
РазмерДанных = СтрДлина(Base64Строка)
- ?(Прав(Base64Строка, 1) = "=", 1, 0)
- ?(Прав(Base64Строка, 2) = "==", 1, 0);
Возврат Цел(РазмерДанных / 4 * 3);
Конецфункции
#КонецОбласти #КонецОбласти
#КонецОбласти #КонецОбласти
@ -392,170 +382,175 @@
// //
// Требования: платформа 1С версии 8.3.10 и выше // Требования: платформа 1С версии 8.3.10 и выше
// BSLLS:LatinAndCyrillicSymbolInWord-off
Функция РаспаковатьОтвет(Ответ) Функция РаспаковатьОтвет(Ответ)
Попытка Попытка
Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные()); Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные());
Исключение Исключение
Возврат Ответ; Возврат Ответ;
КонецПопытки; КонецПопытки;
КонецФункции КонецФункции
Функция ПрочитатьGZip(СжатыеДанные) Экспорт Функция ПрочитатьGZip(СжатыеДанные) Экспорт
РазмерПрефиксаGZip = 10; РазмерПрефиксаGZip = 10;
РазмерПостфиксаGZip = 8; РазмерПостфиксаGZip = 8;
ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные); ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные);
ЧтениеДанных.Пропустить(РазмерПрефиксаGZip); ЧтениеДанных.Пропустить(РазмерПрефиксаGZip);
РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip; РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip;
ПотокZip = Новый ПотокВПамяти(ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD() + ZipРазмерCDH() + ZipРазмерEOCD()); ПотокZip = Новый ПотокВПамяти(ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD() + ZipРазмерCDH()
ЗаписьДанных = Новый ЗаписьДанных(ПотокZip); + ZipРазмерEOCD());
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH()); ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных); ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH());
ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных);
ЗаписьДанных.Закрыть();
ЗаписьДанных = Новый ЗаписьДанных(ПотокZip); ЗаписьДанных.Закрыть();
ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
CRC32 = ЧтениеДанных.ПрочитатьЦелое32();
РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32(); CRC32 = ЧтениеДанных.ПрочитатьЦелое32();
ЧтениеДанных.Закрыть(); РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32();
ЧтениеДанных.Закрыть();
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)); ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных)); ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
ЗаписьДанных.Закрыть(); ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных));
ЗаписьДанных.Закрыть();
Возврат ПрочитатьZip(ПотокZip);
Возврат ПрочитатьZip(ПотокZip);
КонецФункции КонецФункции
Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено) Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено)
Каталог = ПолучитьИмяВременногоФайла(); Каталог = ПолучитьИмяВременногоФайла();
ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные); ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные);
ИмяФайла = ЧтениеZip.Элементы[0].Имя; ИмяФайла = ЧтениеZip.Элементы[0].Имя;
Попытка Попытка
ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
Исключение Исключение
// Игнорируем проверку целостности архива, просто читаем результат // Игнорируем проверку целостности архива, просто читаем результат
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки; КонецПопытки;
ЧтениеZip.Закрыть(); ЧтениеZip.Закрыть();
Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла); Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
УдалитьФайлы(Каталог); УдалитьФайлы(Каталог);
Возврат Результат; Возврат Результат;
КонецФункции КонецФункции
Функция ZipРазмерLFH() Функция ZipРазмерLFH()
Возврат 34; Возврат 34;
КонецФункции КонецФункции
Функция ZipРазмерDD() Функция ZipРазмерDD()
Возврат 16; Возврат 16;
КонецФункции КонецФункции
Функция ZipРазмерCDH() Функция ZipРазмерCDH()
Возврат 50; Возврат 50;
КонецФункции КонецФункции
Функция ZipРазмерEOCD() Функция ZipРазмерEOCD()
Возврат 22; Возврат 22;
КонецФункции КонецФункции
Функция ZipLFH() Функция ZipLFH()
// Local file header // Local file header
Буфер = Новый БуферДвоичныхДанных(ZipРазмерLFH()); Буфер = Новый БуферДвоичныхДанных(ZipРазмерLFH());
Буфер.ЗаписатьЦелое32(0, 67324752); // signature 0x04034b50 Буфер.ЗаписатьЦелое32(0, 67324752); // signature 0x04034b50
Буфер.ЗаписатьЦелое16(4, 20); // version Буфер.ЗаписатьЦелое16(4, 20); // version
Буфер.ЗаписатьЦелое16(6, 10); // bit flags Буфер.ЗаписатьЦелое16(6, 10); // bit flags
Буфер.ЗаписатьЦелое16(8, 8); // compression method Буфер.ЗаписатьЦелое16(8, 8); // compression method
Буфер.ЗаписатьЦелое16(10, 0); // time Буфер.ЗаписатьЦелое16(10, 0); // time
Буфер.ЗаписатьЦелое16(12, 0); // date Буфер.ЗаписатьЦелое16(12, 0); // date
Буфер.ЗаписатьЦелое32(14, 0); // crc-32 Буфер.ЗаписатьЦелое32(14, 0); // crc-32
Буфер.ЗаписатьЦелое32(18, 0); // compressed size Буфер.ЗаписатьЦелое32(18, 0); // compressed size
Буфер.ЗаписатьЦелое32(22, 0); // uncompressed size Буфер.ЗаписатьЦелое32(22, 0); // uncompressed size
Буфер.ЗаписатьЦелое16(26, 4); // filename legth - "data" Буфер.ЗаписатьЦелое16(26, 4); // filename legth - "data"
Буфер.ЗаписатьЦелое16(28, 0); // extra field length Буфер.ЗаписатьЦелое16(28, 0); // extra field length
Буфер.Записать(30, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь)); Буфер.Записать(30, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
Возврат Буфер; Возврат Буфер;
КонецФункции КонецФункции
Функция ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных) Функция ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
// Data descriptor // Data descriptor
Буфер = Новый БуферДвоичныхДанных(ZipРазмерDD()); Буфер = Новый БуферДвоичныхДанных(ZipРазмерDD());
Буфер.ЗаписатьЦелое32(0, 134695760); Буфер.ЗаписатьЦелое32(0, 134695760);
Буфер.ЗаписатьЦелое32(4, CRC32); Буфер.ЗаписатьЦелое32(4, CRC32);
Буфер.ЗаписатьЦелое32(8, РазмерСжатыхДанных); Буфер.ЗаписатьЦелое32(8, РазмерСжатыхДанных);
Буфер.ЗаписатьЦелое32(12, РазмерНесжатыхДанных); Буфер.ЗаписатьЦелое32(12, РазмерНесжатыхДанных);
Возврат Буфер; Возврат Буфер;
КонецФункции КонецФункции
Функция ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных) Функция ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
// Central directory header // Central directory header
Буфер = Новый БуферДвоичныхДанных(ZipРазмерCDH()); Буфер = Новый БуферДвоичныхДанных(ZipРазмерCDH());
Буфер.ЗаписатьЦелое32(0, 33639248); // signature 0x02014b50 Буфер.ЗаписатьЦелое32(0, 33639248); // signature 0x02014b50
Буфер.ЗаписатьЦелое16(4, 798); // version made by Буфер.ЗаписатьЦелое16(4, 798); // version made by
Буфер.ЗаписатьЦелое16(6, 20); // version needed to extract Буфер.ЗаписатьЦелое16(6, 20); // version needed to extract
Буфер.ЗаписатьЦелое16(8, 10); // bit flags Буфер.ЗаписатьЦелое16(8, 10); // bit flags
Буфер.ЗаписатьЦелое16(10, 8); // compression method Буфер.ЗаписатьЦелое16(10, 8); // compression method
Буфер.ЗаписатьЦелое16(12, 0); // time Буфер.ЗаписатьЦелое16(12, 0); // time
Буфер.ЗаписатьЦелое16(14, 0); // date Буфер.ЗаписатьЦелое16(14, 0); // date
Буфер.ЗаписатьЦелое32(16, CRC32); // crc-32 Буфер.ЗаписатьЦелое32(16, CRC32); // crc-32
Буфер.ЗаписатьЦелое32(20, РазмерСжатыхДанных); // compressed size Буфер.ЗаписатьЦелое32(20, РазмерСжатыхДанных); // compressed size
Буфер.ЗаписатьЦелое32(24, РазмерНесжатыхДанных); // uncompressed size Буфер.ЗаписатьЦелое32(24, РазмерНесжатыхДанных); // uncompressed size
Буфер.ЗаписатьЦелое16(28, 4); // file name length Буфер.ЗаписатьЦелое16(28, 4); // file name length
Буфер.ЗаписатьЦелое16(30, 0); // extra field length Буфер.ЗаписатьЦелое16(30, 0); // extra field length
Буфер.ЗаписатьЦелое16(32, 0); // file comment length Буфер.ЗаписатьЦелое16(32, 0); // file comment length
Буфер.ЗаписатьЦелое16(34, 0); // disk number start Буфер.ЗаписатьЦелое16(34, 0); // disk number start
Буфер.ЗаписатьЦелое16(36, 0); // internal file attributes Буфер.ЗаписатьЦелое16(36, 0); // internal file attributes
Буфер.ЗаписатьЦелое32(38, 2176057344); // external file attributes Буфер.ЗаписатьЦелое32(38, 2176057344); // external file attributes
Буфер.ЗаписатьЦелое32(42, 0); // relative offset of local header Буфер.ЗаписатьЦелое32(42, 0); // relative offset of local header
Буфер.Записать(46, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь)); Буфер.Записать(46, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
Возврат Буфер; Возврат Буфер;
КонецФункции КонецФункции
Функция ZipEOCD(РазмерСжатыхДанных) Функция ZipEOCD(РазмерСжатыхДанных)
// End of central directory // End of central directory
РазмерCDH = 50; РазмерCDH = 50;
Буфер = Новый БуферДвоичныхДанных(ZipРазмерEOCD()); Буфер = Новый БуферДвоичныхДанных(ZipРазмерEOCD());
Буфер.ЗаписатьЦелое32(0, 101010256); // signature 0x06054b50 Буфер.ЗаписатьЦелое32(0, 101010256); // signature 0x06054b50
Буфер.ЗаписатьЦелое16(4, 0); // number of this disk Буфер.ЗаписатьЦелое16(4, 0); // number of this disk
Буфер.ЗаписатьЦелое16(6, 0); // number of the disk with the start of the central directory Буфер.ЗаписатьЦелое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(8, 1); // total number of entries in the central directory on this disk
Буфер.ЗаписатьЦелое16(10, 1); // total number of entries in the central directory Буфер.ЗаписатьЦелое16(10, 1); // total number of entries in the central directory
Буфер.ЗаписатьЦелое32(12, РазмерCDH); // size of the central directory Буфер.ЗаписатьЦелое32(12, РазмерCDH); // size of the central directory
// offset of start of central directory with respect to the starting disk number // offset of start of central directory with respect to the starting disk number
Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD()); Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD());
Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number
Возврат Буфер; Возврат Буфер;
КонецФункции КонецФункции
// BSLLS:LatinAndCyrillicSymbolInWord-on
#КонецОбласти #КонецОбласти
#КонецОбласти #КонецОбласти

View File

@ -27,13 +27,15 @@
Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт
Дважды = 2;
Если Ключ.Размер() > РазмерБлока Тогда Если Ключ.Размер() > РазмерБлока Тогда
Ключ = Хеш(Ключ, Тип); Ключ = Хеш(Ключ, Тип);
КонецЕсли; КонецЕсли;
Если Ключ.Размер() <= РазмерБлока Тогда Если Ключ.Размер() <= РазмерБлока Тогда
Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ); Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * 2); Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * Дважды);
КонецЕсли; КонецЕсли;
Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ)); Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));