diff --git a/src/CommonModules/OPI_Twitter/Module.bsl b/src/CommonModules/OPI_Twitter/Module.bsl
index fd078d3e9..dd9554603 100644
--- a/src/CommonModules/OPI_Twitter/Module.bsl
+++ b/src/CommonModules/OPI_Twitter/Module.bsl
@@ -131,22 +131,41 @@
#Область Твиты
-Функция СоздатьПроизвольныйТвит(Знач Текст, Знач МассивМедиа = "", Знач МассивВариантов = "", Знач Параметры = "") Экспорт
+Функция СоздатьПроизвольныйТвит(Знач Текст = ""
+ , Знач МассивМедиа = ""
+ , Знач МассивВариантовОпроса = ""
+ , Знач ДлительностьОпроса = ""
+ , Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
URL = "https://api.twitter.com/2/tweets";
Если Не ТипЗнч(МассивМедиа) = Тип("Массив") Тогда
МассивМедиа_ = Новый Массив;
- МассивМедиа_.Добавить(МассивМедиа);
+
+ Если ЗначениеЗаполнено(МассивМедиа) Тогда
+ МассивМедиа_.Добавить(МассивМедиа);
+ КонецЕсли;
+
МассивМедиа = МассивМедиа_;
КонецЕсли;
Поля = Новый Соответствие;
- Поля.Вставить("text", Текст);
- Если МассивМедиа.Количество() > 0 Тогда
- Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа));
+ Если ЗначениеЗаполнено(Текст) Тогда
+ Поля.Вставить("text", Текст);
+ КонецЕсли;
+
+ Если ТипЗнч(МассивВариантовОпроса) = Тип("Массив") И ЗначениеЗаполнено(ДлительностьОпроса) Тогда
+ Если МассивВариантовОпроса.Количество()> 0 Тогда
+ Поля.Вставить("poll", Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса));
+ КонецЕсли;
+ КонецЕсли;
+
+ Если ТипЗнч(МассивМедиа) = Тип("Массив") Тогда
+ Если МассивМедиа.Количество() > 0 Тогда
+ Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа));
+ КонецЕсли;
КонецЕсли;
Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
@@ -157,30 +176,34 @@
КонецФункции
Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт
- Возврат СоздатьПроизвольныйТвит(Текст, , Параметры);
+ Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры);
КонецФункции
Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт
МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры);
- Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, Параметры);
+ Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
КонецФункции
Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт
МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры);
- Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, Параметры);
+ Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
КонецФункции
Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт
МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры);
- Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, Параметры);
+ Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
КонецФункции
+Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт
+ Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры);
+КонецФункции
+
Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт
МассивМедиа = Новый Массив;
@@ -244,49 +267,66 @@
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
Иначе
-
+
ЧтениеДанных = Новый ЧтениеДанных(Файл);
- МассивЧтения = ЧтениеДанных.РазделитьНаЧастиПо(5000000);
+ МассивЧтения = ЧтениеДанных.РазделитьНаЧастиПо(4*1024*1024);
Поля = Новый Структура;
Поля.Вставить("command" , "INIT");
Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер));
Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип));
- Поля.Вставить("media_category" ,Тип);
+ Поля.Вставить("media_category" , Тип);
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL);
- ID = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь)["media_id_string"];
+ ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
+ KeyИнициализации = ОтветИнициализации["media_key"];
+ IDИнициализации = ОтветИнициализации["media_id_string"];
Счетчик = 0;
Для Каждого Часть Из МассивЧтения Цикл
- ДвоичныеЧасти = Часть.ПолучитьДвоичныеДанные();
- B64Части = Base64Строка(ДвоичныеЧасти);
-
+ ДвоичныеЧасти = Часть.ПолучитьДвоичныеДанные();
+
Поля = Новый Структура;
Поля.Вставить("command" , "APPEND");
- Поля.Вставить("media_id" , ID);
- Поля.Вставить("media_data" , B64Части);
+ Поля.Вставить("media_key" , KeyИнициализации);
Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик));
+ Поля.Вставить("media" , ДвоичныеЧасти);
+
+ Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Новый Структура, "POST", URL);
- Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL);
-
- OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
+ ОтветЧасти = OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация);
+ Счетчик = Счетчик + 1;
КонецЦикла;
-
Поля = Новый Структура;
Поля.Вставить("command" , "FINALIZE");
- Поля.Вставить("media_id" , ID);
+ Поля.Вставить("media_id" , IDИнициализации);
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL);
- Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
+ Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
+ СтатусОбработки = Ответ["processing_info"]["state"];
+ Поля = Новый Структура;
+
+ Поля.Вставить("command" , "STATUS");
+ Поля.Вставить("media_id" , IDИнициализации);
-
- КонецЕсли;
+ Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл
+
+ Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "GET", URL);
+ Ответ = OPI_Инструменты.Get(URL, Поля, Авторизация);
+ СтатусОбработки = Ответ["processing_info"]["state"];
+
+ КонецЦикла;
+
+ Если СтатусОбработки = "failed" Тогда
+ ВызватьИсключение "Твиттер не смог обработать загруженное вами видео";
+ КонецЕсли;
+
+ КонецЕсли;
Возврат Ответ;
@@ -299,7 +339,7 @@
//которые, при этом, созданы не для разныз задач, но просто являются версиями друг друга.
//Актуальной версией API является v2 и она требует получения временных токенов. Несмотря на то,
//что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести
- //механизм загрузки файлов и некоторые другие из старой версии - v1.1. По-этому что-то нужно делать
+ //механизм загрузки файлов и некоторые другие из старой версии - v1.1. Поэтому что-то нужно делать
//на версии 1.1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1.1,
//но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные
diff --git a/src/CommonModules/OPI_Инструменты/Module.bsl b/src/CommonModules/OPI_Инструменты/Module.bsl
index 4daee62a0..c0b11853e 100644
--- a/src/CommonModules/OPI_Инструменты/Module.bsl
+++ b/src/CommonModules/OPI_Инструменты/Module.bsl
@@ -98,7 +98,13 @@
ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """");
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
- ЗаписьТекста.ЗаписатьСтроку(Параметр.Значение);
+
+ Если ТипЗнч(Параметр.Значение) = Тип("Строка") Тогда
+ ЗаписьТекста.ЗаписатьСтроку(Параметр.Значение);
+ Иначе
+ ЗаписьТекста.Записать(Параметр.Значение);
+ КонецЕсли;
+
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
КонецЦикла;
@@ -137,11 +143,12 @@
Ответ = Соединение.ВызватьHTTPМетод("POST", НовыйЗапрос);
- Если Ответ.Заголовки.Получить("Content-Encoding") <> Неопределено Тогда
- Если Ответ.Заголовки.Получить("Content-Encoding") = "gzip" Тогда
- Ответ = РаспаковатьОтвет(Ответ);
- КонецЕсли;
- КонецЕсли;
+ НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = "gzip" Или
+ Ответ.Заголовки.Получить("content-encoding") = "gzip";
+
+ Если НужнаРаспаковка Тогда
+ Ответ = РаспаковатьОтвет(Ответ);
+ КонецЕсли;
Возврат ?(ТипЗнч(Ответ) = Тип("ДвоичныеДанные"), JsonВСтруктуру(Ответ), JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные()));
@@ -261,7 +268,7 @@
СтрокаПараметров = "?";
- Для Каждого Параметр Из Параметры Цикл
+ Для Каждого Параметр Из Параметры Цикл
СтрокаПараметров = СтрокаПараметров + Параметр.Ключ + "=" + КодироватьСтроку(Параметр.Значение, СпособКодированияСтроки.КодировкаURL) + "&";
КонецЦикла;
@@ -286,7 +293,11 @@
КонецФункции
Функция JsonВСтруктуру(Знач Текст, Знач Кодировка = "utf-8") Экспорт
-
+
+ Если Не ЗначениеЗаполнено(Текст) Тогда
+ Возврат "";
+ КонецЕсли;
+
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьПоток(Текст.ОткрытьПотокДляЧтения());
@@ -329,6 +340,15 @@
КонецПроцедуры
+Функция РазмерДанныхB64(Знач Base64Строка) Экспорт
+
+ РазмерДанных = СтрДлина(Base64Строка)
+ - ?(Прав(Base64Строка, 1) = "=", 1, 0)
+ - ?(Прав(Base64Строка, 2) = "==", 1, 0);
+
+ Возврат Цел(РазмерДанных / 4 * 3);
+
+Конецфункции
#КонецОбласти
#КонецОбласти
diff --git a/src/Configuration/Configuration.mdo b/src/Configuration/Configuration.mdo
index af4602cc1..c3179cd83 100644
--- a/src/Configuration/Configuration.mdo
+++ b/src/Configuration/Configuration.mdo
@@ -36,11 +36,11 @@
ru
CommonModule.OPI_Инструменты
+ CommonModule.OPI_Криптография
CommonModule.OPI_Telegram
CommonModule.OPI_VK
CommonModule.OPI_Viber
CommonModule.OPI_Twitter
- CommonModule.OPI_Криптография
HTTPService.Twitter
Constant.TwitterRefresh
Constant.TwitterToken
diff --git a/src/HTTPServices/Twitter/Module.bsl b/src/HTTPServices/Twitter/Module.bsl
index c52fc267a..a58089c71 100644
--- a/src/HTTPServices/Twitter/Module.bsl
+++ b/src/HTTPServices/Twitter/Module.bsl
@@ -3,8 +3,18 @@
Параметры = Новый Соответствие;
+ Параметры.Вставить("redirect_uri" , "https://api.athenaeum.digital/opi/hs/twitter");
+ Параметры.Вставить("client_id" , "ZG1vSmxlVTJXYi05M2c0ek9iV246MTpjaQ");
+ Параметры.Вставить("client_secret" , "6Yy_dyoguUb6W-TaRrYfj1N5_8AlKxq-yjiD2sNN4l1H7BcUnd");
+ Параметры.Вставить("access_token" , Константы.TwitterToken.Получить());
+ Параметры.Вставить("refresh_token" , Константы.TwitterRefresh.Получить());
+ Параметры.Вставить("v1_access_token" , "929248194101501953-4O78tyw6zsnKiHK34DAMjnzDn6wYBlo");
+ Параметры.Вставить("v1_access_secret", "YYC8ly1f5wtkiVFVzJooLb39ChMeLxjSGBxvidRzWuWuJ");
+ Параметры.Вставить("api_key" , "2OQgEn51Kqd9SAiimcFIcHmSP");
+ Параметры.Вставить("api_secret" , "Oerbr7max2rQG30QLBMXCcXpdzPmycg0qws6kMObHFJGREfDzj");
- Код = Запрос.ПараметрыЗапроса["code"];
+
+ Код = Запрос.ПараметрыЗапроса["code"];
ОтветТокен = OPI_Twitter.ПолучитьТокен(Код, Параметры);
Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]);