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

Доработки по API Twitter и по мелочи остальных

This commit is contained in:
Anton 2024-01-10 19:58:01 +03:00
parent 34ae49f785
commit 8e835dfedf
7 changed files with 296 additions and 95 deletions

View File

@ -24,7 +24,7 @@
#Область ПрограммныйИнтерфейс
#Область Бот
#Область ДанныеИНастройка
// Получить информацию бота.
//
@ -54,6 +54,24 @@
КонецФункции
// Установить Webhook.
//
// Параметры:
// Токен - Строка - Токен
// URL - Строка - Адрес обработки запросов от Telegram (с https://)
//
// Возвращаемое значение:
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
Параметры_ = Новый Структура;
Параметры_.Вставить("url", URL);
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/setWebHook", Параметры_);
Возврат Ответ;
КонецФункции
// Обработать данные, полученные на Webhook.
//
// Параметры:
@ -141,7 +159,7 @@
#КонецОбласти
#Область Диалоги
#Область ОтправкаДанных
// Отправить текстовое сообщение.
//
@ -269,7 +287,7 @@
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Telegram
//@skip-check doc-comment-collection-item-type
Функция ОтправитьНаборЛюбыхФайлов(Знач Токен
Функция ОтправитьМедиагруппу(Знач Токен
, Знач IDЧата
, Знач Текст
, Знач СоответствиеФайлов
@ -693,23 +711,36 @@
// Параметры:
// МассивКнопок - Массив из Строка - Массив кнопок
// ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели
// ОднаПодОдной - Булево - Истина - кнопки выводятся в столбик, Ложь - в строку
//
// Возвращаемое значение:
// Строка - JSON клавиатуры
Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок, Знач ПодСообщением = Ложь) Экспорт
Строки = Новый Массив;
Кнопки = Новый Массив;
Для Каждого Кнопка Из МассивКнопок Цикл
Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
КонецЦикла;
Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок, Знач ПодСообщением = Ложь, Знач ОднаПодОдной = Истина) Экспорт
Строки.Добавить(Кнопки);
Если ОднаПодОдной Тогда
Строки = Новый Массив;
Для Каждого Кнопка Из МассивКнопок Цикл
Кнопки = Новый Массив;
Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
Строки.Добавить(Кнопки);
КонецЦикла;
Иначе
Строки = Новый Массив;
Кнопки = Новый Массив;
Для Каждого Кнопка Из МассивКнопок Цикл
Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
КонецЦикла;
Строки.Добавить(Кнопки);
КонецЕсли;
Если ПодСообщением Тогда
СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1);
Иначе
@ -753,7 +784,7 @@
Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
ТекущийФайл = Новый Файл(Файл);
Расширение = ?(Вид = "document", ТекущийФайл.Расширение, "");
Расширение = ?(Вид = "document" или Вид = "animation", ТекущийФайл.Расширение, "");
Файл = Новый ДвоичныеДанные(Файл);
Иначе
Расширение = "";

View File

