logo

Интеграция сайта с OneDrive


Автор:
Издатель: logo Integrator.Digital

Облачные хранилища стали набирать популярность достаточно давно. Например, сервис OneDrive, в то время он назывался SkyDrive, впервые стал известен для широкой публики в 2007 году, а уже через год доступ к нему имели жители более 60 стран. В том же 2008 году размер предоставляемого места был увеличен до 25 Гб — кажется, что для того времени это неприлично много, но на самом деле компания пошла на этот шаг для того, чтобы сразу интегрировать все свои сервисы с облаком.

Сегодня мы уже привыкли к тому, что отснятые фотографии и видеоролики автоматически сохраняются в облаке: Google Диск для платформы Android или iCloud для устройств от Apple. Сложно представить современную, нацеленную на развитие компанию, где вся документация хранилась бы локально на каждом компьютере, а для обмена информацией использовались бы флешки или электронная почта.

При использовании OneDrive появляется возможность:

  • хранить изображения и работать с ними;
  • тонко настраивать права доступа других пользователей к папкам и файлам;
  • прямо из браузера создавать и работать с документами Word, таблицами Excel и презентациями PowerPoint;
  • организовывать совместную работу над проектами.

Выходит, что облачное хранилище, это не просто место, куда можно скинуть старые фото, хранить там различные файлы, которые когда-то могут понадобиться. Облачное хранилище — это серьезный инструмент, который поможет повысить эффективность работы сайта без серьезных инвестиций в покупку собственных серверов и организации нужной инфраструктуры.

Место в облачном хранилище можно использовать так же, как и обычное дисковое пространство физического сервера. Единственное препятствие заключается в том, что изначально Битрикс не дает возможности автоматизировать подключение к сайту сторонних облачных сервисов хранения данных — это нужно сделать самостоятельно, если вы, конечно, обладаете требуемым уровнем квалификации.

Подключение OneDrive к сайту

Рассмотрим на примере конкретной задачи, заключающейся в том, чтобы реализовать синхронизацию списка заявок с формы обратной связи в OneDrive. Основная сложность заключается в короткой жизни токена — это осложняет задачу реализовать загрузку и бесперебойный обмен API с сайтом.

Чтобы ее решить, необходимо выполнить следующее:

  1. Выгрузить список результатов формы в файл.
  2. Настроить OneDrive API.
  3. Интегрировать.

Решение

Создайте папку и в ней файл index.php, содержащий:

if (CModule::IncludeModule("form")){
 // ID веб-формы
 $FORM_ID = 1;

 CForm::GetResultAnswerArray($FORM_ID,
 $arrColumns,
 $arrAnswers,
 $arrAnswersVarname,
 false);
 foreach ($arrAnswers as $keys => $values) {
 $arr[$keys] = $values;
 }
 foreach ($arr as $key => $value) {
 $arrs[] = $value;
 }

Установите библиотеку composer require krizalys/onedrive-php-sdk

В созданной папке создайте 3 файла:

  1. index.php — уже есть.
  2. config.php.
  3. redirect.php.

Содержимое файла config.php:

 '',

 /**
 * Your OneDrive client secret.
 */
 'ONEDRIVE_CLIENT_SECRET' => '',

 /**
 * Your OneDrive redirect URI.
 */
 'ONEDRIVE_REDIRECT_URI' => 'http://your.domain.com/redirect.php',
];

Содержимое файла Index.php:

#!/usr/bin/php
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
$_SERVER["DOCUMENT_ROOT"] = "/home/bitrix/www";

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
set_time_limit(0);
($config = include __DIR__ . '/config.php') or die('Configuration file not found');
require_once $_SERVER["DOCUMENT_ROOT"] . '/vendor/autoload.php';

use Krizalys\Onedrive\Onedrive;
// Instantiates a OneDrive client bound to your OneDrive application.
$client = Onedrive::client($config['ONEDRIVE_CLIENT_ID']);

// Gets a log in URL with sufficient privileges from the OneDrive API.
$url = $client->getLogInUrl([
 'files.read',
 'files.read.all',
 'files.readwrite',
 'files.readwrite.all',
 'offline_access',
], $config['ONEDRIVE_REDIRECT_URI']);

session_start();
$client->obtainAccessToken($config['ONEDRIVE_CLIENT_SECRET'], $_GET['code']);
// Persist the OneDrive client' state for next API requests.
$_SESSION['onedrive.client.state'] = $client->getState();

