You've already forked OpenIntegrations
mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2025-12-03 22:39:12 +02:00
Вводный расширения
This commit is contained in:
@@ -1,813 +0,0 @@
|
||||
//MIT License
|
||||
|
||||
//Copyright (c) 2023 Anton Tsitavets
|
||||
|
||||
//Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
//of this software and associated documentation files (the "Software"), to deal
|
||||
//in the Software without restriction, including without limitation the rights
|
||||
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
//copies of the Software, and to permit persons to whom the Software is
|
||||
//furnished to do so, subject to the following conditions:
|
||||
|
||||
//The above copyright notice and this permission notice shall be included in all
|
||||
//copies or substantial portions of the Software.
|
||||
|
||||
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
//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
|
||||
//SOFTWARE.
|
||||
|
||||
//https://github.com/Bayselonarrend/OpenIntegrations
|
||||
|
||||
#Область ПрограммныйИнтерфейс
|
||||
|
||||
#Область ДанныеИНастройка
|
||||
|
||||
// Получить информацию бота.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция ПолучитьИнформациюБота(Знач Токен) Экспорт
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getMe");
|
||||
Возврат Ответ;
|
||||
|
||||
Конецфункции
|
||||
|
||||
// Получить обновления.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция ПолучитьОбновления(Знач Токен) Экспорт
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getUpdates");
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Установить Webhook.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// URL - Строка - Адрес обработки запросов от Telegram (с https://)
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("url", URL);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/setWebHook", Параметры_);
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Обработать данные, полученные на Webhook.
|
||||
//
|
||||
// Параметры:
|
||||
// Запрос - HTTPСервисЗапрос - Запрос на http-сервис от Telegram
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура - Обработанный запрос на http-сервис от Telegram:
|
||||
// * Вид - Строка,Неопределено
|
||||
// * Никнейм - Строка,Неопределено
|
||||
// * IDПользователя - Строка,Неопределено
|
||||
// * IDСообщения - Строка,Неопределено
|
||||
// * IDЧата - Строка,Неопределено
|
||||
// * Сообщение - Строка,Неопределено
|
||||
// * Дата - Дата,Неопределено
|
||||
// * БотОтключен - Булево,Неопределено
|
||||
// * Вид - Строка,Неопределено
|
||||
Функция ОбработатьДанные(Знач Запрос) Экспорт
|
||||
|
||||
ЧтениеJSON = Новый ЧтениеJSON;
|
||||
ЧтениеJSON.УстановитьСтроку(Запрос.ПолучитьТелоКакСтроку());
|
||||
|
||||
СтруктураПараметровВходная = ПрочитатьJSON(ЧтениеJSON);
|
||||
СтруктураПараметровВыходная = Новый Структура;
|
||||
СтруктураПараметровВыходная.Вставить("Вид" , "");
|
||||
СтруктураПараметровВыходная.Вставить("Никнейм" , "");
|
||||
СтруктураПараметровВыходная.Вставить("IDПользователя", "");
|
||||
СтруктураПараметровВыходная.Вставить("IDСообщения" , "");
|
||||
СтруктураПараметровВыходная.Вставить("IDЧата" , "");
|
||||
СтруктураПараметровВыходная.Вставить("Сообщение" , "");
|
||||
СтруктураПараметровВыходная.Вставить("Дата" , ТекущаяДатаСеанса());
|
||||
СтруктураПараметровВыходная.Вставить("БотОтключен" , Ложь);
|
||||
|
||||
Если СтруктураПараметровВходная.Свойство("message") Тогда
|
||||
|
||||
СтруктураСообщения = СтруктураПараметровВходная["message"];
|
||||
СтруктураПользователя = СтруктураСообщения["from"];
|
||||
СтруктураЧата = СтруктураСообщения["chat"];
|
||||
|
||||
СтруктураПараметровВыходная.Вставить("Вид" , "Сообщение");
|
||||
СтруктураПараметровВыходная.Вставить("Никнейм" , СтруктураПользователя["username"]);
|
||||
СтруктураПараметровВыходная.Вставить("IDПользователя" , СтруктураПользователя["id"]);
|
||||
СтруктураПараметровВыходная.Вставить("IDСообщения" , СтруктураСообщения["message_id"]);
|
||||
СтруктураПараметровВыходная.Вставить("IDЧата" , СтруктураЧата["id"]);
|
||||
СтруктураПараметровВыходная.Вставить("Сообщение" , СтруктураСообщения["text"]);
|
||||
СтруктураПараметровВыходная.Вставить("Дата" , Дата(1970,1,1,1,0,0) + СтруктураСообщения["date"]);
|
||||
СтруктураПараметровВыходная.Вставить("БотОтключен" , Ложь);
|
||||
|
||||
ИначеЕсли СтруктураПараметровВходная.Свойство("my_chat_member") Тогда
|
||||
|
||||
СтруктураСообщения = СтруктураПараметровВходная["my_chat_member"];
|
||||
СтруктураПользователя = СтруктураСообщения["from"];
|
||||
СтруктураЧата = СтруктураСообщения["chat"];
|
||||
|
||||
СтруктураПараметровВыходная.Вставить("Вид" , "Запуск/Остановка");
|
||||
СтруктураПараметровВыходная.Вставить("Никнейм" , СтруктураПользователя["username"]);
|
||||
СтруктураПараметровВыходная.Вставить("IDПользователя" , СтруктураПользователя["id"]);
|
||||
СтруктураПараметровВыходная.Вставить("IDСообщения" , "");
|
||||
СтруктураПараметровВыходная.Вставить("IDЧата" , СтруктураЧата["id"]);
|
||||
СтруктураПараметровВыходная.Вставить("Сообщение" , СтруктураСообщения["new_chat_member"]["status"]);
|
||||
СтруктураПараметровВыходная.Вставить("Дата" , Дата(1970,1,1,1,0,0) + СтруктураСообщения["date"]);
|
||||
СтруктураПараметровВыходная.Вставить("БотОтключен"
|
||||
, ?(СтруктураСообщения["new_chat_member"]["status"] = "kicked", Истина, Ложь));
|
||||
|
||||
ИначеЕсли СтруктураПараметровВходная.Свойство("callback_query") Тогда
|
||||
|
||||
|
||||
СтруктураСообщения = СтруктураПараметровВходная["callback_query"];
|
||||
СтруктураПользователя = СтруктураСообщения["from"];
|
||||
|
||||
СтруктураПараметровВыходная.Вставить("Вид" , "Кнопка под сообщением");
|
||||
СтруктураПараметровВыходная.Вставить("Никнейм" , СтруктураПользователя["username"]);
|
||||
СтруктураПараметровВыходная.Вставить("IDПользователя" , СтруктураПользователя["id"]);
|
||||
СтруктураПараметровВыходная.Вставить("IDСообщения" , СтруктураСообщения["message"]["message_id"]);
|
||||
СтруктураПараметровВыходная.Вставить("IDЧата" , СтруктураСообщения["message"]["chat"]["id"]);
|
||||
СтруктураПараметровВыходная.Вставить("Сообщение" , СтруктураСообщения["data"]);
|
||||
СтруктураПараметровВыходная.Вставить("БотОтключен" , Ложь);
|
||||
СтруктураПараметровВыходная.Вставить("Дата"
|
||||
, Дата(1970,1,1,1,0,0) + СтруктураСообщения["message"]["date"]);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат СтруктураПараметровВыходная;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область ОтправкаДанных
|
||||
|
||||
// Отправить текстовое сообщение.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// Текст - Строка - Текст сообщения
|
||||
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция ОтправитьТекстовоеСообщение(Знач Токен, Знач IDЧата, Знач Текст, Знач Клавиатура = "") Экспорт
|
||||
|
||||
OPI_Инструменты.ЗаменитьСпецСимволы(Текст);
|
||||
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("text" , Текст);
|
||||
Параметры_.Вставить("chat_id" , IDЧата);
|
||||
Параметры_.Вставить("reply_markup" , Клавиатура);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendMessage", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить картинку.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - IDЧата
|
||||
// Текст - Строка - Текст
|
||||
// Картинка - ДвоичныеДанные,Строка - Двоичные данные или путь к картинке
|
||||
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, HTTPОтвет - Ответ сервера Telegram
|
||||
Функция ОтправитьКартинку(Знач Токен, Знач IDЧата, Знач Текст, Знач Картинка, Знач Клавиатура = "") Экспорт
|
||||
|
||||
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить видео.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// Текст - Строка - Текст
|
||||
// Видео - ДвоичныеДанные,Строка - Двоичные данные или путь к видео
|
||||
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, HTTPОтвет - Ответ сервера Telegram
|
||||
Функция ОтправитьВидео(Знач Токен, Знач IDЧата, Знач Текст, Знач Видео, Знач Клавиатура = "") Экспорт
|
||||
|
||||
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить аудио.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// Текст - Строка - Текст
|
||||
// Аудио - ДвоичныеДанные,Строка - Двоичные данные или путь к аудио
|
||||
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, HTTPОтвет - Ответ сервера Telegram
|
||||
Функция ОтправитьАудио(Знач Токен, Знач IDЧата, Знач Текст, Знач Аудио, Знач Клавиатура = "") Экспорт
|
||||
|
||||
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить документ.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// Текст - Строка - Текст
|
||||
// Документ - ДвоичныеДанные,Строка - Двоичные данные или путь к документу
|
||||
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, HTTPОтвет - Ответ сервера Telegram
|
||||
Функция ОтправитьДокумент(Знач Токен, Знач IDЧата, Знач Текст, Знач Документ, Знач Клавиатура = "") Экспорт
|
||||
|
||||
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить гифку.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// Текст - Строка - Текст
|
||||
// Гифка - ДвоичныеДанные,Строка - Двоичные данные или путь к гифке
|
||||
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, HTTPОтвет - Ответ сервера Telegram
|
||||
Функция ОтправитьГифку(Знач Токен, Знач IDЧата, Знач Текст, Знач Гифка, Знач Клавиатура = "") Экспорт
|
||||
|
||||
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить набор любых файлов.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// Текст - Строка - Текст
|
||||
// СоответствиеФайлов - Соответствие:
|
||||
// * Ключ - Строка
|
||||
// * Значение - ДвоичныеДанные,Строка
|
||||
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Ответ сервера Telegram
|
||||
//@skip-check doc-comment-collection-item-type
|
||||
Функция ОтправитьМедиагруппу(Знач Токен
|
||||
, Знач IDЧата
|
||||
, Знач Текст
|
||||
, Знач СоответствиеФайлов
|
||||
, Знач Клавиатура = "") Экспорт
|
||||
|
||||
//СоответствиеФайлов
|
||||
//Ключ - Файл, Значение - Тип
|
||||
//Типы: audio, document, photo, video
|
||||
//Нельзя замешивать разные типы!
|
||||
|
||||
OPI_Инструменты.ЗаменитьСпецсимволы(Текст);
|
||||
|
||||
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||
СтруктураФайлов = Новый Структура;
|
||||
Медиа = Новый Массив;
|
||||
Счетчик = 0;
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("caption" , Текст);
|
||||
Параметры_.Вставить("chat_id" , IDЧата);
|
||||
Параметры_.Вставить("reply_markup" , Клавиатура);
|
||||
|
||||
|
||||
Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл
|
||||
|
||||
Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда
|
||||
ДД = Новый ДвоичныеДанные(ТекущийФайл.Ключ);
|
||||
ЭтотФайл = Новый Файл(ТекущийФайл.Ключ);
|
||||
ИмяМедиа = ТекущийФайл.Значение
|
||||
+ Строка(Счетчик)
|
||||
+ ?(ТекущийФайл.Значение = "document", ЭтотФайл.Расширение, "");
|
||||
ПолноеИмяМедиа = СтрЗаменить(ИмяМедиа, ".", "___");
|
||||
Иначе
|
||||
ДД = ТекущийФайл.Ключ;
|
||||
ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик);
|
||||
ПолноеИмяМедиа = ИмяМедиа;
|
||||
КонецЕсли;
|
||||
|
||||
СтруктураФайлов.Вставить(ПолноеИмяМедиа , ДД);
|
||||
|
||||
СтруктураМедиа = Новый Структура;
|
||||
СтруктураМедиа.Вставить("type", ТекущийФайл.Значение);
|
||||
СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа);
|
||||
|
||||
Если Счетчик = 0 Тогда
|
||||
СтруктураМедиа.Вставить("caption", Текст);
|
||||
КонецЕсли;
|
||||
|
||||
Медиа.Добавить(СтруктураМедиа);
|
||||
|
||||
Счетчик = Счетчик + 1;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Параметры_.Вставить("media", OPI_Инструменты.JSONСтрокой(Медиа));
|
||||
|
||||
Ответ = OPI_Инструменты.PostMultipart("api.telegram.org/bot"
|
||||
+ Токен
|
||||
+ "/sendMediaGroup", Параметры_, СтруктураФайлов, "mixed");
|
||||
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить местоположение.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// Широта - Строка,Число - Географическая широта
|
||||
// Долгота - Строка,Число - Географическая долгота
|
||||
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт
|
||||
|
||||
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("chat_id" , IDЧата);
|
||||
Параметры_.Вставить("latitude" , OPI_Инструменты.ЧислоВСтроку(Широта));
|
||||
Параметры_.Вставить("longitude" , OPI_Инструменты.ЧислоВСтроку(Долгота));
|
||||
Параметры_.Вставить("reply_markup" , Клавиатура);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendLocation", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить контакт.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// Имя - Строка - Имя контакта
|
||||
// Фамилия - Строка - Фамилия контакта
|
||||
// Телефон - Строка - Телефон контакта
|
||||
// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт
|
||||
|
||||
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("chat_id" , IDЧата);
|
||||
Параметры_.Вставить("first_name" , Имя);
|
||||
Параметры_.Вставить("last_name" , Фамилия);
|
||||
Параметры_.Вставить("phone_number" , Строка(Телефон));
|
||||
Параметры_.Вставить("reply_markup" , Клавиатура);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendContact", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить опрос.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// Вопрос - Строка - Вопрос опроса
|
||||
// МассивОтветов - Массив из строка - Массив вариантов ответа
|
||||
// Анонимный - Булево - Анонимность опроса
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт
|
||||
|
||||
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||
Ответы = OPI_Инструменты.JSONСтрокой(МассивОтветов);
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("chat_id" , IDЧата);
|
||||
Параметры_.Вставить("question" , Вопрос);
|
||||
Параметры_.Вставить("options" , Ответы);
|
||||
|
||||
Если Не Анонимный Тогда
|
||||
Параметры_.Вставить("is_anonymous" , Ложь);
|
||||
КонецЕсли;
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendPoll", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Переслать сообщение.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDОригинала - Строка,Число - ID оригинального сообщения
|
||||
// ОткудаID - Строка,Число - ID чата оригинального сообщения
|
||||
// КудаID - Строка,Число - ID целевого чата
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт
|
||||
|
||||
IDОригинала = OPI_Инструменты.ЧислоВСтроку(IDОригинала);
|
||||
ОткудаID = OPI_Инструменты.ЧислоВСтроку(ОткудаID);
|
||||
КудаID = OPI_Инструменты.ЧислоВСтроку(КудаID);
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("chat_id" , КудаID);
|
||||
Параметры_.Вставить("from_chat_id" , ОткудаID);
|
||||
Параметры_.Вставить("message_id" , IDОригинала);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/forwardMessage", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область Администрирование
|
||||
|
||||
// Бан.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// IDПользователя - Строка,Число - ID целевого пользователя
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт
|
||||
|
||||
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||
IDПользователя = OPI_Инструменты.ЧислоВСтроку(IDПользователя);
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("chat_id" , IDЧата);
|
||||
Параметры_.Вставить("user_id" , IDПользователя);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/banChatMember", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Разбан.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// IDПользователя - Строка,Число - ID целевого пользователя
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт
|
||||
|
||||
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||
IDПользователя = OPI_Инструменты.ЧислоВСтроку(IDПользователя);
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("chat_id" , IDЧата);
|
||||
Параметры_.Вставить("user_id" , IDПользователя);
|
||||
Параметры_.Вставить("only_if_banned" , Истина);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/unbanChatMember", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создать ссылку приглашение.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// Заголовок - Строка - Заголовок приглашения
|
||||
// ДатаИстечения - Дата - Дата окончания жизни ссылки (безсрочно, если не указано)
|
||||
// ЛимитПользователей - Число - Лимит пользователей (бесконечно, если не указано)
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция СоздатьСсылкуПриглашение(Знач Токен
|
||||
, Знач IDЧата
|
||||
, Знач Заголовок = ""
|
||||
, Знач ДатаИстечения = ""
|
||||
, Знач ЛимитПользователей = 0) Экспорт
|
||||
|
||||
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("chat_id" , IDЧата);
|
||||
Параметры_.Вставить("name" , Заголовок);
|
||||
|
||||
Если ЗначениеЗаполнено(ДатаИстечения) Тогда
|
||||
Параметры_.Вставить("expire_date" , Формат(ДатаИстечения - Дата(1970,1,1,1,0,0), "ЧГ=0"));
|
||||
КонецЕсли;
|
||||
|
||||
Параметры_.Вставить("member_limit", ЛимитПользователей);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/createChatInviteLink", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Закрепить сообщение.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
// IDСообщения - Строка,Число - ID целевого сообщения
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
|
||||
|
||||
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||
IDСообщения = OPI_Инструменты.ЧислоВСтроку(IDСообщения);
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("chat_id" , IDЧата);
|
||||
Параметры_.Вставить("message_id" , IDСообщения);
|
||||
Параметры_.Вставить("disable_notification" , Истина);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/pinChatMessage", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Открепить сообщение.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка - ID целевого чата
|
||||
// IDСообщения - Строка,Число - ID целевого сообщения
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||
Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
|
||||
|
||||
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||
IDСообщения = OPI_Инструменты.ЧислоВСтроку(IDСообщения);
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("chat_id" , IDЧата);
|
||||
Параметры_.Вставить("message_id" , IDСообщения);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/unpinChatMessage", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Получить число участников.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDЧата - Строка,Число - ID целевого чата
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Получить число участников
|
||||
Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт
|
||||
|
||||
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("chat_id" , IDЧата);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getChatMemberCount", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область TelegramMiniApp
|
||||
|
||||
// Обработать данные TMA и определить их достоверность
|
||||
//
|
||||
// Параметры:
|
||||
// СтрокаДанных - Строка - querry из Telegram.WebApp.initData
|
||||
// Токен - Строка - Токен бота
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Соответствие из Строка - Обработанные данные с признаком достоверности
|
||||
Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт
|
||||
|
||||
СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL);
|
||||
СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных);
|
||||
Ключ = "WebAppData";
|
||||
Хэш = "";
|
||||
|
||||
Результат = OPI_Криптография.HMACSHA256(ПолучитьДвоичныеДанныеИзСтроки(Ключ)
|
||||
, ПолучитьДвоичныеДанныеИзСтроки(Токен));
|
||||
|
||||
ТЗнач = Новый ТаблицаЗначений;
|
||||
ТЗнач.Колонки.Добавить("Ключ");
|
||||
ТЗнач.Колонки.Добавить("Значение");
|
||||
|
||||
Для Каждого Данные Из СтруктураДанных Цикл
|
||||
|
||||
НоваяСтрока = ТЗнач.Добавить();
|
||||
НоваяСтрока.Ключ = Данные.Ключ;
|
||||
НоваяСтрока.Значение = Данные.Значение;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
ТЗнач.Сортировать("Ключ");
|
||||
|
||||
СоответствиеВозврата = Новый Соответствие;
|
||||
DCS = "";
|
||||
|
||||
Для Каждого СтрокаТЗ Из ТЗнач Цикл
|
||||
|
||||
Если СтрокаТЗ.Ключ <> "hash" Тогда
|
||||
DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС;
|
||||
СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение);
|
||||
Иначе
|
||||
Хэш = СтрокаТЗ.Значение;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
DCS = Лев(DCS, СтрДлина(DCS) - 1);
|
||||
Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS));
|
||||
|
||||
Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись);
|
||||
|
||||
Если Финал = вРег(Хэш) Тогда
|
||||
Ответ = Истина;
|
||||
Иначе
|
||||
Ответ = Ложь;
|
||||
КонецЕсли;
|
||||
|
||||
СоответствиеВозврата.Вставить("passed", Ответ);
|
||||
|
||||
Возврат СоответствиеВозврата;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область Прочее
|
||||
|
||||
// Сформировать клавиатуру по массиву кнопок.
|
||||
//
|
||||
// Параметры:
|
||||
// МассивКнопок - Массив из Строка - Массив кнопок
|
||||
// ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели
|
||||
// ОднаПодОдной - Булево - Истина - кнопки выводятся в столбик, Ложь - в строку
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка - JSON клавиатуры
|
||||
Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок, Знач ПодСообщением = Ложь, Знач ОднаПодОдной = Истина) Экспорт
|
||||
|
||||
Если ОднаПодОдной Тогда
|
||||
|
||||
Строки = Новый Массив;
|
||||
|
||||
Для Каждого Кнопка Из МассивКнопок Цикл
|
||||
Кнопки = Новый Массив;
|
||||
Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
|
||||
Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
|
||||
Строки.Добавить(Кнопки);
|
||||
КонецЦикла;
|
||||
|
||||
Иначе
|
||||
|
||||
Строки = Новый Массив;
|
||||
Кнопки = Новый Массив;
|
||||
|
||||
Для Каждого Кнопка Из МассивКнопок Цикл
|
||||
Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
|
||||
Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
|
||||
КонецЦикла;
|
||||
|
||||
Строки.Добавить(Кнопки);
|
||||
КонецЕсли;
|
||||
|
||||
Если ПодСообщением Тогда
|
||||
СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1);
|
||||
Иначе
|
||||
СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина);
|
||||
КонецЕсли;
|
||||
|
||||
ЗаписьJSON = Новый ЗаписьJSON;
|
||||
ПЗJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, , , ЭкранированиеСимволовJSON.СимволыВнеASCII);
|
||||
ЗаписьJSON.УстановитьСтроку(ПЗJSON);
|
||||
|
||||
ЗаписатьJSON(ЗаписьJSON, СтруктураПараметра);
|
||||
|
||||
Возврат ЗаписьJSON.Закрыть();
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура)
|
||||
|
||||
Если Вид = "photo" Тогда
|
||||
Метод = "/sendPhoto";
|
||||
ИначеЕсли Вид = "video" Тогда
|
||||
Метод = "/sendVideo";
|
||||
ИначеЕсли Вид = "audio" Тогда
|
||||
Метод = "/sendAudio";
|
||||
ИначеЕсли Вид = "document" Тогда
|
||||
Метод = "/sendDocument";
|
||||
ИначеЕсли Вид = "animation" Тогда
|
||||
Метод = "/sendAnimation";
|
||||
Иначе
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
|
||||
OPI_Инструменты.ЗаменитьСпецсимволы(Текст);
|
||||
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||
|
||||
Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
|
||||
ТекущийФайл = Новый Файл(Файл);
|
||||
Расширение = ?(Вид = "document" или Вид = "animation", ТекущийФайл.Расширение, "");
|
||||
Файл = Новый ДвоичныеДанные(Файл);
|
||||
Иначе
|
||||
Расширение = "";
|
||||
КонецЕсли;
|
||||
|
||||
Расширение = СтрЗаменить(Расширение, ".", "___");
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("caption" , Текст);
|
||||
Параметры_.Вставить("chat_id" , IDЧата);
|
||||
Параметры_.Вставить("reply_markup" , Клавиатура);
|
||||
|
||||
СтруктураФайлов = Новый Структура;
|
||||
СтруктураФайлов.Вставить(Вид + Расширение, Файл);
|
||||
|
||||
Ответ = OPI_Инструменты.PostMultipart("api.telegram.org/bot"
|
||||
+ Токен
|
||||
+ Метод, Параметры_, СтруктураФайлов, "mixed");
|
||||
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="4d52bb67-ccbd-4f64-ac39-35d2d8e921ee">
|
||||
<name>OPI_Telegram</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Методы интеграции с Telegram (ОПИ)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
||||
@@ -1,582 +0,0 @@
|
||||
//MIT License
|
||||
|
||||
//Copyright (c) 2023 Anton Tsitavets
|
||||
|
||||
//Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
//of this software and associated documentation files (the "Software"), to deal
|
||||
//in the Software without restriction, including without limitation the rights
|
||||
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
//copies of the Software, and to permit persons to whom the Software is
|
||||
//furnished to do so, subject to the following conditions:
|
||||
|
||||
//The above copyright notice and this permission notice shall be included in all
|
||||
//copies or substantial portions of the Software.
|
||||
|
||||
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
//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
|
||||
//SOFTWARE.
|
||||
|
||||
//https://github.com/Bayselonarrend/OpenIntegrations
|
||||
//Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
|
||||
//и почитать комментарии
|
||||
|
||||
#Область ПрограммныйИнтерфейс
|
||||
|
||||
#Область ДанныеИНастройка
|
||||
|
||||
// Получить ссылку для авторизации через браузер.
|
||||
//
|
||||
// Параметры:
|
||||
// Параметры - Соответствие Из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка - URL для перехода в браузере
|
||||
Функция ПолучитьСсылкуАвторизации(Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
ПараметрыURL = Новый Структура;
|
||||
|
||||
ПараметрыURL.Вставить("response_type" , "code");
|
||||
ПараметрыURL.Вставить("client_id" , Параметры_["client_id"]);
|
||||
ПараметрыURL.Вставить("redirect_uri" , Параметры_["redirect_uri"]);
|
||||
ПараметрыURL.Вставить("scope" , Параметры_["scope"]);
|
||||
ПараметрыURL.Вставить("state" , "state");
|
||||
ПараметрыURL.Вставить("code_challenge" , "challenge");
|
||||
ПараметрыURL.Вставить("code_challenge_method", "plain");
|
||||
|
||||
Линк = "https://twitter.com/i/oauth2/authorize"
|
||||
+ OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
|
||||
|
||||
Возврат Линк;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Получить токен.
|
||||
//
|
||||
// Параметры:
|
||||
// Код - Строка - Код, полученный из авторизации См.ПолучитьСсылкуАвторизации
|
||||
// Параметры - Соответствие Из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
|
||||
Функция ПолучитьТокен(Знач Код, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
ПараметрыЗапроса = Новый Структура;
|
||||
ПараметрыЗапроса.Вставить("code" , Код);
|
||||
ПараметрыЗапроса.Вставить("grant_type" , "authorization_code");
|
||||
ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]);
|
||||
ПараметрыЗапроса.Вставить("redirect_uri" , Параметры_["redirect_uri"]);
|
||||
ПараметрыЗапроса.Вставить("code_verifier", "challenge");
|
||||
|
||||
Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
|
||||
, ПараметрыЗапроса, , Ложь);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Обновить токен v2 токен при помощи refresh_token
|
||||
//
|
||||
// Параметры:
|
||||
// Параметры - Соответствие Из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
|
||||
Функция ОбновитьТокен(Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
ПараметрыЗапроса = Новый Структура;
|
||||
ПараметрыЗапроса.Вставить("refresh_token", Параметры_["refresh_token"]);
|
||||
ПараметрыЗапроса.Вставить("grant_type" , "refresh_token");
|
||||
ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]);
|
||||
|
||||
Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
|
||||
, ПараметрыЗапроса, , Ложь);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Метод для вставки в http-сервис, адрес которого указывается в redirect_uri
|
||||
// Вызывает метод получения токена, так как для получения токена из кода, приходящего
|
||||
// на redirect_uri после авторизации через браузер есть всего 30 секунд
|
||||
//
|
||||
// Параметры:
|
||||
// Запрос - HTTPСервисЗапрос - Запрос, приходящий на http-сервис
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
|
||||
Функция ОбработкаВходящегоЗапросаПослеАвторизации(Запрос) Экспорт
|
||||
|
||||
Код = Запрос.ПараметрыЗапроса["code"];
|
||||
ОтветТокен = ПолучитьТокен(Код);
|
||||
|
||||
//Предпочтительное хранение токенов
|
||||
//Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]);
|
||||
//Константы.TwitterToken.Установить(ОтветТокен["access_token"]);
|
||||
|
||||
Возврат ОтветТокен;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область Твиты
|
||||
|
||||
// Создать произвольный твит.
|
||||
//
|
||||
// Параметры:
|
||||
// Текст - Строка - Текст твита
|
||||
// МассивМедиа - Массив из Строка,ДвоичныеДанные - Массив двоичных данных или путей к файлам
|
||||
// МассивВариантовОпроса - Массив из Строка - Массив вариантов опроса, если необходимо
|
||||
// ДлительностьОпроса - Строка,Число - Длительность опроса, если необходимо (опрос без длительности не создается)
|
||||
// Параметры - Соответствие из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать произвольный твит
|
||||
//@skip-check method-too-many-params
|
||||
Функция СоздатьПроизвольныйТвит(Знач Текст = ""
|
||||
, Знач МассивМедиа = ""
|
||||
, Знач МассивВариантовОпроса = ""
|
||||
, Знач ДлительностьОпроса = ""
|
||||
, Знач Параметры = "") Экспорт
|
||||
|
||||
ДлительностьОпроса = OPI_Инструменты.ЧислоВСтроку(ДлительностьОпроса);
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
URL = "https://api.twitter.com/2/tweets";
|
||||
|
||||
Если Не ТипЗнч(МассивМедиа) = Тип("Массив") Тогда
|
||||
МассивМедиа_ = Новый Массив;
|
||||
|
||||
Если ЗначениеЗаполнено(МассивМедиа) Тогда
|
||||
МассивМедиа_.Добавить(МассивМедиа);
|
||||
КонецЕсли;
|
||||
|
||||
МассивМедиа = МассивМедиа_;
|
||||
КонецЕсли;
|
||||
|
||||
Поля = Новый Соответствие;
|
||||
|
||||
Если ЗначениеЗаполнено(Текст) Тогда
|
||||
Поля.Вставить("text", Текст);
|
||||
КонецЕсли;
|
||||
|
||||
Если ТипЗнч(МассивВариантовОпроса) = Тип("Массив") И ЗначениеЗаполнено(ДлительностьОпроса) Тогда
|
||||
Если МассивВариантовОпроса.Количество()> 0 Тогда
|
||||
Поля.Вставить("poll"
|
||||
, Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса));
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Если ТипЗнч(МассивМедиа) = Тип("Массив") Тогда
|
||||
Если МассивМедиа.Количество() > 0 Тогда
|
||||
Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа));
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
|
||||
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создать текстовый твит.
|
||||
//
|
||||
// Параметры:
|
||||
// Текст - Строка - Текст твита
|
||||
// Параметры - Соответствие из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать текстовый твит
|
||||
Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры);
|
||||
КонецФункции
|
||||
|
||||
// Создать твит картинки.
|
||||
//
|
||||
// Параметры:
|
||||
// Текст - Строка - Текст твита
|
||||
// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив двоичных данных или путей к картинкам
|
||||
// Параметры - Соответствие из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит картинки
|
||||
Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт
|
||||
|
||||
МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры);
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создать твит гифки.
|
||||
//
|
||||
// Параметры:
|
||||
// Текст - Строка - Текст твита
|
||||
// МассивГифок - Массив из Строка,ДвоичныеДанные - Массив двоичных данных или путей к гифкам
|
||||
// Параметры - Соответствие из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит гифки
|
||||
Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт
|
||||
|
||||
МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры);
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создать твит видео.
|
||||
//
|
||||
// Параметры:
|
||||
// Текст - Строка - Текст твита
|
||||
// МассивВидео - Массив из Строка,ДвоичныеДанные - Массив двоичных данных или путей к видео
|
||||
// Параметры - Соответствие из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит видео
|
||||
Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт
|
||||
|
||||
МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры);
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создать твит опрос.
|
||||
//
|
||||
// Параметры:
|
||||
// Текст - Строка - Текст твита
|
||||
// МассивВариантов - Массив из Строка - Массив вариантов опроса
|
||||
// Длительность - Строка,Число - Длительность опроса
|
||||
// Параметры - Соответствие из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Создать твит опрос
|
||||
Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт
|
||||
Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры);
|
||||
КонецФункции
|
||||
|
||||
// Загрузить массив вложений.
|
||||
//
|
||||
// Параметры:
|
||||
// МассивФайлов - Массив из Строка, ДвоичныеДанные - Массив файлов
|
||||
// ТипВложений - Строка - Тип вложений
|
||||
// Параметры - Соответствие из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Массив Из Строка - Массив ID медиа
|
||||
Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт
|
||||
|
||||
МассивМедиа = Новый Массив;
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
Если ЗначениеЗаполнено(МассивФайлов) Тогда
|
||||
|
||||
Если Не ТипЗнч(МассивФайлов) = Тип("Массив") Тогда
|
||||
МассивФайлов_ = Новый Массив;
|
||||
МассивФайлов_.Добавить(МассивФайлов);
|
||||
МассивФайлов = МассивФайлов_;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Для Каждого ФайлОтправки Из МассивФайлов Цикл
|
||||
|
||||
Если Не ТипЗнч(ФайлОтправки) = Тип("ДвоичныеДанные") Тогда
|
||||
ФайлОтправки = Новый ДвоичныеДанные(ФайлОтправки);
|
||||
КонецЕсли;
|
||||
|
||||
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, Поля, Авторизация, Ложь);
|
||||
|
||||
Иначе
|
||||
|
||||
ЧтениеДанных = Новый ЧтениеДанных(Файл);
|
||||
МассивЧтения = ЧтениеДанных.РазделитьНаЧастиПо(4*1024*1024);
|
||||
|
||||
Поля = Новый Структура;
|
||||
Поля.Вставить("command" , "INIT");
|
||||
Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер));
|
||||
Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип));
|
||||
Поля.Вставить("media_category" , Тип);
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, "POST", URL);
|
||||
|
||||
ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
|
||||
KeyИнициализации = ОтветИнициализации["media_key"];
|
||||
IDИнициализации = ОтветИнициализации["media_id_string"];
|
||||
Счетчик = 0;
|
||||
|
||||
Для Каждого Часть Из МассивЧтения Цикл
|
||||
|
||||
ДвоичныеЧасти = Часть.ПолучитьДвоичныеДанные();
|
||||
|
||||
Поля = Новый Структура;
|
||||
Поля.Вставить("command" , "APPEND");
|
||||
Поля.Вставить("media_key" , KeyИнициализации);
|
||||
Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик));
|
||||
Поля.Вставить("media" , ДвоичныеЧасти);
|
||||
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Новый Структура, "POST", URL);
|
||||
|
||||
OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация);
|
||||
|
||||
Счетчик = Счетчик + 1;
|
||||
КонецЦикла;
|
||||
|
||||
Поля = Новый Структура;
|
||||
Поля.Вставить("command" , "FINALIZE");
|
||||
Поля.Вставить("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" Тогда
|
||||
ВызватьИсключение "Твиттер не смог обработать загруженное вами видео";
|
||||
КонецЕсли;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
|
||||
|
||||
//Здесь собрано определение данных, необходимых для работы.
|
||||
//Для Twitter это довольно значительный набор, что обсуловлено наличием сразу 2-х API,
|
||||
//которые, при этом, созданы не для разныз задач, но просто являются версиями друг друга.
|
||||
//Актуальной версией API является v2 и она требует получения временных токенов. Несмотря на то,
|
||||
//что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести
|
||||
//механизм загрузки файлов и некоторые другие из старой версии - v1.1. Поэтому что-то нужно делать
|
||||
//на версии 1.1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1.1,
|
||||
//но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные
|
||||
|
||||
//Мировая гигокорпорация Илона Маска, кстати, напоминаю ;)
|
||||
|
||||
//P.S Далее часто упоминается "страница настроек Twitter Developer" - это
|
||||
//https://developer.twitter.com/en/portal/dashboard и выбор конкретного проекта из списка (значек c ключем)
|
||||
|
||||
Параметры_ = Новый Соответствие;
|
||||
|
||||
Разрешения = "tweet.read tweet.write tweet.moderate.write users.read "
|
||||
+ "follows.read follows.write offline.access space.read mute.read "
|
||||
+ "mute.write like.read like.write list.read list.write block.read "
|
||||
+ "block.write bookmark.read bookmark.write";
|
||||
|
||||
|
||||
//Данные для API v2
|
||||
|
||||
//redirect_uri - URL вашего http-сервиса (или другого обработчика запросов) для авторизации
|
||||
//scope - набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен
|
||||
//client_id - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
|
||||
//client_secret - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
|
||||
//access_token - ПолучитьСсылкуАвторизации() -> Браузер -> http-запрос с code придет на адрес redirect_uri -> ПолучитьТокен(code)
|
||||
//refresh_token - Приходит вместе с access_token и используется для его обновления (время жизни access_token - 2 часа).
|
||||
// Обновление происходит методом ОбновитьТокен с новыми access_token и refresh_token. При следующем обновлении
|
||||
// нужно использовать уже новый refresh_token, так что захардкодить не получится (access_token тоже не получится)
|
||||
|
||||
// |--> ОбновитьТокен() ->|access_token --> Используется в т-нии 2-х часов для запросов
|
||||
// | |refresh_token --|
|
||||
// |--------[через 2 ч.]-------------------|
|
||||
|
||||
|
||||
//Данные для 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_consumer_key - из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
|
||||
//oauth_consumer_secret - из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
|
||||
|
||||
//Эти токены обновлять не надо
|
||||
|
||||
Параметры_.Вставить("redirect_uri" , "");
|
||||
Параметры_.Вставить("scope" , Разрешения);
|
||||
Параметры_.Вставить("client_id" , "");
|
||||
Параметры_.Вставить("client_secret" , "");
|
||||
Параметры_.Вставить("access_token" , ""); //Должно быть нечто вроде Константы.TwitterToken.Получить()
|
||||
Параметры_.Вставить("refresh_token" , ""); //Должно быть нечто вроде Константы.TwitterRefresh.Получить()
|
||||
Параметры_.Вставить("oauth_token" , "");
|
||||
Параметры_.Вставить("oauth_token_secret" , "");
|
||||
Параметры_.Вставить("oauth_consumer_key" , "");
|
||||
Параметры_.Вставить("oauth_consumer_secret", "");
|
||||
|
||||
Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда
|
||||
Для Каждого ПереданныйПараметр Из Параметры Цикл
|
||||
Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
|
||||
КонецЦикла;
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Параметры_;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL)
|
||||
|
||||
ЗаголовокАвторизации = "";
|
||||
МетодХэширования = "HMAC-SHA1";
|
||||
ВерсияАпи = "1.0";
|
||||
СтрокаСигнатуры = "";
|
||||
Подпись = "";
|
||||
ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДатаСеанса());
|
||||
ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
|
||||
ТаблицаПараметров = Новый ТаблицаЗначений;
|
||||
ТаблицаПараметров.Колонки.Добавить("Ключ");
|
||||
ТаблицаПараметров.Колонки.Добавить("Значение");
|
||||
|
||||
Для Каждого Поле Из Поля Цикл
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = Поле.Ключ;
|
||||
НоваяСтрока.Значение = Поле.Значение;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = "oauth_consumer_key";
|
||||
НоваяСтрока.Значение = Параметры["oauth_consumer_key"];
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = "oauth_token";
|
||||
НоваяСтрока.Значение = Параметры["oauth_token"];
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = "oauth_version";
|
||||
НоваяСтрока.Значение = ВерсияАпи;
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = "oauth_signature_method";
|
||||
НоваяСтрока.Значение = МетодХэширования;
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = "oauth_timestamp";
|
||||
НоваяСтрока.Значение = ТекущаяДатаUNIX;
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = "oauth_nonce";
|
||||
НоваяСтрока.Значение = ТекущаяДатаUNIX;
|
||||
|
||||
Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
|
||||
|
||||
СтрокаТаблицы.Ключ = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL);
|
||||
СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
ТаблицаПараметров.Сортировать("Ключ");
|
||||
|
||||
Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
|
||||
|
||||
СтрокаСигнатуры = СтрокаСигнатуры
|
||||
+ СтрокаТаблицы.Ключ
|
||||
+ "="
|
||||
+ СтрокаТаблицы.Значение
|
||||
+ "&";
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1);
|
||||
СтрокаСигнатуры = вРег(ВидЗапроса)
|
||||
+ "&"
|
||||
+ КодироватьСтроку(URL, СпособКодированияСтроки.КодировкаURL)
|
||||
+ "&"
|
||||
+ КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL);
|
||||
|
||||
Подпись = КодироватьСтроку(Параметры["oauth_consumer_secret"], СпособКодированияСтроки.КодировкаURL)
|
||||
+ "&"
|
||||
+ КодироватьСтроку(Параметры["oauth_token_secret"], СпособКодированияСтроки.КодировкаURL);
|
||||
|
||||
|
||||
Сигнатура = OPI_Криптография.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Подпись)
|
||||
, ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры)
|
||||
, ХешФункция.SHA1
|
||||
, 64);
|
||||
|
||||
Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL);
|
||||
|
||||
ЗаголовокАвторизации = ЗаголовокАвторизации
|
||||
+ "OAuth "
|
||||
+ "oauth_consumer_key=""" + Параметры["oauth_consumer_key"] + ""","
|
||||
+ "oauth_token=""" + Параметры["oauth_token"] + ""","
|
||||
+ "oauth_signature_method=""" + МетодХэширования + ""","
|
||||
+ "oauth_timestamp=""" + ТекущаяДатаUNIX + ""","
|
||||
+ "oauth_nonce=""" + ТекущаяДатаUNIX + ""","
|
||||
+ "oauth_version=""" + ВерсияАпи + ""","
|
||||
+ "oauth_signature=""" + Сигнатура;
|
||||
|
||||
СоответствиеЗаголовка = Новый Соответствие;
|
||||
СоответствиеЗаголовка.Вставить("authorization", ЗаголовокАвторизации);
|
||||
|
||||
Возврат СоответствиеЗаголовка;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры)
|
||||
|
||||
СоответствиеВозврата = Новый Соответствие;
|
||||
СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]);
|
||||
|
||||
Возврат СоответствиеВозврата;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="31cd7c60-0873-4333-99c1-fc4807082ea9">
|
||||
<name>OPI_Twitter</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>OPI twitter</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
||||
@@ -1,899 +0,0 @@
|
||||
//MIT License
|
||||
|
||||
//Copyright (c) 2023 Anton Tsitavets
|
||||
|
||||
//Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
//of this software and associated documentation files (the "Software"), to deal
|
||||
//in the Software without restriction, including without limitation the rights
|
||||
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
//copies of the Software, and to permit persons to whom the Software is
|
||||
//furnished to do so, subject to the following conditions:
|
||||
|
||||
//The above copyright notice and this permission notice shall be included in all
|
||||
//copies or substantial portions of the Software.
|
||||
|
||||
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
//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
|
||||
//SOFTWARE.
|
||||
|
||||
//https://github.com/Bayselonarrend/OpenIntegrations
|
||||
//Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
|
||||
//и почитать комментарии
|
||||
|
||||
#Область ПрограммныйИнтерфейс
|
||||
|
||||
#Область ПолучениеТокена
|
||||
|
||||
// Получение ссылки для интерактивного получения токена (access_token), который необходим
|
||||
// для дальнейших действий
|
||||
//
|
||||
// Параметры:
|
||||
// app_id - Строка,Число - app_id из настроек приложения
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка - URL, по которому необходимо перейти в браузере
|
||||
Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт
|
||||
|
||||
//access_token нужно будет забрать из параметра в строке адреса браузера
|
||||
Возврат "https://oauth.vk.com/authorize?client_id=" + OPI_Инструменты.ЧислоВСтроку(App_id)
|
||||
+ "&scope=offline,wall,groups,photos,stats,stories,ads"
|
||||
+ "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html";
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область РаботаСГруппой
|
||||
|
||||
// Создать пост.
|
||||
//
|
||||
// Параметры:
|
||||
// Текст - Строка - Текст
|
||||
// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив картинок
|
||||
// Рекламный - Булево - Признак "Это реклама"
|
||||
// СсылкаПодЗаписью - Строка - Ссылка под записью, если нужна
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция СоздатьПост(Знач Текст
|
||||
, Знач МассивКартинок
|
||||
, Знач Рекламный = Ложь
|
||||
, Знач СсылкаПодЗаписью = ""
|
||||
, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
СтрокаВложений = "";
|
||||
|
||||
Для Каждого КартинкаПоста Из МассивКартинок Цикл
|
||||
|
||||
Файлы = Новый Соответствие;
|
||||
|
||||
Если ТипЗнч(КартинкаПоста) = Тип("Строка") Тогда
|
||||
КлючКартинка = СтрЗаменить(КартинкаПоста, ".", "___");
|
||||
ЗначениеКартинка = Новый ДвоичныеДанные(КартинкаПоста);
|
||||
Иначе
|
||||
//@skip-check missing-temporary-file-deletion
|
||||
КлючКартинка = СтрЗаменить(ПолучитьИмяВременногоФайла("jpeg"), ".", "___");
|
||||
ЗначениеКартинка = КартинкаПоста;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Файлы.Вставить(КлючКартинка, ЗначениеКартинка);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.getWallUploadServer", Параметры_);
|
||||
URL = Ответ["response"]["upload_url"];
|
||||
|
||||
Параметры_.Вставить("upload_url", URL);
|
||||
|
||||
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы);
|
||||
СерверФото = OPI_Инструменты.ЧислоВСтроку(Ответ["server"]);
|
||||
|
||||
Параметры_.Вставить("hash" , Ответ["hash"]);
|
||||
Параметры_.Вставить("photo" , Ответ["photo"]);
|
||||
Параметры_.Вставить("server" , СерверФото);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.saveWallPhoto", Параметры_);
|
||||
ОтветСоответствие = Ответ.Получить("response")[0];
|
||||
|
||||
Параметры_.Удалить("hash");
|
||||
Параметры_.Удалить("photo");
|
||||
Параметры_.Удалить("server");
|
||||
|
||||
ФотоID = "photo"
|
||||
+ OPI_Инструменты.ЧислоВСтроку(ОтветСоответствие.Получить("owner_id"))
|
||||
+ "_"
|
||||
+ OPI_Инструменты.ЧислоВСтроку(ОтветСоответствие.Получить("id"));
|
||||
|
||||
СтрокаВложений = СтрокаВложений + ФотоID + ",";
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
СтрокаВложений = СтрокаВложений + СсылкаПодЗаписью;
|
||||
|
||||
Параметры_.Вставить("message" , Текст);
|
||||
Параметры_.Вставить("attachments" , СтрокаВложений);
|
||||
Параметры_.Вставить("mark_as_ads" , ?(Рекламный, 1, 0));
|
||||
Параметры_.Вставить("close_comments" , ?(Рекламный, 1, 0));
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Удалить пост.
|
||||
//
|
||||
// Параметры:
|
||||
// IDПоста - Строка,Число - ID поста
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция УдалитьПост(Знач IDПоста, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Параметры_.Вставить("post_id", OPI_Инструменты.ЧислоВСтроку(IDПоста));
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.delete", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создать опрос.
|
||||
//
|
||||
// Параметры:
|
||||
// Вопрос - Строка - Вопрос опроса
|
||||
// МассивОтветов - Массив из Строка - Массив вариантов ответа
|
||||
// Картинка - Строка,ДвоичныеДанные - Картинка опроса
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция СоздатьОпрос(Знач Вопрос, Знач МассивОтветов, Знач Картинка = "", Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/polls.getPhotoUploadServer", Параметры_);
|
||||
URL = Ответ["response"]["upload_url"];
|
||||
IDФото = "";
|
||||
|
||||
Параметры_.Вставить("upload_url", URL);
|
||||
|
||||
Если Не Картинка = "" Тогда
|
||||
|
||||
Если ТипЗнч(Картинка) = Тип("Строка") Тогда
|
||||
Путь = Картинка;
|
||||
Картинка = Новый ДвоичныеДанные(Картинка);
|
||||
Иначе
|
||||
//@skip-check missing-temporary-file-deletion
|
||||
Путь = ПолучитьИмяВременногоФайла("jpeg");
|
||||
КонецЕсли;
|
||||
|
||||
Файлы = Новый Соответствие;
|
||||
Файлы.Вставить(Путь, Картинка);
|
||||
|
||||
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы);
|
||||
|
||||
Параметры_.Вставить("hash" , Ответ["hash"]);
|
||||
Параметры_.Вставить("photo" , Ответ["photo"]);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/polls.savePhoto", Параметры_);
|
||||
IDФото = Ответ.Получить("response")["id"];
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Параметры_.Вставить("is_anonymous" , 1);
|
||||
Параметры_.Вставить("is_multiple" , 0);
|
||||
|
||||
Ответы = "[";
|
||||
Первый = Истина;
|
||||
|
||||
Для Каждого Ответ Из МассивОтветов Цикл
|
||||
|
||||
Если Первый Тогда
|
||||
Первый = Ложь
|
||||
Иначе
|
||||
Ответы = Ответы + ", ";
|
||||
КонецЕсли;
|
||||
|
||||
Ответы = Ответы + """"+ Ответ + """";
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Ответы = Ответы + "]";
|
||||
|
||||
Параметры_.Вставить("add_answers" , Ответы);
|
||||
Параметры_.Вставить("photo_id" , OPI_Инструменты.ЧислоВСтроку(IDФото));
|
||||
Параметры_.Вставить("question" , Вопрос);
|
||||
|
||||
Опрос = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_);
|
||||
ОпросСоответствие = Опрос.Получить("response");
|
||||
|
||||
ОпросID = "poll"
|
||||
+ OPI_Инструменты.ЧислоВСтроку(ОпросСоответствие.Получить("owner_id"))
|
||||
+ "_"
|
||||
+ OPI_Инструменты.ЧислоВСтроку(ОпросСоответствие.Получить("id"));
|
||||
|
||||
|
||||
Параметры_.Вставить("attachments", ОпросID);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создать альбом.
|
||||
//
|
||||
// Параметры:
|
||||
// Наименование - Строка - Наименование альбома
|
||||
// Описание - Строка - Описание альбома
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция СоздатьАльбом(Знач Наименование, Знач Описание = "", Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
Параметры_.Вставить("title" , Наименование);
|
||||
Параметры_.Вставить("description" , Описание);
|
||||
Параметры_.Вставить("upload_by_admins_only", 1);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.createAlbum", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создать историю.
|
||||
//
|
||||
// Параметры:
|
||||
// Картинка - Строка,ДвоичныеДанные - Фон истории
|
||||
// URL - Строка - URL для кнопки под историей
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция СоздатьИсторию(Знач Картинка, Знач URL = "", Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Параметры_.Вставить("link_text" , "more");
|
||||
Параметры_.Вставить("link_url" , URL);
|
||||
Параметры_.Вставить("add_to_news" , "1");
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/stories.getPhotoUploadServer", Параметры_);
|
||||
URL = Ответ["response"]["upload_url"];
|
||||
|
||||
Параметры_.Вставить("upload_url", URL);
|
||||
|
||||
Если ТипЗнч(Картинка) = Тип("Строка") Тогда
|
||||
Путь = Картинка;
|
||||
Картинка = Новый ДвоичныеДанные(Картинка);
|
||||
Иначе
|
||||
//@skip-check missing-temporary-file-deletion
|
||||
Путь = ПолучитьИмяВременногоФайла("jpeg");
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Файлы = Новый Соответствие;
|
||||
Файлы.Вставить(Путь, Картинка);
|
||||
|
||||
Ответ = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы);
|
||||
Параметры_.Вставить("upload_results", Ответ["response"]["upload_result"]);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/stories.save", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Сохранить картинку в альбом.
|
||||
//
|
||||
// Параметры:
|
||||
// IDАльбома - Строка,Число - ID альбома
|
||||
// Картинка - ДвоичныеДанные,Строка - Двоичные данные или путь к картинке
|
||||
// Описание - Строка - Описание картинки
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция СохранитьКартинкуВАльбом(Знач IDАльбома, Знач Картинка, Знач Описание = "", Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
Параметры_.Вставить("album_id" , OPI_Инструменты.ЧислоВСтроку(IDАльбома));
|
||||
Параметры_.Вставить("caption" , Описание);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.getUploadServer", Параметры_);
|
||||
URL = Ответ["response"]["upload_url"];
|
||||
|
||||
Если ТипЗнч(Картинка) = Тип("Строка") Тогда
|
||||
Путь = Картинка;
|
||||
Картинка = Новый ДвоичныеДанные(Картинка);
|
||||
Иначе
|
||||
//@skip-check missing-temporary-file-deletion
|
||||
Путь = ПолучитьИмяВременногоФайла("jpeg");
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Файлы = Новый Соответствие;
|
||||
Файлы.Вставить(Путь, Картинка);
|
||||
|
||||
ОтветАльбома = OPI_Инструменты.PostMultipart(URL, Параметры_, Файлы);
|
||||
|
||||
Параметры_.Вставить("server" , OPI_Инструменты.ЧислоВСтроку(ОтветАльбома["server"]));
|
||||
Параметры_.Вставить("photos_list" , ОтветАльбома["photos_list"]);
|
||||
Параметры_.Вставить("hash" , ОтветАльбома["hash"]);
|
||||
Параметры_.Вставить("aid" , ОтветАльбома["aid"]);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.save", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Удалить картинку.
|
||||
//
|
||||
// Параметры:
|
||||
// IDКартинки - Строка,Число - ID картинки
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция УдалитьКартинку(Знач IDКартинки, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Параметры_.Вставить("photo_id", OPI_Инструменты.ЧислоВСтроку(IDКартинки));
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.delete", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область РаботаСОбсуждениями
|
||||
|
||||
// Создать обсуждение.
|
||||
//
|
||||
// Параметры:
|
||||
// Наименование - Строка - Наименование обсуждения
|
||||
// ТекстПервогоСообщения - Строка - Текст первого сообщения
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция СоздатьОбсуждение(Знач Наименование, Знач ТекстПервогоСообщения, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Параметры_.Вставить("title" , Наименование);
|
||||
Параметры_.Вставить("text" , ТекстПервогоСообщения);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/board.addTopic", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Закрыть обсуждение.
|
||||
//
|
||||
// Параметры:
|
||||
// IDОбсуждения - Строка,Число - ID обсуждения
|
||||
// УдалитьПолностью - Булево - Удалить полностью или закрыть (сделать неактивным)
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Закрыть обсуждение
|
||||
Функция ЗакрытьОбсуждение(Знач IDОбсуждения, Знач УдалитьПолностью = Ложь, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Параметры_.Вставить("topic_id", OPI_Инструменты.ЧислоВСтроку(IDОбсуждения));
|
||||
|
||||
Метод = ?(УдалитьПолностью, "deleteTopic", "closeTopic");
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/board." + Метод, Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Открыть обсуждение.
|
||||
//
|
||||
// Параметры:
|
||||
// IDОбсуждения - Строка,Число - ID обсуждения
|
||||
// Параметры - Структура из Строка - См. ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция ОткрытьОбсуждение(Знач IDОбсуждения, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Параметры_.Вставить("topic_id", OPI_Инструменты.ЧислоВСтроку(IDОбсуждения));
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/board.openTopic", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Написать в обсуждение.
|
||||
//
|
||||
// Параметры:
|
||||
// IDОбсуждения - Строка,Число - ID обсуждения
|
||||
// Текст - Строка - Текст сообщения
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция НаписатьВОбсуждение(Знач IDОбсуждения, Знач Текст, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Параметры_.Вставить("topic_id" , OPI_Инструменты.ЧислоВСтроку(IDОбсуждения));
|
||||
Параметры_.Вставить("message" , Текст);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/board.createComment", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область ИнтерактивныеДействия
|
||||
|
||||
// Поставить лайк.
|
||||
//
|
||||
// Параметры:
|
||||
// IDПоста - Строка,Число - ID поста
|
||||
// IDСтены - Строка,Число - ID стены расположения поста
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция ПоставитьЛайк(Знач IDПоста, Знач 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", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Сделать репост.
|
||||
//
|
||||
// Параметры:
|
||||
// IDПоста - Строка,Число - ID поста
|
||||
// IDСтены - Строка,Число - ID стены расположения поста
|
||||
// ЦелеваяСтена - Строка,Число - ID целевой стены/группы
|
||||
// Рекламный - Булево - Признак рекламного поста
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
//@skip-check method-too-many-params
|
||||
Функция СделатьРепост(Знач IDПоста
|
||||
, Знач IDСтены = ""
|
||||
, Знач ЦелеваяСтена = ""
|
||||
, Знач Рекламный = Ложь
|
||||
, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
Источник = ?(ЗначениеЗаполнено(IDСтены)
|
||||
, OPI_Инструменты.ЧислоВСтроку(IDСтены)
|
||||
, OPI_Инструменты.ЧислоВСтроку(Параметры_["owner_id"]));
|
||||
|
||||
Приемник = ?(ЗначениеЗаполнено(ЦелеваяСтена)
|
||||
, СтрЗаменить(OPI_Инструменты.ЧислоВСтроку(ЦелеваяСтена), "-", "")
|
||||
, OPI_Инструменты.ЧислоВСтроку(Параметры_["group_id"]));
|
||||
|
||||
Параметры_.Вставить("object" , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста));
|
||||
Параметры_.Вставить("group_id" , Приемник);
|
||||
Параметры_.Вставить("mark_as_ads" , ?(Рекламный, 1, 0));
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.repost", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Написать сообщение.
|
||||
//
|
||||
// Параметры:
|
||||
// Текст - Строка - Текст сообщения
|
||||
// IDПользователя - Строка - ID пользователя-адресата
|
||||
// Communitytoken - Строка - Токен бота чата сообщества, котрый можно получить в настройках
|
||||
// Клавиатура - Строка - JSON клавиатуры. См.СформироватьКлавиатуру
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция НаписатьСообщение(Знач Текст
|
||||
, Знач IDПользователя
|
||||
, Знач Communitytoken
|
||||
, Знач Клавиатура = ""
|
||||
, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Параметры_.Вставить("access_token", Communitytoken);
|
||||
|
||||
Параметры_.Вставить("user_id" , OPI_Инструменты.ЧислоВСтроку(IDПользователя));
|
||||
Параметры_.Вставить("peer_id" , OPI_Инструменты.ЧислоВСтроку(IDПользователя));
|
||||
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||
Параметры_.Вставить("random_id" , 0);
|
||||
Параметры_.Вставить("message" , Текст);
|
||||
|
||||
Если ЗначениеЗаполнено(Клавиатура) Тогда
|
||||
Параметры_.Вставить("keyboard", Клавиатура);
|
||||
КонецЕсли;
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/messages.send", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Написать комментарий.
|
||||
//
|
||||
// Параметры:
|
||||
// IDПоста - Строка,Число - ID целевого поста
|
||||
// IDСтены - Строка,Число - ID стены расположения поста
|
||||
// Текст - Строка - Текст комментария
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера
|
||||
Функция НаписатьКомментарий(Знач IDПоста, Знач IDСтены, Знач Текст, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
Параметры_.Вставить("owner_id", OPI_Инструменты.ЧислоВСтроку(IDСтены));
|
||||
Параметры_.Вставить("from_group" , OPI_Инструменты.ЧислоВСтроку(Параметры_["group_id"]));
|
||||
Параметры_.Вставить("post_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста));
|
||||
Параметры_.Вставить("message" , Текст);
|
||||
|
||||
Параметры_.Удалить("group_id");
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.createComment", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Сократить ссылку.
|
||||
//
|
||||
// Параметры:
|
||||
// URL - Строка - URL для сокращения
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка - Сокращенный URL
|
||||
Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Параметры_.Вставить("url", URL);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_);
|
||||
|
||||
Возврат Ответ["response"]["short_url"];
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область Статистика
|
||||
|
||||
// Получить статистику.
|
||||
//
|
||||
// Параметры:
|
||||
// ДатаНачала - Дата - Дата начала периода
|
||||
// ДатаОкончания - Дата - Дата окончания периода
|
||||
// Параметры - Структура из Строка - Параметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция ПолучитьСтатистику(Знач ДатаНачала, Знач ДатаОкончания, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
ДатаНачала = Формат(ДатаНачала - Дата(1970,1,1,1,0,0), "ЧГ=0");
|
||||
ДатаОкончания = Формат(ДатаОкончания - дата(1970,1,1,1,0,0), "ЧГ=0");
|
||||
|
||||
Параметры_.Вставить("timestamp_from" , ДатаНачала);
|
||||
Параметры_.Вставить("timestamp_to" , ДатаОкончания);
|
||||
Параметры_.Вставить("stats_groups" , "visitors, reach, activity");
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/stats.get", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Получить статистику постов.
|
||||
//
|
||||
// Параметры:
|
||||
// МассивIDПостов - Массив из Строка,Число - Массив ID постов
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Массив из Произвольный - Массив данных статистики по постам
|
||||
Функция ПолучитьСтатистикуПостов(Знач МассивIDПостов, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
МассивОтветов = Новый Массив;
|
||||
МассивНабора = Новый Массив;
|
||||
|
||||
Для Каждого Пост Из МассивIDПостов Цикл
|
||||
|
||||
МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост));
|
||||
|
||||
Если МассивНабора.Количество() = 30 Тогда
|
||||
|
||||
СтрокаНомеров = СтрСоединить(МассивНабора, ",");
|
||||
Параметры_.Вставить("post_ids", СтрокаНомеров);
|
||||
|
||||
Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_);
|
||||
МассивСтатистики = Статистика["response"];
|
||||
|
||||
Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
|
||||
МассивОтветов.Добавить(ЭлементСтатистики);
|
||||
КонецЦикла;
|
||||
|
||||
МассивНабора = Новый Массив
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
СтрокаНомеров = СтрСоединить(МассивНабора, ",");
|
||||
Параметры_.Вставить("post_ids", СтрокаНомеров);
|
||||
|
||||
Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_);
|
||||
МассивСтатистики = Статистика["response"];
|
||||
|
||||
Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
|
||||
МассивОтветов.Добавить(ЭлементСтатистики);
|
||||
КонецЦикла;
|
||||
|
||||
Возврат МассивОтветов;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область РаботаСРекламнымКабинетом
|
||||
|
||||
// Создать рекламную кампанию.
|
||||
//
|
||||
// Параметры:
|
||||
// IDКабинета - Строка,Число - ID рекламного кабинета
|
||||
// Наименование - Строка - Наименование кампании
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера
|
||||
Функция СоздатьРекламнуюКампанию(Знач IDКабинета, Знач Наименование, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Параметры_.Вставить("account_id", OPI_Инструменты.ЧислоВСтроку(IDКабинета));
|
||||
|
||||
МассивСтруктур = Новый Массив;
|
||||
|
||||
СтруктураКампании = Новый Структура;
|
||||
СтруктураКампании.Вставить("type" , "promoted_posts");
|
||||
СтруктураКампании.Вставить("name" , Наименование);
|
||||
СтруктураКампании.Вставить("day_limit" , 0);
|
||||
СтруктураКампании.Вставить("all_limit" , 0);
|
||||
СтруктураКампании.Вставить("start_time" , Формат(ТекущаяДатаСеанса() - Дата(1970,1,1,1,0,0), "ЧГ=0"));
|
||||
СтруктураКампании.Вставить("stop_time" , Формат(ДобавитьМесяц(ТекущаяДатаСеанса(), 24) - Дата(1970,1,1,1,0,0), "ЧГ=0"));
|
||||
СтруктураКампании.Вставить("status" , 1);
|
||||
|
||||
МассивСтруктур.Добавить(СтруктураКампании);
|
||||
|
||||
JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур);
|
||||
|
||||
Параметры_.Вставить("data", JSONДата);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createCampaigns", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создать рекламное объявление.
|
||||
//
|
||||
// Параметры:
|
||||
// НомерКампании - Строка,Число - ID рекламной кампании
|
||||
// ДневнойЛимит - Строка,Число - Дневной лимит в рублях
|
||||
// НомерКатегории - Строка,Число - Номер рекламной категории
|
||||
// IDПоста - Строка,Число - ID поста, используемого в качетсве рекламы
|
||||
// IDКабинета - Строка,Число - ID рекламного кабинета
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция СоздатьРекламноеОбъявление(Знач НомерКампании
|
||||
, Знач ДневнойЛимит
|
||||
, Знач НомерКатегории
|
||||
, Знач IDПоста
|
||||
, Знач IDКабинета
|
||||
, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Линк = "https://vk.com/wall-"
|
||||
+ Параметры_["group_id"]
|
||||
+ "_"
|
||||
+ OPI_Инструменты.ЧислоВСтроку(IDПоста);
|
||||
|
||||
МассивСтруктур = Новый Массив;
|
||||
СтруктураКампании = Новый Структура;
|
||||
СтруктураКампании.Вставить("campaign_id" , OPI_Инструменты.ЧислоВСтроку(НомерКампании));
|
||||
СтруктураКампании.Вставить("ad_format" , 9);
|
||||
СтруктураКампании.Вставить("conversion_event_id" , 1);
|
||||
СтруктураКампании.Вставить("autobidding" , 1);
|
||||
СтруктураКампании.Вставить("cost_type" , 3);
|
||||
СтруктураКампании.Вставить("goal_type" , 2);
|
||||
СтруктураКампании.Вставить("ad_platform" , "all");
|
||||
СтруктураКампании.Вставить("publisher_platforms" , "vk");
|
||||
СтруктураКампании.Вставить("publisher_platforms_auto" , "1");
|
||||
СтруктураКампании.Вставить("day_limit" , OPI_Инструменты.ЧислоВСтроку(ДневнойЛимит));
|
||||
СтруктураКампании.Вставить("all_limit" , "0");
|
||||
СтруктураКампании.Вставить("category1_id" , OPI_Инструменты.ЧислоВСтроку(НомерКатегории));
|
||||
СтруктураКампании.Вставить("age_restriction" , 0);
|
||||
СтруктураКампании.Вставить("status" , 1);
|
||||
СтруктураКампании.Вставить("name" , "Объявление");
|
||||
СтруктураКампании.Вставить("link_url" , Линк);
|
||||
|
||||
МассивСтруктур.Добавить(СтруктураКампании);
|
||||
|
||||
JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур);
|
||||
|
||||
Параметры_.Вставить("data" , JSONДата);
|
||||
Параметры_.Вставить("account_id" , OPI_Инструменты.ЧислоВСтроку(IDКабинета));
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createAds", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Приостановить рекламное объявление.
|
||||
//
|
||||
// Параметры:
|
||||
// IDКабинета - Строка,Число - ID рекламного кабинета
|
||||
// IDОбъявления - Строка,Число - ID объявления
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера ВК
|
||||
Функция ПриостановитьРекламноеОбъявление(Знач IDКабинета, Знач IDОбъявления, Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
|
||||
Параметры_.Вставить("account_id", OPI_Инструменты.ЧислоВСтроку(IDКабинета));
|
||||
|
||||
МассивСтруктур = Новый Массив;
|
||||
СтруктураКампании = Новый Структура;
|
||||
СтруктураКампании.Вставить("ad_id" , OPI_Инструменты.ЧислоВСтроку(IDОбъявления));
|
||||
СтруктураКампании.Вставить("status" , 0);
|
||||
|
||||
МассивСтруктур.Добавить(СтруктураКампании);
|
||||
|
||||
JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур);
|
||||
|
||||
Параметры_.Вставить("data", JSONДата);
|
||||
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.updateAds", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Получить список рекламных категорий.
|
||||
//
|
||||
// Параметры:
|
||||
// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, Произвольный, Неопределено, ДвоичныеДанные - Список рекламных категорий
|
||||
Функция ПолучитьСписокРекламныхКатегорий(Знач Параметры = "") Экспорт
|
||||
|
||||
Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
|
||||
Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область Прочие
|
||||
|
||||
// Сформировать клавиатуру.
|
||||
//
|
||||
// Параметры:
|
||||
// МассивКнопок - Массив из Строка - Массив заголовков кнопок
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка - JSON клавиатуры
|
||||
Функция СформироватьКлавиатуру(Знач МассивКнопок) Экспорт
|
||||
|
||||
Клавиатура = Новый Структура;
|
||||
МассивКлавиатуры = Новый Массив;
|
||||
МассивБлока = Новый Массив;
|
||||
|
||||
Для Каждого Действие Из МассивКнопок Цикл
|
||||
|
||||
Кнопка = Новый Структура;
|
||||
Выражение = Новый Структура;
|
||||
|
||||
Выражение.Вставить("type" , "text");
|
||||
Выражение.Вставить("label", Действие);
|
||||
|
||||
Кнопка.Вставить("action", Выражение);
|
||||
МассивБлока.Добавить(Кнопка);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
МассивКлавиатуры.Добавить(МассивБлока);
|
||||
|
||||
Клавиатура.Вставить("buttons" , МассивКлавиатуры);
|
||||
Клавиатура.Вставить("one_time", Ложь);
|
||||
|
||||
Возврат OPI_Инструменты.JSONСтрокой(Клавиатура);
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
|
||||
|
||||
//Здесь собрано определение данных для работы с VK API
|
||||
//Вы можете переопределять их, передавая в качестве параметра
|
||||
//Совпадающие поля будут перезаписаны с приоритетом параметра функции
|
||||
|
||||
Параметры_ = Новый Структура;
|
||||
|
||||
//access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена()
|
||||
//from_group - действия будут выполняться от лица группы
|
||||
//owner_id - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был
|
||||
// установлен свой
|
||||
//app_id - id приложения, которое необходимо создать в профиле на странице для разработчиков
|
||||
//group_id - owner_id, но без "-"
|
||||
|
||||
Параметры_.Вставить("access_token" , "");
|
||||
Параметры_.Вставить("from_group" , "1");
|
||||
Параметры_.Вставить("owner_id" , "");
|
||||
Параметры_.Вставить("v" , "5.131");
|
||||
Параметры_.Вставить("app_id" , "");
|
||||
Параметры_.Вставить("group_id" , "");
|
||||
|
||||
Если ТипЗнч(Параметры) = Тип("Структура") Тогда
|
||||
Для Каждого ПереданныйПараметр Из Параметры Цикл
|
||||
Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
|
||||
КонецЦикла;
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Параметры_;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="6f0e845c-2d21-430f-954a-34a96d2dad3c">
|
||||
<name>OPI_VK</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Методы интеграции с VK (ОПИ)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
||||
@@ -1,392 +0,0 @@
|
||||
//MIT License
|
||||
|
||||
//Copyright (c) 2023 Anton Tsitavets
|
||||
|
||||
//Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
//of this software and associated documentation files (the "Software"), to deal
|
||||
//in the Software without restriction, including without limitation the rights
|
||||
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
//copies of the Software, and to permit persons to whom the Software is
|
||||
//furnished to do so, subject to the following conditions:
|
||||
|
||||
//The above copyright notice and this permission notice shall be included in all
|
||||
//copies or substantial portions of the Software.
|
||||
|
||||
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
//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
|
||||
//SOFTWARE.
|
||||
|
||||
//https://github.com/Bayselonarrend/OpenIntegrations
|
||||
#Область ПрограммныйИнтерфейс
|
||||
|
||||
#Область НастройкиИИнформация
|
||||
|
||||
// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL,
|
||||
// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована
|
||||
// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях
|
||||
// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен Viber
|
||||
// URL - Строка - URL для установки Webhook
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный - Ответ сервера Viber
|
||||
Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
|
||||
|
||||
СтруктураПараметров = Новый Структура;
|
||||
СтруктураПараметров.Вставить("url" , URL);
|
||||
СтруктураПараметров.Вставить("auth_token", Токен);
|
||||
|
||||
Возврат OPI_Инструменты.Post("https://chatapi.viber.com/pa/set_webhook"
|
||||
, СтруктураПараметров);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook
|
||||
// ID пользователя из информации о канале не подойдет для отправки сообщений через бота - они разные
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные, Неопределено, Произвольный - Получить информацию о канале
|
||||
Функция ПолучитьИнформациюОКанале(Знач Токен) Экспорт
|
||||
|
||||
Возврат OPI_Инструменты.Get("https://chatapi.viber.com/pa/get_account_info"
|
||||
,
|
||||
, ТокенВЗаголовки(Токен));
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Получить данные пользователя.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// IDПользователя - Строка, Число - ID пользователя Viber
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Ответ сервера Viber
|
||||
Функция ПолучитьДанныеПользователя(Знач Токен, Знач IDПользователя) Экспорт
|
||||
|
||||
СтруктураПараметров = Новый Структура;
|
||||
СтруктураПараметров.Вставить("id", IDПользователя);
|
||||
|
||||
Ответ = OPI_Инструменты.Post("https://chatapi.viber.com/pa/get_user_details"
|
||||
, СтруктураПараметров
|
||||
, ТокенВЗаголовки(Токен));
|
||||
|
||||
Попытка
|
||||
Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
|
||||
Исключение
|
||||
Возврат Ответ;
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Получить онлайн пользователей.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен Viber
|
||||
// IDПользователей - Строка,Число,Массив из Строка,Число - ID пользователей(-я) Viber
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Ответ сервера Viber
|
||||
Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт
|
||||
|
||||
Если Не ТипЗнч(IDПользователей) = Тип("Массив") Тогда
|
||||
|
||||
ОдиночныйID = IDПользователей;
|
||||
IDПользователей = Новый Массив;
|
||||
IDПользователей.Добавить(ОдиночныйID);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
СтруктураПараметров = Новый Структура;
|
||||
СтруктураПараметров.Вставить("ids", IDПользователей);
|
||||
|
||||
Ответ = OPI_Инструменты.Post("https://chatapi.viber.com/pa/get_online"
|
||||
, СтруктураПараметров
|
||||
, ТокенВЗаголовки(Токен));
|
||||
|
||||
Попытка
|
||||
Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
|
||||
Исключение
|
||||
Возврат Ответ;
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область ОтправкаСообщений
|
||||
|
||||
// Отправить текстовое сообщение.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// Текст - Строка - Текст сообщения
|
||||
// IDПользователя - Строка,Число - ID пользователя Viber
|
||||
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота
|
||||
// Клавиатура - Структура из Строка - См. СформироватьКлавиатуруИзМассиваКнопок
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Ответ сервера Viber
|
||||
Функция ОтправитьТекстовоеСообщение(Знач Токен, Знач Текст, Знач IDПользователя, Знач ОтправкаВКанал, Знач Клавиатура = "") Экспорт
|
||||
|
||||
Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить картинку.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// URL - Строка - URL картинки
|
||||
// IDПользователя - Строка,Число - ID пользователя Viber
|
||||
// ОтправкаВКанал - булево - Отправка в канал или в чат бота
|
||||
// Описание - Строка - Аннотация к картинке
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Ответ сервера Viber
|
||||
Функция ОтправитьКартинку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Описание = "") Экспорт
|
||||
|
||||
Возврат ОтправитьСообщение(Токен, "picture", IDПользователя, ОтправкаВКанал, URL, Описание);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить файл.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// URL - Строка - URL
|
||||
// IDПользователя - Строка,Число - ID пользователя Viber
|
||||
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота
|
||||
// Расширение - Строка - Расширение файла
|
||||
// Размер - Число - Размер файла. Если не заполнен - определяется автоматически, но при этом происходит скачивание
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Ответ сервера Viber
|
||||
Функция ОтправитьФайл(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Расширение, Знач Размер = "") Экспорт
|
||||
|
||||
Если Не ЗначениеЗаполнено(Размер) Тогда
|
||||
|
||||
Ответ = OPI_Инструменты.Get(URL);
|
||||
ИВФ = ПолучитьИмяВременногоФайла(Расширение);
|
||||
Ответ.Записать(ИВФ);
|
||||
|
||||
ВремФайл = Новый Файл(ИВФ);
|
||||
Размер = ВремФайл.Размер();
|
||||
УдалитьФайлы(ИВФ);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Расширение = СтрЗаменить(Расширение, ".", "");
|
||||
|
||||
СтруктураЗначения = Новый Структура;
|
||||
СтруктураЗначения.Вставить("URL" , URL);
|
||||
СтруктураЗначения.Вставить("Размер" , Размер);
|
||||
СтруктураЗначения.Вставить("Расширение" , Расширение);
|
||||
|
||||
Возврат ОтправитьСообщение(Токен, "file", IDПользователя, ОтправкаВКанал, СтруктураЗначения);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить контакт.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// ИмяКонтакта - Строка - Имя контакта
|
||||
// НомерТелефона - Строка - Номер телефона
|
||||
// IDПользователя - Строка - ID пользователя Viber
|
||||
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Ответ сервера Viber
|
||||
Функция ОтправитьКонтакт(Знач Токен, Знач ИмяКонтакта, Знач НомерТелефона, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
|
||||
|
||||
СтруктураКонтакта = Новый Структура;
|
||||
СтруктураКонтакта.Вставить("name", ИмяКонтакта);
|
||||
СтруктураКонтакта.Вставить("phone_number", Строка(НомерТелефона));
|
||||
|
||||
Возврат ОтправитьСообщение(Токен, "contact", IDПользователя, ОтправкаВКанал, СтруктураКонтакта);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить локацию.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// Широта - Строка,Число - Географическая широта
|
||||
// Долгота - Строка,Число - Географическая долгота
|
||||
// IDПользователя - Строка,Число - ID пользователя Viber
|
||||
// ОтправкаВКанал - Булево - Отправка в канал или чат-боту
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Отправить локацию
|
||||
Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
|
||||
|
||||
СтруктураЛокации = Новый Структура;
|
||||
СтруктураЛокации.Вставить("lat", OPI_Инструменты.ЧислоВСтроку(Широта));
|
||||
СтруктураЛокации.Вставить("lon", OPI_Инструменты.ЧислоВСтроку(Долгота));
|
||||
|
||||
Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, СтруктураЛокации);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Отправить ссылку.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// URL - Строка - Отправляемая ссылка
|
||||
// IDПользователя - Строка,Число - IDПользователя
|
||||
// ОтправкаВКанал - Булево - Отправка в канал или в чат боту
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Ответ сервера Viber
|
||||
Функция ОтправитьСсылку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
|
||||
|
||||
Возврат ОтправитьСообщение(Токен, "url", IDПользователя, ОтправкаВКанал, URL);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Сформировать клавиатуру из массива кнопок.
|
||||
//
|
||||
// Параметры:
|
||||
// МассивКнопок - Массив из Строка - Массив кнопок
|
||||
// ЦветКнопок - Строка - HEX цвет кнопок с # в начале
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура - Сформировать клавиатуру из массива кнопок:
|
||||
// * Buttons - Массив из Структура - Массив сформированных кнопок
|
||||
// * Type - Строка - Тип клавиатуры
|
||||
Функция СформироватьКлавиатуруИзМассиваКнопок(Знач МассивКнопок, Знач ЦветКнопок = "") Экспорт
|
||||
|
||||
МассивСтруктурКнопок = Новый Массив;
|
||||
СтруктураКлавиатуры = Новый Структура;
|
||||
ЦветКнопок = ?(ЗначениеЗаполнено(ЦветКнопок), ЦветКнопок, "#2db9b9");
|
||||
|
||||
Для Каждого ТекстКнопки Из МассивКнопок Цикл
|
||||
|
||||
СтруктураКнопки = Новый Структура;
|
||||
СтруктураКнопки.Вставить("ActionType", "reply");
|
||||
СтруктураКнопки.Вставить("ActionBody", ТекстКнопки);
|
||||
СтруктураКнопки.Вставить("Text" , ТекстКнопки);
|
||||
СтруктураКнопки.Вставить("BgColor" , ЦветКнопок);
|
||||
СтруктураКнопки.Вставить("Coloumns" , 3);
|
||||
|
||||
МассивСтруктурКнопок.Добавить(СтруктураКнопки);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
СтруктураКлавиатуры.Вставить("Buttons", МассивСтруктурКнопок);
|
||||
СтруктураКлавиатуры.Вставить("Type" , "keyboard");
|
||||
|
||||
Возврат СтруктураКлавиатуры;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
// Отправить сообщение.
|
||||
//
|
||||
// Параметры:
|
||||
// Токен - Строка - Токен
|
||||
// Тип - Строка - Тип отправляемого сообщения
|
||||
// IDПользователя - Строка,Число - ID пользователя Viber
|
||||
// ЭтоКанал - Булево - Отправка в канал или чат с ботом
|
||||
// Значение - Строка, Структура - Значение:
|
||||
// * URL - Строка - При отправке URL
|
||||
// * Размер - Число, Строка - Размер файла в случае отправке
|
||||
// * Расширение - Строка - Расширение файла в случае отправки
|
||||
// Текст - Строка - Текст сообщения
|
||||
// Клавиатура - Структура из Строка - Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Произвольный, HTTPОтвет - Отправить сообщение
|
||||
Функция ОтправитьСообщение(Знач Токен
|
||||
, Знач Тип
|
||||
, Знач IDПользователя
|
||||
, Знач ЭтоКанал
|
||||
, Знач Значение = ""
|
||||
, Знач Текст = ""
|
||||
, Знач Клавиатура = "")
|
||||
|
||||
СтруктураПараметров = ВернутьСтандартныеПараметры();
|
||||
СтруктураПараметров.Вставить("type", Тип);
|
||||
|
||||
Если (Тип = "text" Или Тип = "picture") И ЗначениеЗаполнено(Текст) Тогда
|
||||
СтруктураПараметров.Вставить("text", Текст);
|
||||
КонецЕсли;
|
||||
|
||||
Если ТипЗнч(Клавиатура) = Тип("Структура") Тогда
|
||||
СтруктураПараметров.Вставить("keyboard", Клавиатура);
|
||||
КонецЕсли;
|
||||
|
||||
Если ЗначениеЗаполнено(Значение) Тогда
|
||||
|
||||
Если Тип = "file" Тогда
|
||||
СтруктураПараметров.Вставить("media" , Значение["URL"]);
|
||||
СтруктураПараметров.Вставить("size" , Значение["Размер"]);
|
||||
СтруктураПараметров.Вставить("file_name", "Файл." + Значение["Расширение"]);
|
||||
ИначеЕсли Тип = "contact" Тогда
|
||||
СтруктураПараметров.Вставить("contact" , Значение);
|
||||
ИначеЕсли Тип = "location" Тогда
|
||||
СтруктураПараметров.Вставить("location" , Значение);
|
||||
Иначе
|
||||
СтруктураПараметров.Вставить("media" , Значение);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Если ЭтоКанал Тогда
|
||||
СтруктураПараметров.Вставить("from", IDПользователя);
|
||||
URL = "https://chatapi.viber.com/pa/post";
|
||||
Иначе
|
||||
СтруктураПараметров.Вставить("receiver", IDПользователя);
|
||||
URL = "https://chatapi.viber.com/pa/send_message";
|
||||
КонецЕсли;
|
||||
|
||||
Ответ = OPI_Инструменты.Post(URL
|
||||
, СтруктураПараметров
|
||||
, ТокенВЗаголовки(Токен));
|
||||
|
||||
Попытка
|
||||
Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
|
||||
Исключение
|
||||
Возврат Ответ;
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ВернутьСтандартныеПараметры()
|
||||
|
||||
СтруктураОтправителя = Новый Структура;
|
||||
СтруктураОтправителя.Вставить("name" , "Bot");
|
||||
СтруктураОтправителя.Вставить("avatar", "");
|
||||
|
||||
СтруктураПараметров = Новый Структура;
|
||||
СтруктураПараметров.Вставить("sender", СтруктураОтправителя);
|
||||
СтруктураПараметров.Вставить("min_api_version", 1);
|
||||
|
||||
Возврат СтруктураПараметров;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ТокенВЗаголовки(Знач Токен)
|
||||
|
||||
СтруктураЗаголовков = Новый Соответствие;
|
||||
СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен);
|
||||
Возврат СтруктураЗаголовков;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="0fc66587-a390-4939-b54b-e772cec8fcf7">
|
||||
<name>OPI_Viber</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Методы интеграции с Viber (ОПИ)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
||||
@@ -1,552 +0,0 @@
|
||||
//MIT License
|
||||
|
||||
//Copyright (c) 2023 Anton Tsitavets
|
||||
|
||||
//Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
//of this software and associated documentation files (the "Software"), to deal
|
||||
//in the Software without restriction, including without limitation the rights
|
||||
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
//copies of the Software, and to permit persons to whom the Software is
|
||||
//furnished to do so, subject to the following conditions:
|
||||
|
||||
//The above copyright notice and this permission notice shall be included in all
|
||||
//copies or substantial portions of the Software.
|
||||
|
||||
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
//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
|
||||
//SOFTWARE.
|
||||
|
||||
#Область СлужебныйПрограммныйИнтерфейс
|
||||
|
||||
#Область HTTPМетоды
|
||||
|
||||
Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "") Экспорт
|
||||
|
||||
Если Не ЗначениеЗаполнено(Параметры) Тогда
|
||||
Параметры = Новый Структура;
|
||||
КонецЕсли;
|
||||
|
||||
Заголовки = Новый Соответствие;
|
||||
|
||||
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
|
||||
|
||||
Для Каждого Заголовок Из ДопЗаголовки Цикл
|
||||
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
СтруктураURL = РазбитьURL(URL);
|
||||
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"], 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
|
||||
Запрос = Новый HTTPЗапрос(СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры), Заголовки);
|
||||
Ответ = Соединение.Получить(Запрос);
|
||||
|
||||
Попытка
|
||||
ТелоОтвета = JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
|
||||
Исключение
|
||||
ТелоОтвета = Ответ.ПолучитьТелоКакДвоичныеДанные()
|
||||
КонецПопытки;
|
||||
|
||||
Возврат ТелоОтвета;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция PostMultipart(Знач URL
|
||||
, Знач Параметры
|
||||
, Знач Файлы = ""
|
||||
, Знач ТипКонтента = "image/jpeg"
|
||||
, Знач ДопЗаголовки = "") Экспорт
|
||||
|
||||
Если Не ЗначениеЗаполнено(Параметры) Тогда
|
||||
Параметры = Новый Структура;
|
||||
КонецЕсли;
|
||||
|
||||
Если Не ЗначениеЗаполнено(Файлы) Тогда
|
||||
Файлы = Новый Соответствие;
|
||||
КонецЕсли;
|
||||
|
||||
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
|
||||
СтруктураURL = РазбитьURL(URL);
|
||||
|
||||
Заголовки = Новый Соответствие();
|
||||
Заголовки.Вставить("Content-Type" , "multipart/form-data; boundary=" + Boundary);
|
||||
Заголовки.Вставить("Accept-Encoding" , "gzip");
|
||||
Заголовки.Вставить("Accept" , "*/*");
|
||||
Заголовки.Вставить("Connection" , "keep-alive");
|
||||
|
||||
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
|
||||
|
||||
Для Каждого Заголовок Из ДопЗаголовки Цикл
|
||||
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"],443,,,,,Новый ЗащищенноеСоединение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", НовыйЗапрос);
|
||||
|
||||
НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = "gzip" Или
|
||||
Ответ.Заголовки.Получить("content-encoding") = "gzip";
|
||||
|
||||
Если НужнаРаспаковка Тогда
|
||||
Ответ = РаспаковатьОтвет(Ответ);
|
||||
КонецЕсли;
|
||||
|
||||
Возврат ?(ТипЗнч(Ответ) = Тип("ДвоичныеДанные"), JsonВСтруктуру(Ответ), JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные()));
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция Post(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач JSON = Истина) Экспорт
|
||||
|
||||
Если Не ЗначениеЗаполнено(Параметры) Тогда
|
||||
Параметры = Новый Структура;
|
||||
КонецЕсли;
|
||||
|
||||
ТипДанных = ?(JSON, "application/json", "application/x-www-form-urlencoded");
|
||||
СтруктураURL = РазбитьURL(URL);
|
||||
|
||||
Заголовки = Новый Соответствие();
|
||||
Заголовки.Вставить("Content-Type" , ТипДанных);
|
||||
Заголовки.Вставить("Accept-Encoding" , "gzip");
|
||||
Заголовки.Вставить("Accept" , "*/*");
|
||||
Заголовки.Вставить("Connection" , "keep-alive");
|
||||
|
||||
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
|
||||
|
||||
Для Каждого Заголовок Из ДопЗаголовки Цикл
|
||||
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"],443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
|
||||
НовыйЗапрос = Новый HTTPЗапрос(СтруктураURL["Адрес"], Заголовки);
|
||||
|
||||
Если JSON Тогда
|
||||
Данные = JSONСтрокой(Параметры);
|
||||
Иначе
|
||||
СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры);
|
||||
Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
|
||||
КонецЕсли;
|
||||
|
||||
НовыйЗапрос.УстановитьТелоИзСтроки(Данные);
|
||||
|
||||
Ответ = Соединение.ВызватьHTTPМетод("POST", НовыйЗапрос);
|
||||
|
||||
НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = "gzip" Или
|
||||
Ответ.Заголовки.Получить("content-encoding") = "gzip";
|
||||
|
||||
Если НужнаРаспаковка Тогда
|
||||
Ответ = РаспаковатьОтвет(Ответ);
|
||||
КонецЕсли;
|
||||
|
||||
Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ);
|
||||
|
||||
Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
|
||||
|
||||
Попытка
|
||||
Ответ = JsonВСтруктуру(Ответ)
|
||||
Исключение
|
||||
Ответ = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
|
||||
КонецПопытки;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
|
||||
|
||||
СоответствиеВозврата = Новый Соответствие;
|
||||
КоличествоЧастей = 2;
|
||||
МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь);
|
||||
|
||||
Для Каждого Параметр Из МассивПараметров Цикл
|
||||
|
||||
МассивКлючЗначение = СтрРазделить(Параметр, "=");
|
||||
|
||||
|
||||
Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда
|
||||
СоответствиеВозврата.Вставить(МассивКлючЗначение[0]
|
||||
, МассивКлючЗначение[1]);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат СоответствиеВозврата;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура ЗаменитьСпецСимволы(Текст) Экспорт
|
||||
|
||||
МассивСимволов = Новый Соответствие;
|
||||
МассивСимволов.Вставить("<", "<");
|
||||
МассивСимволов.Вставить(">", ">");
|
||||
МассивСимволов.Вставить("&", "&");
|
||||
МассивСимволов.Вставить("_", " ");
|
||||
МассивСимволов.Вставить("[", "(");
|
||||
МассивСимволов.Вставить("]", ")");
|
||||
|
||||
Для Каждого СимволМассива Из МассивСимволов Цикл
|
||||
Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция UNIXTime(Знач Дата) Экспорт
|
||||
Возврат Формат(Дата - Дата(1970,1,1,1,0,0), "ЧГ=0");
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область Служебные
|
||||
|
||||
Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт
|
||||
|
||||
Если Параметры.Количество() = 0 Тогда
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
|
||||
СтрокаПараметров = "?";
|
||||
|
||||
Для Каждого Параметр Из Параметры Цикл
|
||||
СтрокаПараметров = СтрокаПараметров + Параметр.Ключ + "=" + КодироватьСтроку(Параметр.Значение, СпособКодированияСтроки.КодировкаURL) + "&";
|
||||
КонецЦикла;
|
||||
|
||||
СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
|
||||
|
||||
Возврат СтрокаПараметров;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция РазбитьURL(Знач URL) Экспорт
|
||||
|
||||
URL = СтрЗаменить(URL, "https://", "");
|
||||
URL = СтрЗаменить(URL, "http://" , "");
|
||||
URL = СтрЗаменить(URL, "www." , "");
|
||||
|
||||
СтруктураВозврата = Новый Структура;
|
||||
СтруктураВозврата.Вставить("Сервер" , Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1));
|
||||
СтруктураВозврата.Вставить("Адрес" , Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1));
|
||||
|
||||
Возврат СтруктураВозврата;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция JsonВСтруктуру(Знач Текст, Знач Кодировка = "utf-8") Экспорт
|
||||
|
||||
Если Не ЗначениеЗаполнено(Текст) Тогда
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
|
||||
ЧтениеJSON = Новый ЧтениеJSON;
|
||||
ЧтениеJSON.ОткрытьПоток(Текст.ОткрытьПотокДляЧтения());
|
||||
|
||||
Данные = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
|
||||
ЧтениеJSON.Закрыть();
|
||||
|
||||
Возврат Данные;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция JSONСтрокой(Знач Данные) Экспорт
|
||||
|
||||
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
|
||||
ЗаписьJSON = Новый ЗаписьJSON;
|
||||
ЗаписьJSON.ПроверятьСтруктуру = Истина;
|
||||
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
|
||||
|
||||
ЗаписатьJSON(ЗаписьJSON, Данные);
|
||||
Возврат ЗаписьJSON.Закрыть();
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЧислоВСтроку(Знач Число) Экспорт
|
||||
Возврат СтрЗаменить(Строка(Число), Символы.НПП, "");
|
||||
КонецФункции
|
||||
|
||||
Процедура ВыполнитьСкрипт(Знач Текст) Экспорт
|
||||
|
||||
ИмяСкрипта = ПолучитьИмяВременногоФайла(".ps1");
|
||||
ТекстСкрипта = Новый ТекстовыйДокумент();
|
||||
|
||||
ТекстСкрипта.УстановитьТекст(Текст);
|
||||
|
||||
ТекстСкрипта.Записать(ИмяСкрипта, КодировкаТекста.UTF8);
|
||||
|
||||
КодВозврата = 0;
|
||||
ЗапуститьПриложение("powershell -file " + ИмяСкрипта + " -noexit", , Истина, КодВозврата);
|
||||
|
||||
УдалитьФайлы(ИмяСкрипта);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция РазмерДанныхB64(Знач Base64Строка) Экспорт
|
||||
|
||||
РазмерДанных = СтрДлина(Base64Строка)
|
||||
- ?(Прав(Base64Строка, 1) = "=", 1, 0)
|
||||
- ?(Прав(Base64Строка, 2) = "==", 1, 0);
|
||||
|
||||
Возврат Цел(РазмерДанных / 4 * 3);
|
||||
|
||||
Конецфункции
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
#Область GZip
|
||||
|
||||
// Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
|
||||
// Источник: https://github.com/vbondarevsky/Connector
|
||||
|
||||
// Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
|
||||
//
|
||||
// Copyright 2017-2023 Vladimir Bondarevskiy
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
//
|
||||
// URL: https://github.com/vbondarevsky/Connector
|
||||
// e-mail: vbondarevsky@gmail.com
|
||||
// Версия: 2.4.8
|
||||
//
|
||||
// Требования: платформа 1С версии 8.3.10 и выше
|
||||
|
||||
Функция РаспаковатьОтвет(Ответ)
|
||||
|
||||
Попытка
|
||||
Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные());
|
||||
Исключение
|
||||
Возврат Ответ;
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПрочитатьGZip(СжатыеДанные) Экспорт
|
||||
|
||||
РазмерПрефиксаGZip = 10;
|
||||
РазмерПостфиксаGZip = 8;
|
||||
|
||||
ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные);
|
||||
ЧтениеДанных.Пропустить(РазмерПрефиксаGZip);
|
||||
РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip;
|
||||
|
||||
ПотокZip = Новый ПотокВПамяти(ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD() + ZipРазмерCDH() + ZipРазмерEOCD());
|
||||
ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
|
||||
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH());
|
||||
ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных);
|
||||
|
||||
ЗаписьДанных.Закрыть();
|
||||
ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
|
||||
|
||||
CRC32 = ЧтениеДанных.ПрочитатьЦелое32();
|
||||
РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32();
|
||||
ЧтениеДанных.Закрыть();
|
||||
|
||||
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
|
||||
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
|
||||
ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных));
|
||||
ЗаписьДанных.Закрыть();
|
||||
|
||||
Возврат ПрочитатьZip(ПотокZip);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено)
|
||||
|
||||
Каталог = ПолучитьИмяВременногоФайла();
|
||||
ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные);
|
||||
ИмяФайла = ЧтениеZip.Элементы[0].Имя;
|
||||
Попытка
|
||||
ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
|
||||
Исключение
|
||||
// Игнорируем проверку целостности архива, просто читаем результат
|
||||
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
|
||||
КонецПопытки;
|
||||
ЧтениеZip.Закрыть();
|
||||
|
||||
Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
|
||||
УдалитьФайлы(Каталог);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ZipРазмерLFH()
|
||||
|
||||
Возврат 34;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ZipРазмерDD()
|
||||
|
||||
Возврат 16;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ZipРазмерCDH()
|
||||
|
||||
Возврат 50;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ZipРазмерEOCD()
|
||||
|
||||
Возврат 22;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ZipLFH()
|
||||
|
||||
// Local file header
|
||||
Буфер = Новый БуферДвоичныхДанных(ZipРазмерLFH());
|
||||
Буфер.ЗаписатьЦелое32(0, 67324752); // signature 0x04034b50
|
||||
Буфер.ЗаписатьЦелое16(4, 20); // version
|
||||
Буфер.ЗаписатьЦелое16(6, 10); // bit flags
|
||||
Буфер.ЗаписатьЦелое16(8, 8); // compression method
|
||||
Буфер.ЗаписатьЦелое16(10, 0); // time
|
||||
Буфер.ЗаписатьЦелое16(12, 0); // date
|
||||
Буфер.ЗаписатьЦелое32(14, 0); // crc-32
|
||||
Буфер.ЗаписатьЦелое32(18, 0); // compressed size
|
||||
Буфер.ЗаписатьЦелое32(22, 0); // uncompressed size
|
||||
Буфер.ЗаписатьЦелое16(26, 4); // filename legth - "data"
|
||||
Буфер.ЗаписатьЦелое16(28, 0); // extra field length
|
||||
Буфер.Записать(30, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
|
||||
|
||||
Возврат Буфер;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
|
||||
|
||||
// Data descriptor
|
||||
Буфер = Новый БуферДвоичныхДанных(ZipРазмерDD());
|
||||
Буфер.ЗаписатьЦелое32(0, 134695760);
|
||||
Буфер.ЗаписатьЦелое32(4, CRC32);
|
||||
Буфер.ЗаписатьЦелое32(8, РазмерСжатыхДанных);
|
||||
Буфер.ЗаписатьЦелое32(12, РазмерНесжатыхДанных);
|
||||
|
||||
Возврат Буфер;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
|
||||
|
||||
// Central directory header
|
||||
Буфер = Новый БуферДвоичныхДанных(ZipРазмерCDH());
|
||||
Буфер.ЗаписатьЦелое32(0, 33639248); // signature 0x02014b50
|
||||
Буфер.ЗаписатьЦелое16(4, 798); // version made by
|
||||
Буфер.ЗаписатьЦелое16(6, 20); // version needed to extract
|
||||
Буфер.ЗаписатьЦелое16(8, 10); // bit flags
|
||||
Буфер.ЗаписатьЦелое16(10, 8); // compression method
|
||||
Буфер.ЗаписатьЦелое16(12, 0); // time
|
||||
Буфер.ЗаписатьЦелое16(14, 0); // date
|
||||
Буфер.ЗаписатьЦелое32(16, CRC32); // crc-32
|
||||
Буфер.ЗаписатьЦелое32(20, РазмерСжатыхДанных); // compressed size
|
||||
Буфер.ЗаписатьЦелое32(24, РазмерНесжатыхДанных); // uncompressed size
|
||||
Буфер.ЗаписатьЦелое16(28, 4); // file name length
|
||||
Буфер.ЗаписатьЦелое16(30, 0); // extra field length
|
||||
Буфер.ЗаписатьЦелое16(32, 0); // file comment length
|
||||
Буфер.ЗаписатьЦелое16(34, 0); // disk number start
|
||||
Буфер.ЗаписатьЦелое16(36, 0); // internal file attributes
|
||||
Буфер.ЗаписатьЦелое32(38, 2176057344); // external file attributes
|
||||
Буфер.ЗаписатьЦелое32(42, 0); // relative offset of local header
|
||||
Буфер.Записать(46, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
|
||||
|
||||
Возврат Буфер;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ZipEOCD(РазмерСжатыхДанных)
|
||||
|
||||
// End of central directory
|
||||
РазмерCDH = 50;
|
||||
Буфер = Новый БуферДвоичныхДанных(ZipРазмерEOCD());
|
||||
Буфер.ЗаписатьЦелое32(0, 101010256); // signature 0x06054b50
|
||||
Буфер.ЗаписатьЦелое16(4, 0); // number of this disk
|
||||
Буфер.ЗаписатьЦелое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(10, 1); // total number of entries in the central directory
|
||||
Буфер.ЗаписатьЦелое32(12, РазмерCDH); // size of the central directory
|
||||
// offset of start of central directory with respect to the starting disk number
|
||||
Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD());
|
||||
Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number
|
||||
|
||||
Возврат Буфер;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="fdfad187-8b14-4608-a0e6-816a4b2cd915">
|
||||
<name>OPI_Инструменты</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>OPI инструменты</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
||||
@@ -1,77 +0,0 @@
|
||||
#Область СлужебныйПрограммныйИнтерфейс
|
||||
|
||||
#Область БСП
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (c) 2019, ООО 1С-Софт
|
||||
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
|
||||
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
|
||||
// Текст лицензии доступен по ссылке:
|
||||
// https://creativecommons.org/licenses/by/4.0/legalcode
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Функция HMACSHA256(Знач Ключ, Знач Данные) Экспорт
|
||||
|
||||
Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция Хеш(ДвоичныеДанные, Тип) Экспорт
|
||||
|
||||
Хеширование = Новый ХешированиеДанных(Тип);
|
||||
Хеширование.Добавить(ДвоичныеДанные);
|
||||
|
||||
Возврат Хеширование.ХешСумма;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт
|
||||
|
||||
Если Ключ.Размер() > РазмерБлока Тогда
|
||||
Ключ = Хеш(Ключ, Тип);
|
||||
КонецЕсли;
|
||||
|
||||
Если Ключ.Размер() <= РазмерБлока Тогда
|
||||
Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
|
||||
Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * 2);
|
||||
КонецЕсли;
|
||||
|
||||
Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));
|
||||
|
||||
Ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока));
|
||||
Opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока));
|
||||
|
||||
Ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
|
||||
Ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);
|
||||
|
||||
Opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
|
||||
Okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
|
||||
|
||||
Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2) Экспорт
|
||||
|
||||
МассивДвоичныхДанных = Новый Массив;
|
||||
МассивДвоичныхДанных.Добавить(ДвоичныеДанные1);
|
||||
МассивДвоичныхДанных.Добавить(ДвоичныеДанные2);
|
||||
|
||||
Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПовторитьСтроку(Строка, Количество) Экспорт
|
||||
|
||||
Части = Новый Массив(Количество);
|
||||
Для к = 1 По Количество Цикл
|
||||
Части.Добавить(Строка);
|
||||
КонецЦикла;
|
||||
|
||||
Возврат СтрСоединить(Части, "");
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="331eccd4-9cf6-4b0c-8f24-2ad8b4f14d73">
|
||||
<name>OPI_Криптография</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Криптография (OPI)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
||||
@@ -1,47 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mdclass:Configuration xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="af9b0030-b273-490f-b334-fdd394878407">
|
||||
<name>Конфигурация</name>
|
||||
<containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="52630063-2337-4491-b245-5a1edb4d76fa"/>
|
||||
<containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="502dd235-7c1a-4615-a409-15ecc87b5080"/>
|
||||
<containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="97caf8ea-3fab-4eda-9be9-ccf5924f0810"/>
|
||||
<containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="26443b8e-0baa-4ad4-b6ac-617dc5684c51"/>
|
||||
<containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="596cd0aa-7769-435b-90c4-1f20dc7b6930"/>
|
||||
<containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="69442e4e-a991-4f4f-a753-a6cdf89f74e1"/>
|
||||
<containedObjects classId="fb282519-d103-4dd3-bc12-cb271d631dfc" objectId="521af971-c6b2-44ae-beb1-a72ab664c9cb"/>
|
||||
<configurationExtensionCompatibilityMode>8.3.18</configurationExtensionCompatibilityMode>
|
||||
<defaultRunMode>ManagedApplication</defaultRunMode>
|
||||
<usePurposes>PersonalComputer</usePurposes>
|
||||
<scriptVariant>Russian</scriptVariant>
|
||||
<usedMobileApplicationFunctionalities>
|
||||
<functionality>
|
||||
<use>true</use>
|
||||
</functionality>
|
||||
<functionality>
|
||||
<functionality>OSBackup</functionality>
|
||||
<use>true</use>
|
||||
</functionality>
|
||||
</usedMobileApplicationFunctionalities>
|
||||
<defaultLanguage>Language.Русский</defaultLanguage>
|
||||
<dataLockControlMode>Managed</dataLockControlMode>
|
||||
<objectAutonumerationMode>NotAutoFree</objectAutonumerationMode>
|
||||
<modalityUseMode>DontUse</modalityUseMode>
|
||||
<synchronousPlatformExtensionAndAddInCallUseMode>DontUse</synchronousPlatformExtensionAndAddInCallUseMode>
|
||||
<compatibilityMode>8.3.9</compatibilityMode>
|
||||
<languages uuid="6baf84ae-5c74-4fe2-8467-219a78580fe7">
|
||||
<name>Русский</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Русский</value>
|
||||
</synonym>
|
||||
<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>
|
||||
<httpServices>HTTPService.Twitter</httpServices>
|
||||
<constants>Constant.TwitterRefresh</constants>
|
||||
<constants>Constant.TwitterToken</constants>
|
||||
</mdclass:Configuration>
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mdclass:Constant xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c8f3e857-6526-4187-afea-598855ffde70">
|
||||
<producedTypes>
|
||||
<managerType typeId="baea1faa-8b19-499e-ad22-5e413b69a67f" valueTypeId="a131a492-e0e6-47b3-9501-18663d23439e"/>
|
||||
<valueManagerType typeId="a1110732-e4b7-4bdc-abb6-26df3df9d506" valueTypeId="a187fa98-56fe-4e8b-b8fe-08ccf78e17f6"/>
|
||||
<valueKeyType typeId="47ba4824-aaa2-451b-a122-b1f6f121ade8" valueTypeId="b1f60de8-1aef-4acc-937a-7210e5567c1e"/>
|
||||
</producedTypes>
|
||||
<name>TwitterRefresh</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Twitter refresh</value>
|
||||
</synonym>
|
||||
<type>
|
||||
<types>String</types>
|
||||
<stringQualifiers>
|
||||
<length>200</length>
|
||||
</stringQualifiers>
|
||||
</type>
|
||||
<useStandardCommands>true</useStandardCommands>
|
||||
<minValue xsi:type="core:UndefinedValue"/>
|
||||
<maxValue xsi:type="core:UndefinedValue"/>
|
||||
<dataLockControlMode>Managed</dataLockControlMode>
|
||||
</mdclass:Constant>
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mdclass:Constant xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="b96c0e0e-6a2b-4f9c-a9f9-68007b23fced">
|
||||
<producedTypes>
|
||||
<managerType typeId="6021e728-01fc-42c0-8ccc-1c0b7bd8381f" valueTypeId="2bced781-db0a-456a-8f96-6d1a91540478"/>
|
||||
<valueManagerType typeId="ac3557ea-4133-4581-bae4-f46a6b1a0c1f" valueTypeId="defeb168-3985-42b5-8e29-67a58470a221"/>
|
||||
<valueKeyType typeId="fef49910-3ad6-4d99-b0c4-c82708438d2a" valueTypeId="8098c190-1889-4a13-86b4-0bcd805ab200"/>
|
||||
</producedTypes>
|
||||
<name>TwitterToken</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Twitter token</value>
|
||||
</synonym>
|
||||
<type>
|
||||
<types>String</types>
|
||||
<stringQualifiers>
|
||||
<length>200</length>
|
||||
</stringQualifiers>
|
||||
</type>
|
||||
<useStandardCommands>true</useStandardCommands>
|
||||
<minValue xsi:type="core:UndefinedValue"/>
|
||||
<maxValue xsi:type="core:UndefinedValue"/>
|
||||
<dataLockControlMode>Managed</dataLockControlMode>
|
||||
</mdclass:Constant>
|
||||
@@ -1,31 +0,0 @@
|
||||
|
||||
Функция Twitterget(Запрос)
|
||||
|
||||
Параметры = Новый Соответствие;
|
||||
|
||||
Параметры.Вставить("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.ПолучитьТокен(Код, Параметры);
|
||||
|
||||
Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]);
|
||||
Константы.TwitterToken.Установить(ОтветТокен["access_token"]);
|
||||
|
||||
Ответ = Новый HTTPСервисОтвет(200);
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция Twitterpost(Запрос)
|
||||
Ответ = Новый HTTPСервисОтвет(200);
|
||||
Возврат Ответ;
|
||||
КонецФункции
|
||||
@@ -1,36 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mdclass:HTTPService xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="2a9ba3e3-8cfe-43b9-ae44-6b35fd3f70b4">
|
||||
<name>Twitter</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Twitter</value>
|
||||
</synonym>
|
||||
<rootURL>twitter</rootURL>
|
||||
<reuseSessions>AutoUse</reuseSessions>
|
||||
<sessionMaxAge>20</sessionMaxAge>
|
||||
<urlTemplates uuid="72f0e476-8cae-4ee4-8d24-38113a27c8a3">
|
||||
<name>Twitter</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Twitter</value>
|
||||
</synonym>
|
||||
<template>/*</template>
|
||||
<methods uuid="4073c6bb-6d05-40d5-890d-18ea834f52e0">
|
||||
<name>get</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Get</value>
|
||||
</synonym>
|
||||
<handler>Twitterget</handler>
|
||||
</methods>
|
||||
<methods uuid="28dde02e-477e-43a4-b1a7-e097a58b3da1">
|
||||
<name>post</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Post</value>
|
||||
</synonym>
|
||||
<httpMethod>POST</httpMethod>
|
||||
<handler>Twitterpost</handler>
|
||||
</methods>
|
||||
</urlTemplates>
|
||||
</mdclass:HTTPService>
|
||||
Reference in New Issue
Block a user