@ -131,35 +131,167 @@
#Область Твиты
// Создать твит.
//
// Параметры:
// Текст - Строка - Текст твита
// Параметры - Соответствие Из Строка - См.ПолучитьСтандартныеПараметры
//
// Возвращаемое значение:
// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
Функция СоздатьТвит(Знач Текст, Знач Параметры) Экспорт
Функция СоздатьПроизвольныйТвит(Знач Текст, Знач МассивМедиа = "", Знач МассивВариантов = "", Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
URL = "https://api.twitter.com/2/tweets";
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
URL = "https://api.twitter.com/2/tweets";
Если Не ТипЗнч(МассивМедиа) = Тип("Массив") Тогда
МассивМедиа_ = Новый Массив;
МассивМедиа_.Добавить(МассивМедиа);
МассивМедиа = МассивМедиа_;
КонецЕсли;
Поля = Новый Соответствие;
Поля.Вставить("text", Текст);
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация);
Если МассивМедиа.Количество() > 0 Тогда
Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа));
КонецЕсли;
Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация);
Возврат Ответ;
КонецФункции
Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт
Возврат СоздатьПроизвольныйТвит(Текст, , Параметры);
КонецФункции
Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт
МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, Параметры);
КонецФункции
Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт
МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, Параметры);
КонецФункции
Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт
МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры);
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, Параметры);
КонецФункции
Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт
МассивМедиа = Новый Массив;
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Если ЗначениеЗаполнено(МассивФайлов) Тогда
Если Не ТипЗнч(МассивФайлов) = Тип("Массив") Тогда
МассивФайлов_ = Новый Массив;
МассивФайлов_.Добавить(МассивФайлов);
МассивФайлов = МассивФайлов_;
КонецЕсли;
Для Каждого ФайлОтправки Из МассивФайлов Цикл
Если Не ТипЗнч(ФайлОтправки) = Тип("ДвоичныеДанные") Тогда
ФайлОтправки = Новый ДвоичныеДанные(ФайлОтправки);
КонецЕсли;
IDМедиа = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_)["media_id_string"];
МассивМедиа.Добавить(IDМедиа);
КонецЦикла;
КонецЕсли;
Возврат МассивМедиа;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры)
СоответствиеMIME = Новый Соответствие;
СоответствиеMIME.Вставить("tweet_image", "image/jpeg");
СоответствиеMIME.Вставить("tweet_video", "video/mp4");
СоответствиеMIME.Вставить("tweet_gif" , "image/gif");
Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
Файл = Новый ДвоичныеДанные(Файл);
КонецЕсли;
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
URL = "https://upload.twitter.com/1.1/media/upload.json";
Размер = Файл.Размер();
Если Тип = "tweet_image" Тогда
Поля = Новый Структура;
Поля.Вставить("media_data" , Base64Строка(Файл));
Поля.Вставить("media_category", Тип);
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL);
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
Иначе
ЧтениеДанных = Новый ЧтениеДанных(Файл);
МассивЧтения = ЧтениеДанных.РазделитьНаЧастиПо(5000000);
Поля = Новый Структура;
Поля.Вставить("command" , "INIT");
Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер));
Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип));
Поля.Вставить("media_category" ,Тип);
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL);
ID = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь)["media_id_string"];
Счетчик = 0;
Для Каждого Часть Из МассивЧтения Цикл
ДвоичныеЧасти = Часть.ПолучитьДвоичныеДанные();
B64Части = Base64Строка(ДвоичныеЧасти);
Поля = Новый Структура;
Поля.Вставить("command" , "APPEND");
Поля.Вставить("media_id" , ID);
Поля.Вставить("media_data" , B64Части);
Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик));
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL);
OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
КонецЦикла;
Поля = Новый Структура;
Поля.Вставить("command" , "FINALIZE");
Поля.Вставить("media_id" , ID);
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL);
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
КонецЕсли;
Возврат Ответ;
КонецФункции
Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
//Здесь собрано определение данных, необходимых для работы.
@ -242,8 +374,7 @@
ТаблицаПараметров = Новый ТаблицаЗначений;
ТаблицаПараметров.Колонки.Добавить("Ключ");
ТаблицаПараметров.Колонки.Добавить("Значение");
Для Каждого Поле Из Поля Цикл
НоваяСтрока = ТаблицаПараметров.Добавить();

View File

@ -459,12 +459,13 @@
Функция ПоставитьЛайк(Знач IDПоста, Знач IDСтены = "", Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
IDСтены = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["group_id"]);
IDСтены = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]);
Параметры_.Вставить("type" , "post");
Параметры_.Вставить("object" , "wall" + OPI_Инструменты.ЧислоВСтроку(IDСтены) + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста));
Параметры_.Вставить("item_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста));
Параметры_.Вставить("owner_id" , OPI_Инструменты.ЧислоВСтроку(IDСтены));
Параметры_.Вставить("from_group" , 0);
Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_);
@ -573,6 +574,26 @@
КонецФункции
// Сократить ссылку.
//
// Параметры:
// URL - Строка - URL для сокращения
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
//
// Возвращаемое значение:
// Строка - Сокращенный URL
Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт
Параметры_ = Новый Структура;
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Параметры_.Вставить("url", URL);
Ответ = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_);
Возврат Ответ["response"]["short_url"];
КонецФункции
#КонецОбласти
#Область Статистика
@ -678,7 +699,7 @@
СтруктураКампании.Вставить("day_limit" , 0);
СтруктураКампании.Вставить("all_limit" , 0);
СтруктураКампании.Вставить("start_time" , Формат(ТекущаяДатаСеанса() - Дата(1970,1,1,1,0,0), "ЧГ=0"));
СтруктураКампании.Вставить("stop_time" , Формат('2120.01.01' - Дата(1970,1,1,1,0,0), "ЧГ=0"));
СтруктураКампании.Вставить("stop_time" , Формат(ДобавитьМесяц(ТекущаяДатаСеанса(), 24) - Дата(1970,1,1,1,0,0), "ЧГ=0"));
СтруктураКампании.Вставить("status" , 1);
МассивСтруктур.Добавить(СтруктураКампании);
@ -782,65 +803,19 @@
КонецФункции
// Изменить запись рекламного объявления.
//
// Параметры:
// IDПоста - Строка,Число - ID поста на замену
// IDКабинета - Строка,Число - ID рекламного кабинета
// IDОбъявления - Строка,Число - ID рекламного объявления
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
//
// Возвращаемое значение:
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
Функция ИзменитьЗаписьРекламногоОбъявления(Знач IDПоста, Знач IDКабинета, Знач IDОбъявления, Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Линк = "https://vk.com/wall-" + Параметры_["group_id"] + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста);
Параметры_.Вставить("account_id", OPI_Инструменты.ЧислоВСтроку(IDКабинета));
МассивСтруктур = Новый Массив;
СтруктураКампании = Новый Структура;
СтруктураКампании.Вставить("ad_id" , OPI_Инструменты.ЧислоВСтроку(IDОбъявления));
СтруктураКампании.Вставить("status" , 1);
СтруктураКампании.Вставить("link_url" , Линк);
МассивСтруктур.Добавить(СтруктураКампании);
JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур);
Параметры_.Вставить("data", JSONДата);
Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.updateAds", Параметры_);
Функция ПолучитьСписокРекламныхКатегорий(Знач Параметры = "") Экспорт
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область Прочие
// Сократить ссылку.
//
// Параметры:
// URL - Строка - URL для сокращения
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
//
// Возвращаемое значение:
// Строка - Сокращенный URL
Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт
Параметры_ = Новый Структура;
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
Параметры_.Вставить("url", URL);
Ответ = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_);
Возврат Ответ["response"]["short_url"];
КонецФункции
// Сформировать клавиатуру.
//
// Параметры:

