07.12.2021

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

Облачные хранилища стали набирать популярность достаточно давно. Например, сервис 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.




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

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


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


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


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

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


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

  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.php
  5. Допишите получение и запись токена OneDrive в json файл:
  6. После этого еще немного изменим наш код:

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

  #!/usr/bin/php define("NO_KEEP_STATISTIC", true); define("NOT_CHECK_PERMISSIONS", true); $_SERVER["DOCUMENT_ROOT"] = "/home/bitrix/ext_www/jazz-way.ru"; 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; if (CModule::IncludeModule("form")){ // ID веб-формы $FORM_ID = 1; CForm::GetResultAnswerArray($FORM_ID, $arrColumns, $arrAnswers, $arrAnswersVarname, false); $i = 0; foreach ($arrAnswers as $keys => $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, доработать ее под ваши нужды, разработать приложение, проконсультировать по вопросам автоматизации бизнес-процессов.

Оперативно и совершенно бесплатно ответим на Ваши вопросы!
0