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"]);