View File

@ -21,7 +21,6 @@
//SOFTWARE.
//https://github.com/Bayselonarrend/OpenIntegrations
#Область ПрограммныйИнтерфейс
#Область НастройкиИИнформация
@ -232,8 +231,8 @@
Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
СтруктураЛокации = Новый Структура;
СтруктураЛокации.Вставить("lat", Широта);
СтруктураЛокации.Вставить("lon", Долгота);
СтруктураЛокации.Вставить("lat", OPI_Инструменты.ЧислоВСтроку(Широта));
СтруктураЛокации.Вставить("lon", OPI_Инструменты.ЧислоВСтроку(Долгота));
Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, СтруктураЛокации);

View File

@ -141,9 +141,9 @@
Если Ответ.Заголовки.Получить("Content-Encoding") = "gzip" Тогда
Ответ = РаспаковатьОтвет(Ответ);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат ?(ТипЗнч(Ответ) = Тип("ДвоичныеДанные"), JsonВСтруктуру(Ответ), Ответ);
Возврат ?(ТипЗнч(Ответ) = Тип("ДвоичныеДанные"), JsonВСтруктуру(Ответ), JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные()));
КонецФункции
@ -189,9 +189,21 @@
Если НужнаРаспаковка Тогда
Ответ = РаспаковатьОтвет(Ответ);
КонецЕсли;
КонецЕсли;
Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ);
Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
Попытка
Ответ = JsonВСтруктуру(Ответ)
Исключение
Ответ = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
КонецПопытки;
КонецЕсли;
Возврат ?(ТипЗнч(Ответ) = Тип("ДвоичныеДанные"), JsonВСтруктуру(Ответ), Ответ);
Возврат Ответ;
КонецФункции
@ -287,7 +299,7 @@
Функция JSONСтрокой(Знач Данные) Экспорт
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
@ -301,6 +313,22 @@
Возврат СтрЗаменить(Строка(Число), Символы.НПП, "");
КонецФункции
Процедура ВыполнитьСкрипт(Знач Текст) Экспорт
ИмяСкрипта = ПолучитьИмяВременногоФайла(".ps1");
ТекстСкрипта = Новый ТекстовыйДокумент();
ТекстСкрипта.УстановитьТекст(Текст);
ТекстСкрипта.Записать(ИмяСкрипта, КодировкаТекста.UTF8);
КодВозврата = 0;
ЗапуститьПриложение("powershell -file " + ИмяСкрипта + " -noexit", , Истина, КодВозврата);
УдалитьФайлы(ИмяСкрипта);
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@ -1,5 +1,39 @@
#Область СлужебныйПрограммныйИнтерфейс
Функция СоздатьКлючИзP12(Знач ПутьКСертификату, Знач Пароль = "") Экспорт
ФайлКлюча = ПолучитьИмяВременногоФайла("pem");
СтрокаЗапуска = "openssl pkcs12 -in """
+ ПутьКСертификату
+ """ -nocerts -out """
+ ФайлКлюча
+ """ -nodes";
Если ЗначениеЗаполнено(Пароль) Тогда
СтрокаЗапуска = СтрокаЗапуска + " -passin pass:" + Пароль;
КонецЕсли;
OPI_Инструменты.ВыполнитьСкрипт(СтрокаЗапуска);
Возврат ФайлКлюча;
КонецФункции
Функция ПолучитьRSAКлючИзПриватногоКлюча(Знач ПутьКПриватномуКлючу) Экспорт
ФайлRSA = ПолучитьИмяВременногоФайла("txt");
OPI_Инструменты.ВыполнитьСкрипт("openssl rsa -in """
+ ПутьКПриватномуКлючу
+ """ -out """
+ ФайлRSA
+ """ -text");
УдалитьФайлы(ПутьКПриватномуКлючу);
Возврат ФайлRSA;
КонецФункции
#Область БСП
///////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -1,8 +1,11 @@
Функция Twitterget(Запрос)
Параметры = Новый Соответствие;
Код = Запрос.ПараметрыЗапроса["code"];
ОтветТокен = OPI_Twitter.ПолучитьТокен(Код);
ОтветТокен = OPI_Twitter.ПолучитьТокен(Код, Параметры);
Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]);
Константы.TwitterToken.Установить(ОтветТокен["access_token"]);