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

Доработал библиотеку твиттера

This commit is contained in:
Anton 2024-01-12 21:36:06 +03:00
parent 8e835dfedf
commit c4def3141e
4 changed files with 107 additions and 37 deletions

View File

@ -131,23 +131,42 @@
#Область Твиты
Функция СоздатьПроизвольныйТвит(Знач Текст, Знач МассивМедиа = "", Знач МассивВариантов = "", Знач Параметры = "") Экспорт
Функция СоздатьПроизвольныйТвит(Знач Текст = ""
, Знач МассивМедиа = ""
, Знач МассивВариантовОпроса = ""
, Знач ДлительностьОпроса = ""
, Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
URL = "https://api.twitter.com/2/tweets";
Если Не ТипЗнч(МассивМедиа) = Тип("Массив") Тогда
МассивМедиа_ = Новый Массив;
Если ЗначениеЗаполнено(МассивМедиа) Тогда
МассивМедиа_.Добавить(МассивМедиа);
КонецЕсли;
МассивМедиа = МассивМедиа_;
КонецЕсли;
Поля = Новый Соответствие;
Поля.Вставить("text", Текст);
Если ЗначениеЗаполнено(Текст) Тогда
Поля.Вставить("text", Текст);
КонецЕсли;
Если ТипЗнч(МассивВариантовОпроса) = Тип("Массив") И ЗначениеЗаполнено(ДлительностьОпроса) Тогда
Если МассивВариантовОпроса.Количество()> 0 Тогда
Поля.Вставить("poll", Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса));
КонецЕсли;
КонецЕсли;
Если ТипЗнч(МассивМедиа) = Тип("Массив") Тогда
Если МассивМедиа.Количество() > 0 Тогда
Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа));
КонецЕсли;
КонецЕсли;
Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация);
@ -157,30 +176,34 @@
КонецФункции
Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт
Возврат СоздатьПроизвольныйТвит(Текст, , Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры);
КонецФункции
Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт
МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
КонецФункции
Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт
МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
КонецФункции
Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт
МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
КонецФункции
Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт
Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры);
КонецФункции
Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт
МассивМедиа = Новый Массив;
@ -246,7 +269,7 @@
Иначе
ЧтениеДанных = Новый ЧтениеДанных(Файл);
МассивЧтения = ЧтениеДанных.РазделитьНаЧастиПо(5000000);
МассивЧтения = ЧтениеДанных.РазделитьНаЧастиПо(4*1024*1024);
Поля = Новый Структура;
Поля.Вставить("command" , "INIT");
@ -256,35 +279,52 @@
Авторизация = СоздатьЗаголовокАвторизации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, Поля, Авторизация, Ложь);
СтатусОбработки = Ответ["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,
//но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные

View File

@ -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ВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные()));
@ -287,6 +294,10 @@
Функция JsonВСтруктуру(Знач Текст, Знач Кодировка = "utf-8") Экспорт
Если Не ЗначениеЗаполнено(Текст) Тогда
Возврат "";
КонецЕсли;
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьПоток(Текст.ОткрытьПотокДляЧтения());
@ -329,6 +340,15 @@
КонецПроцедуры
Функция РазмерДанныхB64(Знач Base64Строка) Экспорт
РазмерДанных = СтрДлина(Base64Строка)
- ?(Прав(Base64Строка, 1) = "=", 1, 0)
- ?(Прав(Base64Строка, 2) = "==", 1, 0);
Возврат Цел(РазмерДанных / 4 * 3);
Конецфункции
#КонецОбласти
#КонецОбласти

View File

@ -36,11 +36,11 @@
<languageCode>ru</languageCode>
</languages>
<commonModules>CommonModule.OPI_Инструменты</commonModules>
<commonModules>CommonModule.OPI_Криптография</commonModules>
<commonModules>CommonModule.OPI_Telegram</commonModules>
<commonModules>CommonModule.OPI_VK</commonModules>
<commonModules>CommonModule.OPI_Viber</commonModules>
<commonModules>CommonModule.OPI_Twitter</commonModules>
<commonModules>CommonModule.OPI_Криптография</commonModules>
<httpServices>HTTPService.Twitter</httpServices>
<constants>Constant.TwitterRefresh</constants>
<constants>Constant.TwitterToken</constants>

View File

@ -3,6 +3,16 @@
Параметры = Новый Соответствие;
Параметры.Вставить("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"];
ОтветТокен = OPI_Twitter.ПолучитьТокен(Код, Параметры);