Интеграция сайта с OneDrive
Облачные хранилища стали набирать популярность достаточно давно. Например, сервис OneDrive, в то время он назывался SkyDrive, впервые стал известен для широкой публики в 2007 году, а уже через год доступ к нему имели жители более 60 стран. В том же 2008 году размер предоставляемого места был увеличен до 25 Гб — кажется, что для того времени это неприлично много, но на самом деле компания пошла на этот шаг для того, чтобы сразу интегрировать все свои сервисы с облаком.
Сегодня мы уже привыкли к тому, что отснятые фотографии и видеоролики автоматически сохраняются в облаке: Google Диск для платформы Android или iCloud для устройств от Apple. Сложно представить современную, нацеленную на развитие компанию, где вся документация хранилась бы локально на каждом компьютере, а для обмена информацией использовались бы флешки или электронная почта.
При использовании OneDrive появляется возможность:
- хранить изображения и работать с ними;
- тонко настраивать права доступа других пользователей к папкам и файлам;
- прямо из браузера создавать и работать с документами Word, таблицами Excel и презентациями PowerPoint;
- организовывать совместную работу над проектами.
Выходит, что облачное хранилище, это не просто место, куда можно скинуть старые фото, хранить там различные файлы, которые когда-то могут понадобиться. Облачное хранилище — это серьезный инструмент, который поможет повысить эффективность работы сайта без серьезных инвестиций в покупку собственных серверов и организации нужной инфраструктуры.
Место в облачном хранилище можно использовать так же, как и обычное дисковое пространство физического сервера. Единственное препятствие заключается в том, что изначально Битрикс не дает возможности автоматизировать подключение к сайту сторонних облачных сервисов хранения данных — это нужно сделать самостоятельно, если вы, конечно, обладаете требуемым уровнем квалификации.
Подключение OneDrive к сайту
Рассмотрим на примере конкретной задачи, заключающейся в том, чтобы реализовать синхронизацию списка заявок с формы обратной связи в OneDrive. Основная сложность заключается в короткой жизни токена — это осложняет задачу реализовать загрузку и бесперебойный обмен API с сайтом.
Чтобы ее решить, необходимо выполнить следующее:
- Выгрузить список результатов формы в файл.
- Настроить OneDrive API.
- Интегрировать.
Решение
Создайте папку и в ней файл 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 файла:
- index.php — уже есть.
- config.php.
- 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:
- Зайдите в Microsoft Azure и пройдите по пути, указанному на скриншотах 1,2 и 3.
2. Пропишите необходимые данные и настройки. Для этого выберите наше приложение
3. Далее выберите:
создайте секрет и скопируйте значение, когда оно полностью показано, его будет видно только один раз, больше вы его не сможете посмотреть.
Вставьте его в config.php
Затем скопируйте ID приложения:
и вставьте в config.php.
После внесения этих настроек остается выполнить еще несколько операций, так как библиотека krizalys / onedrive-php-sdk
была написана с использованием старой версии guzzle, то необходимо будет найти места, где встречается старый метод stream_for
и заменить его на новый метод Utils::streamFor()
.
Загрузка файла
- Откройте файл index.php на сайте — вас перекинет на страницу авторизации (не забудьте указать ссылку редиректа в кабинете приложения).
- После успешной авторизации будет выполнен редирект обратно на страницу Index.php, но уже с GET параметрами, благодаря которым мы получим access_token и refresh_token для того, чтобы в дальнейшем обеспечить бесперебойную авторизацию с OneDrive API.
- Мы проверили успешную генерацию токена, но теперь появился вопрос: «Как сделать автообновление
access_token
OneDrive API?». - Нужно сохранить информацию с токеном в json файл. Для этого допишите функцию
getToken()
и сразу жеsetTokens()
в/vendor/krizalys/onedrive-php-sdk/src/Client.php
- Допишите получение и запись токена OneDrive в json файл:
- После этого еще немного изменим наш код:
В итоге должно получиться вот так:
#!/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, доработать ее под ваши нужды, разработать приложение, проконсультировать по вопросам автоматизации бизнес-процессов.