1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-11-28 09:08:38 +02:00

Преобразование OPI -> OInt (workflow)

This commit is contained in:
Vitaly the Alpaca 2024-05-19 10:20:10 +00:00 committed by Vitaly the Alpaca (bot)
parent c8ea5aba5f
commit 977170f7dd
9 changed files with 2149 additions and 860 deletions

174
.github/workflows/oint_test_Dropbox.yml vendored Normal file
View File

@ -0,0 +1,174 @@

name: OINT | Тестирование Dropbox
# Controls when the workflow will run
on:
workflow_dispatch:
jobs:
Decode:
runs-on: ubuntu-latest
if: ${{ always() }}
steps:
- uses: actions/checkout@v4
- name: Расшифровать тестовые данные
run: gpg --quiet --batch --yes --decrypt --passphrase="$ENC_JSON" --output ./data.json ./data.json.gpg
env:
ENC_JSON: ${{ secrets.ENC_JSON }}
- name: Записать тестовые данные в кэш
uses: actions/cache/save@v3
with:
key: test-data
path: ./data.json
Build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: otymko/setup-onescript@v1.4
with:
version: 1.9.0
- name: Установить asserts и 1testrunner
run: |
opm install asserts
opm install 1testrunner
- name: Установить OInt
run: |
cd ./OInt
opm build
opm install *.ospx
- name: Записать артефакт
uses: actions/upload-artifact@v4
with:
name: oint
path: ./OInt/*.ospx
Testing-Dropbox:
runs-on: ubuntu-latest
needs: [Decode, Build]
steps:
- uses: actions/checkout@v2
- uses: otymko/setup-onescript@v1.4
with:
version: 1.9.0
- name: Получить тестовые данные из кэша
uses: actions/cache/restore@v3
with:
key: test-data
path: ./data.json
- name: Установить asserts и 1testrunner
run: |
opm install asserts
opm install 1testrunner
- name: Установить OInt
run: |
cd ./OInt
opm build
opm install *.ospx
- name: Получить/Обновить токен
if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "ДропБокс_ПолучитьОбновитьТокен"
- name: Загрузить файл
if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "ДропБокс_ЗагрузитьФайл"
- name: Записать логи
uses: actions/upload-artifact@v4
with:
name: Dropbox
path: ./test_logs
- name: Записать измененные данные
if: ${{ cancelled() }} == false
uses: actions/cache/save@v3
with:
key: test-data_new
path: ./data.json
Encode:
runs-on: ubuntu-latest
needs: [Testing-Dropbox]
if: ${{ always() }}
permissions:
contents: write
steps:
- uses: actions/checkout@v2
- name: Обновить данные в репозитории
run: git pull https://github.com/Bayselonarrend/OpenIntegrations
- name: Получить тестовые данные из кэша
uses: actions/cache/restore@v3
with:
key: test-data_new
path: ./data.json
- name: Зашифровать данные обратно
continue-on-error: false
run: |
rm -f ./data.json.gpg
gpg --batch --symmetric --cipher-algo AES256 --passphrase="$ENC_JSON" data.json
rm -f ./data.json
env:
ENC_JSON: ${{ secrets.ENC_JSON }}
- name: Записать данные
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_user_name: Vitaly the Alpaca (bot)
commit_user_email: vitaly.the.alpaca@gmail.com
commit_author: Vitaly the Alpaca <vitaly.the.alpaca@gmail.com>
commit_message: Обновление зашифрованных данных по результатам тестов (workflow)
Clear-Cache:
runs-on: ubuntu-latest
needs: [Testing-Dropbox, Encode]
if: ${{ always() }}
steps:
- name: Очистка основного кэша
run: |
curl -L \
-X DELETE \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/Bayselonarrend/OpenIntegrations/actions/caches?key=test-data"
- name: Очистка кэша Google
run: |
curl -L \
-X DELETE \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/Bayselonarrend/OpenIntegrations/actions/caches?key=test-data_google"
- name: Очистка кэша Twitter
run: |
curl -L \
-X DELETE \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/Bayselonarrend/OpenIntegrations/actions/caches?key=test-data_new"

View File

@ -91,10 +91,6 @@ jobs:
if: ${{ cancelled() }} == false if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_УстановитьWebhook" run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_УстановитьWebhook"
- name: Удалить Webhook
if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_УдалитьWebhook"
- name: Отправить текстовое сообщение - name: Отправить текстовое сообщение
if: ${{ cancelled() }} == false if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_ОтправитьТекстовоеСообщение" run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_ОтправитьТекстовоеСообщение"
@ -163,10 +159,6 @@ jobs:
if: ${{ cancelled() }} == false if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_СоздатьУдалитьТемуФорума" run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_СоздатьУдалитьТемуФорума"
- name: Открыть/Закрыть главную тему
if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_ОткрытьЗакрытьГлавнуюТему"
- name: Изменить имя главной темы - name: Изменить имя главной темы
if: ${{ cancelled() }} == false if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_ИзменитьИмяГлавнойТемы" run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_ИзменитьИмяГлавнойТемы"

View File

@ -91,10 +91,6 @@ jobs:
if: ${{ cancelled() }} == false if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_УстановитьWebhook" run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_УстановитьWebhook"
- name: Удалить Webhook
if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_УдалитьWebhook"
- name: Отправить текстовое сообщение - name: Отправить текстовое сообщение
if: ${{ cancelled() }} == false if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_ОтправитьТекстовоеСообщение" run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_ОтправитьТекстовоеСообщение"
@ -163,10 +159,6 @@ jobs:
if: ${{ cancelled() }} == false if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_СоздатьУдалитьТемуФорума" run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_СоздатьУдалитьТемуФорума"
- name: Открыть/Закрыть главную тему
if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_ОткрытьЗакрытьГлавнуюТему"
- name: Изменить имя главной темы - name: Изменить имя главной темы
if: ${{ cancelled() }} == false if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_ИзменитьИмяГлавнойТемы" run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Телеграм_ИзменитьИмяГлавнойТемы"
@ -864,10 +856,48 @@ jobs:
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "АТ_СоздатьУдалитьЗаписи" run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "АТ_СоздатьУдалитьЗаписи"
Testing-Dropbox:
runs-on: ubuntu-latest
needs: [Decode, Build]
steps:
- uses: actions/checkout@v2
- uses: otymko/setup-onescript@v1.4
with:
version: 1.9.0
- name: Получить тестовые данные из кэша
uses: actions/cache/restore@v3
with:
key: test-data
path: ./data.json
- name: Установить asserts и 1testrunner
run: |
opm install asserts
opm install 1testrunner
- name: Установить OInt
run: |
cd ./OInt
opm build
opm install *.ospx
- name: Получить/Обновить токен
if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "ДропБокс_ПолучитьОбновитьТокен"
- name: Загрузить файл
if: ${{ cancelled() }} == false
run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "ДропБокс_ЗагрузитьФайл"
- name: Записать логи - name: Записать логи
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: Airtable name: Dropbox
path: ./test_logs path: ./test_logs
Encode: Encode:
@ -911,7 +941,7 @@ jobs:
Clear-Cache: Clear-Cache:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [Testing-Telegram, Testing-VK, Testing-Viber, Testing-Twitter, Testing-YandexDisk, Testing-GoogleWorkspace, Testing-GoogleCalendar, Testing-GoogleDrive, Testing-GoogleSheets, Testing-Notion, Testing-Slack, Testing-Airtable, Encode] needs: [Testing-Telegram, Testing-VK, Testing-Viber, Testing-Twitter, Testing-YandexDisk, Testing-GoogleWorkspace, Testing-GoogleCalendar, Testing-GoogleDrive, Testing-GoogleSheets, Testing-Notion, Testing-Slack, Testing-Airtable, Testing-Dropbox, Encode]
if: ${{ always() }} if: ${{ always() }}
steps: steps:
- name: Очистка основного кэша - name: Очистка основного кэша

View File

@ -623,7 +623,7 @@
#Область СлужебныеПроцедурыИФункции #Область СлужебныеПроцедурыИФункции
Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт Функция ПолучитьЗаголовокАвторизации(Знач Токен)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

View File

@ -0,0 +1,294 @@
// Расположение OS: ./OInt/core/Modules/OPI_Dropbox.os
// Библиотека: Dropbox
// Команда CLI: dropbox
// 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
// BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область Авторизация
// Получить ссылку авторизации
// Генерирует ссылку авторизации для перехода в браузере
//
// Параметры:
// КлючПриложения - Строка - Ключ приложения - appkey
//
// Возвращаемое значение:
// Строка - URL для перехода в браузере
Функция ПолучитьСсылкуАвторизации(Знач КлючПриложения) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(КлючПриложения);
Возврат "https://www.dropbox.com/oauth2/authorize?client_id="
+ КлючПриложения
+ "&response_type=code&token_access_type=offline";
КонецФункции
// Получить токен
// Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации
//
// Параметры:
// КлючПриложения - Строка - Ключ приложения - appkey
// СекретПриложения - Строка - Секрет приложения - appsecret
// Код - Строка - Код со страницы авторизации - code
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
Функция ПолучитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач Код) Экспорт
URL = "https://api.dropbox.com/oauth2/token";
ТипДанных = "application/x-www-form-urlencoded; charset=utf-8";
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("code" , Код , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("grant_type", "authorization_code", "Строка", Параметры);
СтруктураURL = OPI_Инструменты.РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
Запрос = OPI_Инструменты.СоздатьЗапрос(Адрес, , ТипДанных);
Соединение = OPI_Инструменты.СоздатьСоединение(Сервер, КлючПриложения, СекретПриложения);
СтрокаПараметров = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
Запрос.УстановитьТелоИзСтроки(Данные);
Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
КонецФункции
// Обновить токен
// Получает новый токен на основе рефреш токена
//
// Параметры:
// КлючПриложения - Строка - Ключ приложения - appkey
// СекретПриложения - Строка - Секрет приложения - appsecret
// РефрешТокен - Строка - Рефреш токен - refresh
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
Функция ОбновитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач РефрешТокен) Экспорт
URL = "https://api.dropbox.com/oauth2/token";
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("refresh_token", РефрешТокен , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("grant_type" , "refresh_token" , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("client_id" , КлючПриложения , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("client_secret", СекретПриложения, "Строка", Параметры);
Ответ = OPI_Инструменты.Post(URL, Параметры, , Ложь);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область РаботаСФайлами
// Загрузить файл
// Загружает файл на облачный диск
//
// Параметры:
// Токен - Строка - Токен - token
// Файл - Строка, ДвоичныеДанные - Данные файл для загрузки - file
// Путь - Строка - Путь сохранения на Dropbox - path
// Перезаписывать - Булево - Перезаписывать файл при конфликте путей - overwrite
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
Режим = ?(Перезаписывать, "overwrite", "add");
Размер = Файл.Размер();
Граница = 100000000;
Если Размер > Граница Тогда
Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим);
Иначе
Ответ = ЗагрузитьМалыйФайл(Токен, Файл, Путь, Режим);
КонецЕсли;
Возврат Ответ;
КонецФункции
Функция УдалитьФайл(Знач Токен, Знач Путь) Экспорт
URL = "https://api.dropboxapi.com/2/files/delete_v2";
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Параметры);
Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПолучитьЗаголовкиЗапроса(Знач Токен, Знач Параметры = "")
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization" , "Bearer " + Токен);
Если ЗначениеЗаполнено(Параметры) Тогда
JSON = OPI_Инструменты.JSONСтрокой(Параметры, "Нет");
JSON = СтрЗаменить(JSON, Символы.ВК + Символы.ПС, "");
Заголовки.Вставить("Dropbox-API-Arg", JSON);
КонецЕсли;
Возврат Заголовки;
КонецФункции
Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
URL = "https://content.dropboxapi.com/2/files/upload_session/append_v2";
РазмерЧасти = 100000000;
ТекущаяПозиция = 0;
ПрочитаноБайт = 0;
ОбщийРазмер = Файл.Размер();
Сессия = ОткрытьСессию(Токен);
Пока ПрочитаноБайт < ОбщийРазмер Цикл
Отступ = ТекущаяПозиция;
Курсор = Новый Структура("offset,session_id", Отступ, Сессия);
Параметры = Новый Структура("cursor", Курсор);
Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
ЧтениеДанных = Новый ЧтениеДанных(Файл);
ПрочитаноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция);
Результат = ЧтениеДанных.Прочитать(РазмерЧасти);
ТекущиеДанные = Результат.ПолучитьДвоичныеДанные();
РазмерТекущих = ТекущиеДанные.Размер();
СледующаяПозиция = ТекущаяПозиция + РазмерТекущих;
Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
Прервать;
КонецЕсли;
Ответ = OPI_Инструменты.PostBinary(URL, ТекущиеДанные, Заголовки);
ТекущаяПозиция = СледующаяПозиция;
КБайт = 1024;
МБайт = КБайт * КБайт;
Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
ВыполнитьСборкуМусора();
ОсвободитьОбъект(ТекущиеДанные);
КонецЦикла;
Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия);
Возврат Ответ;
КонецФункции
Функция ЗагрузитьМалыйФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
URL = "https://content.dropboxapi.com/2/files/upload";
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("autorename" , Ложь , "Булево", Параметры);
OPI_Инструменты.ДобавитьПоле("mode" , Режим, "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("mute" , Ложь , "Булево", Параметры);
OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("strict_conflict", Ложь , "Булево", Параметры);
Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
Ответ = OPI_Инструменты.PostBinary(URL, Файл, Заголовки);
Возврат Ответ;
КонецФункции
Функция ОткрытьСессию(Знач Токен)
SessionId = "session_id";
URL = "https://content.dropboxapi.com/2/files/upload_session/start";
Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
Возврат Ответ[SessionId];
КонецФункции
Функция ЗакрытьСессию(Знач Токен, Знач Путь, Знач Режим, Знач ОбщийРазмер, Знач Сессия)
URL = "https://content.dropboxapi.com/2/files/upload_session/finish";
Коммит = Новый Структура();
OPI_Инструменты.ДобавитьПоле("mode", Режим, "Строка", Коммит);
OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Коммит);
Курсор = Новый Структура("offset,session_id", ОбщийРазмер, Сессия);
Параметры = Новый Структура("commit,cursor", Коммит, Курсор);
Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти

View File

@ -1,19 +1,20 @@
<package-def> <package-def>
<module name="OPI_GoogleCalendar" file="core/Modules/OPI_GoogleCalendar.os"/> <module name="OPI_GoogleCalendar" file="core/Modules/OPI_GoogleCalendar.os"/>
<module name="OPI_Airtable" file="core/Modules/OPI_Airtable.os"/>
<module name="OPI_Twitter" file="core/Modules/OPI_Twitter.os"/>
<module name="OPI_Slack" file="core/Modules/OPI_Slack.os"/>
<module name="OPI_Viber" file="core/Modules/OPI_Viber.os"/>
<module name="OPI_GoogleDrive" file="core/Modules/OPI_GoogleDrive.os"/>
<module name="OPI_Notion" file="core/Modules/OPI_Notion.os"/>
<module name="OPI_YandexID" file="core/Modules/OPI_YandexID.os"/>
<module name="OPI_ПолучениеДанныхТестов" file="tools/Modules/OPI_ПолучениеДанныхТестов.os"/>
<module name="OPI_GoogleSheets" file="core/Modules/OPI_GoogleSheets.os"/>
<module name="OPI_ПреобразованиеТипов" file="tools/Modules/OPI_ПреобразованиеТипов.os"/>
<module name="OPI_Telegram" file="core/Modules/OPI_Telegram.os"/>
<module name="OPI_YandexDisk" file="core/Modules/OPI_YandexDisk.os"/>
<module name="OPI_GoogleWorkspace" file="core/Modules/OPI_GoogleWorkspace.os"/>
<module name="OPI_Инструменты" file="tools/Modules/internal/Modules/OPI_Инструменты.os"/> <module name="OPI_Инструменты" file="tools/Modules/internal/Modules/OPI_Инструменты.os"/>
<module name="OPI_Notion" file="core/Modules/OPI_Notion.os"/>
<module name="OPI_Telegram" file="core/Modules/OPI_Telegram.os"/>
<module name="OPI_GoogleDrive" file="core/Modules/OPI_GoogleDrive.os"/>
<module name="OPI_ПолучениеДанныхТестов" file="tools/Modules/OPI_ПолучениеДанныхТестов.os"/>
<module name="OPI_Twitter" file="core/Modules/OPI_Twitter.os"/>
<module name="OPI_Viber" file="core/Modules/OPI_Viber.os"/>
<module name="OPI_ПреобразованиеТипов" file="tools/Modules/OPI_ПреобразованиеТипов.os"/>
<module name="OPI_GoogleWorkspace" file="core/Modules/OPI_GoogleWorkspace.os"/>
<module name="OPI_YandexDisk" file="core/Modules/OPI_YandexDisk.os"/>
<module name="OPI_Dropbox" file="core/Modules/OPI_Dropbox.os"/>
<module name="OPI_Airtable" file="core/Modules/OPI_Airtable.os"/>
<module name="OPI_Slack" file="core/Modules/OPI_Slack.os"/>
<module name="OPI_GoogleSheets" file="core/Modules/OPI_GoogleSheets.os"/>
<module name="OPI_YandexID" file="core/Modules/OPI_YandexID.os"/>
<module name="OPI_VK" file="core/Modules/OPI_VK.os"/> <module name="OPI_VK" file="core/Modules/OPI_VK.os"/>
<module name="OPI_Криптография" file="tools/Modules/internal/Modules/OPI_Криптография.os"/> <module name="OPI_Криптография" file="tools/Modules/internal/Modules/OPI_Криптография.os"/>
</package-def> </package-def>

File diff suppressed because it is too large Load Diff

View File

@ -59,6 +59,7 @@
Разделы.Вставить("Notion" , СтандартныеЗависимости); Разделы.Вставить("Notion" , СтандартныеЗависимости);
Разделы.Вставить("Slack" , СтандартныеЗависимости); Разделы.Вставить("Slack" , СтандартныеЗависимости);
Разделы.Вставить("Airtable" , СтандартныеЗависимости); Разделы.Вставить("Airtable" , СтандартныеЗависимости);
Разделы.Вставить("Dropbox" , СтандартныеЗависимости);
Возврат Разделы; Возврат Разделы;
@ -78,6 +79,7 @@
Слак = "Slack"; Слак = "Slack";
Таблицы = "GoogleSheets"; Таблицы = "GoogleSheets";
АирТ = "Airtable"; АирТ = "Airtable";
ДропБокс = "Dropbox";
ТаблицаТестов = Новый ТаблицаЗначений; ТаблицаТестов = Новый ТаблицаЗначений;
ТаблицаТестов.Колонки.Добавить("Метод"); ТаблицаТестов.Колонки.Добавить("Метод");
@ -87,7 +89,6 @@
НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьИнформациюБота" , "Получить информацию бота" , Телеграм); НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьИнформациюБота" , "Получить информацию бота" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьОбновления" , "Получить обновления" , Телеграм); НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьОбновления" , "Получить обновления" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_УстановитьWebhook" , "Установить Webhook" , Телеграм); НовыйТест(ТаблицаТестов, "Телеграм_УстановитьWebhook" , "Установить Webhook" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_УдалитьWebhook" , "Удалить Webhook" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Телеграм); НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКартинку" , "Отправить картинку" , Телеграм); НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКартинку" , "Отправить картинку" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьВидео" , "Отправить видео" , Телеграм); НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьВидео" , "Отправить видео" , Телеграм);
@ -105,7 +106,6 @@
НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьЧислоУчастников" , "Получить число участников" , Телеграм); НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьЧислоУчастников" , "Получить число участников" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьСписокАватаровФорума", "Получить список аватаров форума", Телеграм); НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьСписокАватаровФорума", "Получить список аватаров форума", Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_СоздатьУдалитьТемуФорума" , "Создать/Удалить тему форума" , Телеграм); НовыйТест(ТаблицаТестов, "Телеграм_СоздатьУдалитьТемуФорума" , "Создать/Удалить тему форума" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОткрытьЗакрытьГлавнуюТему" , "Открыть/Закрыть главную тему" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ИзменитьИмяГлавнойТемы" , "Изменить имя главной темы" , Телеграм); НовыйТест(ТаблицаТестов, "Телеграм_ИзменитьИмяГлавнойТемы" , "Изменить имя главной темы" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_СкрытьПоказатьГлавнуюТему" , "Скрыть/Показать главную тему" , Телеграм); НовыйТест(ТаблицаТестов, "Телеграм_СкрытьПоказатьГлавнуюТему" , "Скрыть/Показать главную тему" , Телеграм);
@ -205,7 +205,10 @@
НовыйТест(ТаблицаТестов, "АТ_СоздатьТаблицу" , "Создать/Изменить таблицу" , АирТ); НовыйТест(ТаблицаТестов, "АТ_СоздатьТаблицу" , "Создать/Изменить таблицу" , АирТ);
НовыйТест(ТаблицаТестов, "АТ_СоздатьПоле" , "Создать/Изменить поле" , АирТ); НовыйТест(ТаблицаТестов, "АТ_СоздатьПоле" , "Создать/Изменить поле" , АирТ);
НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи" , "Создать/Удалить записи" , АирТ); НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи" , "Создать/Удалить записи" , АирТ);
НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьОбновитьТокен" , "Получить/Обновить токен" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайл" , "Загрузить файл" , ДропБокс);
Возврат ТаблицаТестов; Возврат ТаблицаТестов;
КонецФункции КонецФункции
@ -317,6 +320,20 @@
КонецФункции КонецФункции
Процедура ПараметрВКоллекцию(Параметр, Коллекция) Экспорт
Значение = ПолучитьПараметр(Параметр);
Коллекция.Вставить(Параметр, Значение);
КонецПроцедуры
Процедура ДвоичныеВКоллекцию(Параметр, Коллекция) Экспорт
Значение = ПолучитьДвоичные(Параметр);
Коллекция.Вставить(Параметр, Значение);
КонецПроцедуры
Процедура ЗаписатьПараметр(Параметр, Значение) Экспорт Процедура ЗаписатьПараметр(Параметр, Значение) Экспорт
Путь = ПутьКФайлуДанных(); Путь = ПутьКФайлуДанных();

View File

@ -85,6 +85,12 @@
КонецФункции КонецФункции
Функция PostBinary(Знач URL, Знач Тело, Знач ДопЗаголовки, Знач ПолныйОтвет = Ложь) Экспорт
Возврат ВыполнитьЗапросСДвоичнымиДанными(URL, "POST", Тело, ДопЗаголовки, ПолныйОтвет);
КонецФункции
#КонецОбласти #КонецОбласти
#Область ЗапросыMultipart #Область ЗапросыMultipart
@ -171,6 +177,43 @@
КонецПроцедуры КонецПроцедуры
Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "") Экспорт
Заголовки = Новый Соответствие;
Заголовки.Вставить("Accept-Encoding", "gzip");
Заголовки.Вставить("Accept" , "*/*");
Заголовки.Вставить("Connection" , "keep-alive");
Заголовки.Вставить("Accept-Charset" , "utf-8");
Если ЗначениеЗаполнено(ТипДанных) Тогда
Заголовки.Вставить("Content-Type", ТипДанных);
КонецЕсли;
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
Для Каждого Заголовок Из ДопЗаголовки Цикл
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
КонецЦикла;
КонецЕсли;
НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки);
Возврат НовыйЗапрос;
КонецФункции
Функция СоздатьСоединение(Знач Сервер, Знач Пользователь = "", Знач Пароль = "") Экспорт
Попытка
SSL = Новый ЗащищенноеСоединениеOpenSSL;
Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000, SSL);
Исключение
Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000);
КонецПопытки;
КонецФункции
#КонецОбласти #КонецОбласти
#КонецОбласти #КонецОбласти
@ -259,7 +302,7 @@
ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON); ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, Данные); ЗаписатьJSON(ЗаписьJSON, Данные,);
Возврат ЗаписьJSON.Закрыть(); Возврат ЗаписьJSON.Закрыть();
Исключение Исключение
@ -313,7 +356,11 @@
ОТД = Новый ОписаниеТипов("Дата"); ОТД = Новый ОписаниеТипов("Дата");
Дата = ОТД.ПривестиЗначение(Дата); Дата = ОТД.ПривестиЗначение(Дата);
Возврат Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧЦ=10; ЧДЦ=0; ЧГ=0"); UNIX = Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧЦ=10; ЧДЦ=0; ЧГ=0");
UNIX = СтрЗаменить(UNIX, ",", "");
UNIX = Лев(UNIX, 10);
Возврат UNIX;
КонецФункции КонецФункции
@ -490,6 +537,33 @@
КонецФункции КонецФункции
Функция ВыполнитьЗапросСДвоичнымиДанными(Знач URL, Знач Вид, Знач Данные, Знач ДопЗаголовки, Знач ПолныйОтвет)
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, "application/octet-stream");
Соединение = СоздатьСоединение(Сервер);
Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
Если ЭтоПереадресация(Ответ) Тогда
Ответ = ВыполнитьЗапросСДвоичнымиДанными(Ответ.Заголовки["Location"]
, Вид
, Данные
, ДопЗаголовки
, ПолныйОтвет);
Иначе
ОбработатьОтвет(Ответ, ПолныйОтвет);
КонецЕсли;
Возврат Ответ;
КонецФункции
Функция ВыполнитьЗапросБезТела(Знач URL Функция ВыполнитьЗапросБезТела(Знач URL
, Знач Вид , Знач Вид
, Знач Параметры = "" , Знач Параметры = ""
@ -661,43 +735,6 @@
КонецФункции КонецФункции
Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "")
Заголовки = Новый Соответствие;
Заголовки.Вставить("Accept-Encoding", "gzip");
Заголовки.Вставить("Accept" , "*/*");
Заголовки.Вставить("Connection" , "keep-alive");
Заголовки.Вставить("Accept-Charset" , "utf-8");
Если ЗначениеЗаполнено(ТипДанных) Тогда
Заголовки.Вставить("Content-Type", ТипДанных);
КонецЕсли;
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
Для Каждого Заголовок Из ДопЗаголовки Цикл
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
КонецЦикла;
КонецЕсли;
НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки);
Возврат НовыйЗапрос;
КонецФункции
Функция СоздатьСоединение(Знач Сервер)
Попытка
SSL = Новый ЗащищенноеСоединениеOpenSSL;
Возврат Новый HTTPСоединение(Сервер, 443, , , , 3000, SSL);
Исключение
Возврат Новый HTTPСоединение(Сервер, 443, , , , 3000);
КонецПопытки;
КонецФункции
Функция ЭтоПереадресация(Знач Ответ) Функция ЭтоПереадресация(Знач Ответ)
Переадресация = 300; Переадресация = 300;