You've already forked OpenIntegrations
mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2025-08-13 20:05:19 +02:00
Вводный
This commit is contained in:
18
.project
Normal file
18
.project
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>OPI</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
|
||||||
|
<nature>com._1c.g5.v8.dt.core.V8ConfigurationNature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
2
.settings/org.eclipse.core.resources.prefs
Normal file
2
.settings/org.eclipse.core.resources.prefs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
encoding/<project>=UTF-8
|
2
DT-INF/PROJECT.PMF
Normal file
2
DT-INF/PROJECT.PMF
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Runtime-Version: 8.3.15
|
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<img src="https://github.com/Bayselonarrend/OpenIntegrations/raw/main/media/logo_long.png" style="height: 256px; width: 768px;">
|
||||||
|
|
||||||
|
# ОПИ - набор библиотек интеграции с популярными API для 1C:Enterprise
|
BIN
media/beads.png
Normal file
BIN
media/beads.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 79 KiB |
BIN
media/logo.png
Normal file
BIN
media/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 430 KiB |
BIN
media/logo_long.png
Normal file
BIN
media/logo_long.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 560 KiB |
0
src/CommonModules/OPI_GoogleWorkspace/Module.bsl
Normal file
0
src/CommonModules/OPI_GoogleWorkspace/Module.bsl
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="cf56b647-8ad6-4ee3-a5ae-8dcf339b1647">
|
||||||
|
<name>OPI_GoogleWorkspace</name>
|
||||||
|
<synonym>
|
||||||
|
<key>ru</key>
|
||||||
|
<value>Методы Google Workspace</value>
|
||||||
|
</synonym>
|
||||||
|
<server>true</server>
|
||||||
|
<externalConnection>true</externalConnection>
|
||||||
|
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||||
|
</mdclass:CommonModule>
|
576
src/CommonModules/OPI_Telegram/Module.bsl
Normal file
576
src/CommonModules/OPI_Telegram/Module.bsl
Normal file
@@ -0,0 +1,576 @@
|
|||||||
|
//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.
|
||||||
|
|
||||||
|
#Область ПрограммныйИнтерфейс
|
||||||
|
|
||||||
|
#Область Бот
|
||||||
|
|
||||||
|
// Получить информацию бота.
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Токен - Строка - Токен
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||||
|
Функция ПолучитьИнформациюБота(Знач Токен) Экспорт
|
||||||
|
|
||||||
|
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getMe");
|
||||||
|
Возврат Ответ;
|
||||||
|
|
||||||
|
Конецфункции
|
||||||
|
|
||||||
|
// Получить обновления.
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Токен - Строка - Токен
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram
|
||||||
|
Функция ПолучитьОбновления(Знач Токен) Экспорт
|
||||||
|
|
||||||
|
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getUpdates");
|
||||||
|
Возврат Ответ;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Обработать данные, полученные на 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Чата, Знач Текст, Знач Клавиатура = "") Экспорт
|
||||||
|
|
||||||
|
OPI_Инструменты.ЗаменитьСпецСимволы(Текст);
|
||||||
|
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||||
|
|
||||||
|
Параметры_ = Новый Структура;
|
||||||
|
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||||
|
Параметры_.Вставить("text" , Текст);
|
||||||
|
Параметры_.Вставить("chat_id" , IDЧата);
|
||||||
|
Параметры_.Вставить("reply_markup" , Клавиатура);
|
||||||
|
|
||||||
|
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendMessage", Параметры_);
|
||||||
|
|
||||||
|
Возврат Ответ;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ОтправитьКартинку(Знач Токен, Знач IDЧата, Знач Текст, Знач Картинка, Знач Клавиатура = "") Экспорт
|
||||||
|
|
||||||
|
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура);
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ОтправитьВидео(Знач Токен, Знач IDЧата, Знач Текст, Знач Видео, Знач Клавиатура = "") Экспорт
|
||||||
|
|
||||||
|
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура);
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ОтправитьАудио(Знач Токен, Знач IDЧата, Знач Текст, Знач Аудио, Знач Клавиатура = "") Экспорт
|
||||||
|
|
||||||
|
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура);
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ОтправитьДокумент(Знач Токен, Знач IDЧата, Знач Текст, Знач Документ, Знач Клавиатура = "") Экспорт
|
||||||
|
|
||||||
|
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура);
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ОтправитьГифку(Знач Токен, Знач IDЧата, Знач Текст, Знач Гифка, Знач Клавиатура = "") Экспорт
|
||||||
|
|
||||||
|
Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура);
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ОтправитьНаборЛюбыхФайлов(Знач Токен, Знач IDЧата, Знач Текст, Знач СоответствиеФайлов, Знач Клавиатура = "") Экспорт
|
||||||
|
|
||||||
|
//СоответствиеФайлов
|
||||||
|
//Ключ - Файл, Значение - Тип
|
||||||
|
//Типы: audio, document, photo, video
|
||||||
|
//Нельзя замешивать audio и document вместе с другими типами!
|
||||||
|
|
||||||
|
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_Инструменты.Post("api.telegram.org/bot"
|
||||||
|
+ Токен
|
||||||
|
+ "/sendMediaGroup", Параметры_, СтруктураФайлов, "mixed");
|
||||||
|
|
||||||
|
|
||||||
|
Возврат Ответ;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ОтправитьМестоположение(Знач Токен, Знач 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Чата = 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Чата = 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Оригинала = 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Чата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||||
|
IDПользователя = OPI_Инструменты.ЧислоВСтроку(IDПользователя);
|
||||||
|
|
||||||
|
_Параметры = Новый Структура;
|
||||||
|
_Параметры.Вставить("parse_mode" , "Markdown");
|
||||||
|
_Параметры.Вставить("chat_id" , IDЧата);
|
||||||
|
_Параметры.Вставить("user_id" , IDПользователя);
|
||||||
|
|
||||||
|
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/banChatMember", _Параметры);
|
||||||
|
|
||||||
|
Возврат Ответ;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция Разбан(Знач Токен, Знач 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Чата, Знач Заголовок = "", Знач ДатаИстечения = "", Знач ЛимитПользователей = 0) Экспорт
|
||||||
|
|
||||||
|
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||||
|
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Чата = 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Чата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||||
|
IDСообщения = OPI_Инструменты.ЧислоВСтроку(IDСообщения);
|
||||||
|
|
||||||
|
_Параметры = Новый Структура;
|
||||||
|
_Параметры.Вставить("parse_mode" , "Markdown");
|
||||||
|
_Параметры.Вставить("chat_id" , IDЧата);
|
||||||
|
_Параметры.Вставить("message_id" , IDСообщения);
|
||||||
|
|
||||||
|
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/unpinChatMessage", _Параметры);
|
||||||
|
|
||||||
|
Возврат Ответ;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт
|
||||||
|
|
||||||
|
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||||
|
|
||||||
|
_Параметры = Новый Структура;
|
||||||
|
_Параметры.Вставить("parse_mode" , "Markdown");
|
||||||
|
_Параметры.Вставить("chat_id" , IDЧата);
|
||||||
|
|
||||||
|
Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getChatMemberCount", _Параметры);
|
||||||
|
|
||||||
|
Возврат Ответ;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
#Область TelegramMiniApp
|
||||||
|
|
||||||
|
Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт
|
||||||
|
|
||||||
|
СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL);
|
||||||
|
СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных);
|
||||||
|
Ключ = "WebAppData";
|
||||||
|
Хэш = "";
|
||||||
|
|
||||||
|
Результат = OPI_Инструменты.HMACSHA256(ПолучитьДвоичныеДанныеИзСтроки(Ключ)
|
||||||
|
, ПолучитьДвоичныеДанныеИзСтроки(Токен));
|
||||||
|
|
||||||
|
ТЗнач = Новый ТаблицаЗначений;
|
||||||
|
ТЗнач.Колонки.Добавить("Ключ");
|
||||||
|
ТЗнач.Колонки.Добавить("Значение");
|
||||||
|
|
||||||
|
Для Каждого Данные Из СтруктураДанных Цикл
|
||||||
|
|
||||||
|
НоваяСтрока = ТЗнач.Добавить();
|
||||||
|
НоваяСтрока.Ключ = Данные.Ключ;
|
||||||
|
НоваяСтрока.Значение = Данные.Значение;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
ТЗнач.Сортировать("Ключ");
|
||||||
|
|
||||||
|
СоответствиеВозврата = Новый Соответствие;
|
||||||
|
DCS = "";
|
||||||
|
|
||||||
|
Для Каждого СтрокаТЗ Из ТЗнач Цикл
|
||||||
|
|
||||||
|
Если СтрокаТЗ.Ключ <> "hash" Тогда
|
||||||
|
DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС;
|
||||||
|
СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение);
|
||||||
|
Иначе
|
||||||
|
Хэш = СтрокаТЗ.Значение;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
DCS = Лев(DCS, СтрДлина(DCS) - 1);
|
||||||
|
Подпись = OPI_Инструменты.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS));
|
||||||
|
|
||||||
|
Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись);
|
||||||
|
|
||||||
|
Если Финал = вРег(Хэш) Тогда
|
||||||
|
Ответ = Истина;
|
||||||
|
Иначе
|
||||||
|
Ответ = Ложь;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
СоответствиеВозврата.Вставить("passed", Ответ);
|
||||||
|
|
||||||
|
Возврат СоответствиеВозврата;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
#Область Прочее
|
||||||
|
|
||||||
|
Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок, Знач ПодСообщением = Ложь) Экспорт
|
||||||
|
|
||||||
|
Строки = Новый Массив;
|
||||||
|
|
||||||
|
Для Каждого Кнопка Из МассивКнопок Цикл
|
||||||
|
|
||||||
|
Кнопки = Новый Массив;
|
||||||
|
Кнопка = КодироватьСтроку(OPI_Инструменты.ЧислоВСтроку(Кнопка), СпособКодированияСтроки.КодировкаURL);
|
||||||
|
Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
|
||||||
|
Строки.Добавить(Кнопки);
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
|
||||||
|
Если ПодСообщением Тогда
|
||||||
|
СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1);
|
||||||
|
Иначе
|
||||||
|
СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина)
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
|
||||||
|
ЗаписьJSON = Новый ЗаписьJSON;
|
||||||
|
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет,,,ЭкранированиеСимволовJSON.СимволыВнеASCII));
|
||||||
|
ЗаписатьJSON(ЗаписьJSON, СтруктураПараметра);
|
||||||
|
|
||||||
|
Возврат ЗаписьJSON.Закрыть();
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
#Область СлужебныеПроцедурыИФункции
|
||||||
|
|
||||||
|
Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура)
|
||||||
|
|
||||||
|
Если Вид = "photo" Тогда
|
||||||
|
Метод = "/sendPhoto";
|
||||||
|
ИначеЕсли Вид = "video" Тогда
|
||||||
|
Метод = "/sendVideo";
|
||||||
|
ИначеЕсли Вид = "audio" Тогда
|
||||||
|
Метод = "/sendAudio";
|
||||||
|
ИначеЕсли Вид = "document" Тогда
|
||||||
|
Метод = "/sendDocument";
|
||||||
|
ИначеЕсли Вид = "animation" Тогда
|
||||||
|
Метод = "/sendAnimation";
|
||||||
|
Иначе
|
||||||
|
Возврат "";
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
OPI_Инструменты.ЗаменитьСпецсимволы(Текст);
|
||||||
|
IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
|
||||||
|
|
||||||
|
Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
|
||||||
|
ТекущийФайл = Новый Файл(Файл);
|
||||||
|
Расширение = ?(Вид = "document", ТекущийФайл.Расширение, "");
|
||||||
|
Файл = Новый ДвоичныеДанные(Файл);
|
||||||
|
Иначе
|
||||||
|
Расширение = "";
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Расширение = СтрЗаменить(Расширение, ".", "___");
|
||||||
|
|
||||||
|
Параметры_ = Новый Структура;
|
||||||
|
Параметры_.Вставить("parse_mode" , "Markdown");
|
||||||
|
Параметры_.Вставить("caption" , Текст);
|
||||||
|
Параметры_.Вставить("chat_id" , IDЧата);
|
||||||
|
Параметры_.Вставить("reply_markup" , Клавиатура);
|
||||||
|
|
||||||
|
СтруктураФайлов = Новый Структура;
|
||||||
|
СтруктураФайлов.Вставить(Вид + Расширение, Файл);
|
||||||
|
|
||||||
|
Ответ = OPI_Инструменты.Post("api.telegram.org/bot"
|
||||||
|
+ Токен
|
||||||
|
+ Метод, Параметры_, СтруктураФайлов, "mixed");
|
||||||
|
|
||||||
|
|
||||||
|
Возврат Ответ;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
|
11
src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
Normal file
11
src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?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>
|
0
src/CommonModules/OPI_VK/Module.bsl
Normal file
0
src/CommonModules/OPI_VK/Module.bsl
Normal file
11
src/CommonModules/OPI_VK/OPI_VK.mdo
Normal file
11
src/CommonModules/OPI_VK/OPI_VK.mdo
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?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>
|
389
src/CommonModules/OPI_Viber/Module.bsl
Normal file
389
src/CommonModules/OPI_Viber/Module.bsl
Normal file
@@ -0,0 +1,389 @@
|
|||||||
|
//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.
|
||||||
|
|
||||||
|
#Область ПрограммныйИнтерфейс
|
||||||
|
|
||||||
|
#Область НастройкиИИнформация
|
||||||
|
|
||||||
|
// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL,
|
||||||
|
// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована
|
||||||
|
// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях
|
||||||
|
// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Токен - Строка - Токен Viber
|
||||||
|
// URL - Строка - URL для установки Webhook
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Произвольный - Ответ сервера Viber
|
||||||
|
Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
|
||||||
|
|
||||||
|
СтруктураПараметров = Новый Структура;
|
||||||
|
СтруктураПараметров.Вставить("url" , URL);
|
||||||
|
СтруктураПараметров.Вставить("auth_token", Токен);
|
||||||
|
|
||||||
|
Возврат OPI_Инструменты.PostUrlencoded("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_Инструменты.PostUrlencoded("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_Инструменты.PostUrlencoded("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", Широта);
|
||||||
|
СтруктураЛокации.Вставить("lon", Долгота);
|
||||||
|
|
||||||
|
Возврат ОтправитьСообщение(Токен, "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_Инструменты.PostUrlencoded(URL
|
||||||
|
, СтруктураПараметров
|
||||||
|
, ТокенВЗаголовки(Токен));
|
||||||
|
|
||||||
|
Попытка
|
||||||
|
Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
|
||||||
|
Исключение
|
||||||
|
Возврат Ответ;
|
||||||
|
КонецПопытки;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ВернутьСтандартныеПараметры()
|
||||||
|
|
||||||
|
СтруктураОтправителя = Новый Структура;
|
||||||
|
СтруктураОтправителя.Вставить("name" , "Bot");
|
||||||
|
СтруктураОтправителя.Вставить("avatar", "");
|
||||||
|
|
||||||
|
СтруктураПараметров = Новый Структура;
|
||||||
|
СтруктураПараметров.Вставить("sender", СтруктураОтправителя);
|
||||||
|
СтруктураПараметров.Вставить("min_api_version", 1);
|
||||||
|
|
||||||
|
Возврат СтруктураПараметров;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ТокенВЗаголовки(Знач Токен)
|
||||||
|
|
||||||
|
СтруктураЗаголовков = Новый Соответствие;
|
||||||
|
СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен);
|
||||||
|
Возврат СтруктураЗаголовков;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
#КонецОбласти
|
11
src/CommonModules/OPI_Viber/OPI_Viber.mdo
Normal file
11
src/CommonModules/OPI_Viber/OPI_Viber.mdo
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?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>
|
574
src/CommonModules/OPI_Инструменты/Module.bsl
Normal file
574
src/CommonModules/OPI_Инструменты/Module.bsl
Normal file
@@ -0,0 +1,574 @@
|
|||||||
|
//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ВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
|
||||||
|
Исключение
|
||||||
|
ТелоОтвета = Ответ.ПолучитьТелоКакДвоичныеДанные()
|
||||||
|
КонецПопытки;
|
||||||
|
|
||||||
|
Возврат ТелоОтвета;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция Post(Знач 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") <> Неопределено Тогда
|
||||||
|
Если Ответ.Заголовки.Получить("Content-Encoding") = "gzip" Тогда
|
||||||
|
Ответ = РаспаковатьОтвет(Ответ);
|
||||||
|
КонецЕсли;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат ?(ТипЗнч(Ответ) = Тип("ДвоичныеДанные"), JsonВСтруктуру(Ответ), Ответ);
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция PostUrlencoded(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "") Экспорт
|
||||||
|
|
||||||
|
Если Не ЗначениеЗаполнено(Параметры) Тогда
|
||||||
|
Параметры = Новый Структура;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
СтруктураURL = РазбитьURL(URL);
|
||||||
|
|
||||||
|
Заголовки = Новый Соответствие();
|
||||||
|
Заголовки.Вставить("Content-Type" , "application/x-www-form-urlencoded");
|
||||||
|
Заголовки.Вставить("Accept-Encoding" , "gzip");
|
||||||
|
Заголовки.Вставить("Accept" , "*/*");
|
||||||
|
Заголовки.Вставить("Connection" , "keep-alive");
|
||||||
|
|
||||||
|
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
|
||||||
|
|
||||||
|
Для Каждого Заголовок Из ДопЗаголовки Цикл
|
||||||
|
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Соединение = Новый HTTPСоединение(СтруктураURL["Сервер"],443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
|
||||||
|
НовыйЗапрос = Новый HTTPЗапрос(СтруктураURL["Адрес"], Заголовки);
|
||||||
|
|
||||||
|
Данные = JSONСтрокой(Параметры);
|
||||||
|
НовыйЗапрос.УстановитьТелоИзСтроки(Данные);
|
||||||
|
|
||||||
|
Ответ = Соединение.ВызватьHTTPМетод("POST", НовыйЗапрос);
|
||||||
|
|
||||||
|
Если Ответ.Заголовки.Получить("Content-Encoding") <> Неопределено Тогда
|
||||||
|
Если Ответ.Заголовки.Получить("Content-Encoding") = "gzip" Тогда
|
||||||
|
Ответ = РаспаковатьОтвет(Ответ);
|
||||||
|
КонецЕсли;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат ?(ТипЗнч(Ответ) = Тип("ДвоичныеДанные"), JsonВСтруктуру(Ответ), Ответ);
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
|
||||||
|
|
||||||
|
СоответствиеВозврата = Новый Соответствие;
|
||||||
|
КоличествоЧастей = 2;
|
||||||
|
МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь);
|
||||||
|
|
||||||
|
Для Каждого Параметр Из МассивПараметров Цикл
|
||||||
|
|
||||||
|
МассивКлючЗначение = СтрРазделить(Параметр, "=");
|
||||||
|
|
||||||
|
|
||||||
|
Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда
|
||||||
|
СоответствиеВозврата.Вставить(МассивКлючЗначение[0]
|
||||||
|
, МассивКлючЗначение[1]);
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Возврат СоответствиеВозврата;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Процедура ЗаменитьСпецСимволы(Текст) Экспорт
|
||||||
|
|
||||||
|
МассивСимволов = Новый Соответствие;
|
||||||
|
МассивСимволов.Вставить("<", "<");
|
||||||
|
МассивСимволов.Вставить(">", ">");
|
||||||
|
МассивСимволов.Вставить("&", "&");
|
||||||
|
МассивСимволов.Вставить("_", " ");
|
||||||
|
МассивСимволов.Вставить("[", "(");
|
||||||
|
МассивСимволов.Вставить("]", ")");
|
||||||
|
|
||||||
|
Для Каждого СимволМассива Из МассивСимволов Цикл
|
||||||
|
Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение);
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
#Область Служебные
|
||||||
|
|
||||||
|
Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт
|
||||||
|
|
||||||
|
Если Параметры.Количество() = 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.Нет, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
|
||||||
|
ЗаписьJSON = Новый ЗаписьJSON;
|
||||||
|
ЗаписьJSON.ПроверятьСтруктуру = Истина;
|
||||||
|
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
|
||||||
|
|
||||||
|
ЗаписатьJSON(ЗаписьJSON, Данные);
|
||||||
|
Возврат ЗаписьJSON.Закрыть();
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ЧислоВСтроку(Знач Число) Экспорт
|
||||||
|
Возврат СтрЗаменить(Строка(Число), Символы.НПП, "");
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
#Область БСП
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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 По Количество Цикл
|
||||||
|
Части.Добавить(Строка);
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Возврат СтрСоединить(Части, "");
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
#Область СлужебныеПроцедурыИФункции
|
||||||
|
|
||||||
|
#Область 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 и выше
|
||||||
|
|
||||||
|
Функция РаспаковатьОтвет(Ответ)
|
||||||
|
|
||||||
|
Заголовок = Ответ.Заголовки.Получить("Content-Encoding");
|
||||||
|
Если Заголовок <> Неопределено Тогда
|
||||||
|
Если НРег(Заголовок) = "gzip" Тогда
|
||||||
|
Возврат Прочитать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
|
||||||
|
|
||||||
|
Возврат Буфер;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
#КонецОбласти
|
11
src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo
Normal file
11
src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?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>
|
44
src/Configuration/Configuration.mdo
Normal file
44
src/Configuration/Configuration.mdo
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
<?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.9</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_Telegram</commonModules>
|
||||||
|
<commonModules>CommonModule.OPI_Viber</commonModules>
|
||||||
|
<commonModules>CommonModule.OPI_VK</commonModules>
|
||||||
|
<commonModules>CommonModule.OPI_GoogleWorkspace</commonModules>
|
||||||
|
<dataProcessors>DataProcessor.Стенд</dataProcessors>
|
||||||
|
</mdclass:Configuration>
|
12
src/Configuration/HomePageWorkArea.hpwa
Normal file
12
src/Configuration/HomePageWorkArea.hpwa
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<hpwa:HomePageWorkArea xmlns:hpwa="http://g5.1c.ru/v8/dt/hpwa">
|
||||||
|
<columns>
|
||||||
|
<items>
|
||||||
|
<form>DataProcessor.Стенд.Form.Форма</form>
|
||||||
|
<height>10</height>
|
||||||
|
<visibility>
|
||||||
|
<common>true</common>
|
||||||
|
</visibility>
|
||||||
|
</items>
|
||||||
|
</columns>
|
||||||
|
</hpwa:HomePageWorkArea>
|
Reference in New Issue
Block a user