// Redirect the user to the log in URL.
header('HTTP/1.1 302 Found', true, 302);
header("Location: $url");

После этого необходимо настроить кабинет OneDrive:

  1. Зайдите в Microsoft Azure и пройдите по пути, указанному на скриншотах 1,2 и 3.
Настройка кабинета OneDrive - 1 шаг
Настройка кабинета OneDrive - 2 этап
Настройка кабинета OneDrive - 3 этап

2. Пропишите необходимые данные и настройки. Для этого выберите наше приложение04.png
3. Далее выберите:
05.png

создайте секрет и скопируйте значение, когда оно полностью показано, его будет видно только один раз, больше вы его не сможете посмотреть.

06.png

Вставьте его в config.php

07.png

Затем скопируйте ID приложения:

08.png

и вставьте в config.php.

После внесения этих настроек остается выполнить еще несколько операций, так как библиотека krizalys / onedrive-php-sdk была написана с использованием старой версии guzzle, то необходимо будет найти места, где встречается старый метод stream_for и заменить его на новый метод Utils::streamFor().

09.png

Загрузка файла

  1. Откройте файл index.php на сайте — вас перекинет на страницу авторизации (не забудьте указать ссылку редиректа в кабинете приложения).
  2. После успешной авторизации будет выполнен редирект обратно на страницу Index.php, но уже с GET параметрами, благодаря которым мы получим access_token и refresh_token для того, чтобы в дальнейшем обеспечить бесперебойную авторизацию с OneDrive API.
  3. Мы проверили успешную генерацию токена, но теперь появился вопрос: «Как сделать автообновление access_token OneDrive API?».
  4. Нужно сохранить информацию с токеном в json файл. Для этого допишите функцию getToken() и сразу же setTokens() в /vendor/krizalys/onedrive-php-sdk/src/Client.php10.png
  5. Допишите получение и запись токена OneDrive в json файл:11.png
  6. После этого еще немного изменим наш код:12.png

В итоге должно получиться вот так:

 $values) {
 $arr[$keys] = $values;
 }
 foreach ($arr as $key => $value) {
 $arrs[] = $value;
 }
}

$client = Onedrive::client($config['ONEDRIVE_CLIENT_ID']);
// // Gets a log in URL with sufficient privileges from the OneDrive API.
$url = $client->getLogInUrl([
 'files.read',
 'files.read.all',
 'files.readwrite',
 'files.readwrite.all',
 'offline_access',
], $config['ONEDRIVE_REDIRECT_URI']);

session_start();

// Persist the OneDrive client' state for next API requests.
$curToken = file_get_contents(__DIR__.'/token.json');
$curToken = json_decode($curToken, true);
// $_SESSION['onedrive.client.state'] = ["data"=>$curToken];
$client->setTokens($curToken['access_token']);
$client->renewAccessToken($config['ONEDRIVE_CLIENT_SECRET'], $curToken['refresh_token']);
file_put_contents(__DIR__.'/token.json', \json_encode( $client->getToken() ) );

$openFile = file_get_contents(__DIR__ .'/results_form.xls');
$file = $client->getRoot()->startUpload('results_form.xls', $openFile);
$childDriveItem = $file->complete();
$logs = json_encode($childDriveItem);
file_put_contents('results_form.log', $logs);

Обновите страницу — файл успешно загружен в OneDrive с помощью API.

Варианты использования интеграции

Вариантов огромное множество. По сути, у вас появилась возможность загружать любые файлы в «облако» OneDrive. Оно может служить местом для дополнительного бекапа данных, собираемых с сайта, или для любой другой информации. Кстати! Если у вас есть интересные идеи для использования такой интеграции, то напишите нам.

Мы уже длительное время занимаемся разработкой различных IT-решений, помогающих бизнесу развиваться и эффективнее работать за счет автоматизации рутинных процессов. Можем выполнить внедрение CRM, доработать ее под ваши нужды, разработать приложение, проконсультировать по вопросам автоматизации бизнес-процессов.



  • Комментарии
Загрузка комментариев...

Ответим на комментарии online!

БЕСПЛАТНО! Ответим на Ваши вопросы!
Нажимая кнопку "Спросить", я даю свое согласие на обработку моих персональных данных, в соответствии с Федеральным законом от 27.07.2006 года №152-Ф3 "О персональных данных", на условиях и для целей, определенных в Согласии на обработку персональных данных.