...
WEB и WordPress новости, темы, плагины. Здесь мы делимся советами и лучшими решениями для сайтов.

Запись данных в лист OneDrive с помощью Microsoft Graph API и PHP

119

Недавно я опубликовал статью «Как интегрировать Google Sheets API с PHP», в которой я объяснил, как записывать данные в Google Sheet с помощью PHP и Google API. Один из читателей аналогичным образом спросил, как записывать данные в OneDrive Sheet. В этом руководстве мы изучим, как использовать Microsoft Graph API и PHP для записи данных в OneDrive Sheet.

API Microsoft Graph следует за потоком OAuth для авторизации. Это означает, что нам нужно сгенерировать токен доступа с помощью процесса OAuth. Для этого вам необходимо сначала зарегистрировать приложение и получить свои учетные данные.

Зарегистрируйте приложение и создайте учетные данные

При интеграции процесса OAuth вам необходимо иметь идентификатор клиента и секрет клиента. Вы получите его после регистрации приложений. Можно выполнить шаги, указанные на этой странице, и зарегистрировать свое приложение в Microsoft.

Войдите на портал Azure и выполните поиск по запросу «Регистрация приложения». Заполните форму. Вам необходимо передать URL-адрес в поле URI перенаправления. В это поле я передаю URL-адрес локального сервера. callback.phpНа следующих шагах я создам. Я заполнил детали, как показано на скриншоте ниже.

Запись данных в лист OneDrive с помощью Microsoft Graph API и PHP

После отправки формы вы получите идентификатор клиента на вкладке «Обзор».

Запись данных в лист OneDrive с помощью Microsoft Graph API и PHP

Затем перейдите на вкладку «Сертификаты и секреты» и нажмите «Новый секрет клиента».

Запись данных в лист OneDrive с помощью Microsoft Graph API и PHP

Откроется всплывающее окно, в котором вам нужно добавить описание и выбрать параметр «Истекает».

Запись данных в лист OneDrive с помощью Microsoft Graph API и PHP

После этого вы получите свой секрет клиента, как показано ниже.

Запись данных в лист OneDrive с помощью Microsoft Graph API и PHP

Установить необходимые пакеты

Нам нужно интегрировать две вещи – OAuth и REST API. Для OAuth я собираюсь использовать библиотеку Hybridauth. А для взаимодействия с Microsoft Graph API воспользуемся библиотекой Guzzle.

Мы можем легко установить эти 2 пакета с помощью Composer. Создайте composer.jsonфайл в корневом каталоге вашего проекта и добавьте в него следующие строки.

{
    "require": {
        "hybridauth/hybridauth": "~3.0",
        "guzzlehttp/guzzle": "^7.0"
    }
}

Выполните приведенную ниже команду, которая установит эти пакеты.

composer install

Как уже говорилось, Microsoft Graph API использует OAuth для выполнения операций API. Это требует, чтобы вы создали токен доступа, который действует как идентификатор вашей учетной записи. Используя этот токен доступа, API-интерфейсы Microsoft Graph проверяют, является ли входящий запрос действительным и авторизованным.

У токена доступа короткий срок службы. Срок их действия скоро истекает. И после истечения срока действия мы не можем выполнять вызовы API, поскольку Microsoft рассматривает запрос с истекшим токеном как неавторизованный. Чтобы решить эту проблему, мы используем «refresh_token» для регенерации токена доступа в фоновом режиме. Так работает OAuth.

Конфигурация базы данных

Для достижения нашей цели нам нужно хранить токен в надежном месте. Нам нужен токен при вызове API. Кроме того, он должен восстанавливаться по истечении срока годности. Итак, чтобы сохранить детали токена, создайте таблицу базы данных следующим образом.

CREATE TABLE `token` ( `id` int(11) NOT NULL AUTO_INCREMENT,
 `access_token` text NOT NULL,
 PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

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

класс-db.php

<?php
class DB {
    private $dbHost     = "DB_HOST";
    private $dbUsername = "DB_USERNAME";
    private $dbPassword = "DB_PASSWORD";
    private $dbName     = "DB_NAME";
      
    public function __construct(){
        if(!isset($this->db)){
            // Connect to the database
            $conn = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbName);
            if($conn->connect_error){
                die("Failed to connect with MySQL: ". $conn->connect_error);
            }else{
                $this->db = $conn;
            }
        }
    }
  
    public function is_table_empty() {
        $result = $this->db->query("SELECT id FROM token");
        if($result->num_rows) {
            return false;
        }
  
        return true;
    }
  
    public function get_access_token() {
        $sql = $this->db->query("SELECT access_token FROM token");
        $result = $sql->fetch_assoc();
        return json_decode($result['access_token']);
    }
  
    public function get_refersh_token() {
        $result = $this->get_access_token();
        return $result->refresh_token;
    }
  
    public function update_access_token($token) {
        if($this->is_table_empty()) {
            $this->db->query("INSERT INTO token(access_token) VALUES('$token')");
        } else {
            $this->db->query("UPDATE token SET access_token = '$token' WHERE id = (SELECT id FROM token)");
        }
    }
}

Создать токен доступа

Когда вы будете готовы с необходимыми пакетами и классом базы данных, следующая часть выполнит аутентификацию и сохранит детали токена в базе данных.

Библиотека Hybridauth предоставляет собственный процесс для выполнения авторизации. Итак, давайте им следовать. Создайте config.phpфайл и добавьте в него приведенный ниже код.

config.php

<?php
require_once 'vendor/autoload.php';
require_once 'class-db.php';
 
define('ONEDRIVE_CLIENT_ID', 'CLIENT_ID_HERE');
define('ONEDRIVE_CLIENT_SECRET', 'CLIENT_SECRET_HERE');
define('ONEDRIVE_SCOPE', 'files.read files.read.all files.readwrite files.readwrite.all offline_access');
define('ONEDRIVE_CALLBACK_URL', 'CALLBACK_URL_HERE'); // in my case it is http://localhost/sajid/onedrive/callback.php
 
$config = [
    'callback' => ONEDRIVE_CALLBACK_URL,
    'keys'     => [
                    'id' => ONEDRIVE_CLIENT_ID,
                    'secret' => ONEDRIVE_CLIENT_SECRET
                ],
    'scope'    => ONEDRIVE_SCOPE,
    'authorize_url_parameters' => [
            'approval_prompt' => 'force',
            'access_type' => 'offline'
    ]
];
 
$adapter = new HybridauthProviderMicrosoftGraph( $config );

Обязательно замените все заполнители их фактическими значениями. Я прошел требуемые объемы для нашей конечной цели, так что оставьте все как есть. Теперь, в этом callback.phpURL-адресе обратного вызова, я напишу код, который запускает процесс аутентификации, перенаправляет на него после успешной авторизации и сохраняет информацию токенов в таблице базы данных.

callback.php

<?php
require_once 'config.php';
 
try {
    $adapter->authenticate();
    $token = $adapter->getAccessToken();
    $db = new DB();
    if($db->is_table_empty()) {
        $db->update_access_token(json_encode($token));
        echo "Access token inserted successfully.";
    }
}
catch( Exception $e ){
    echo $e->getMessage() ;
}

Запустите в callback.phpбраузере, завершите процесс аутентификации. По завершении аутентификации вы должны увидеть детали токена, хранящиеся в таблице “токенов”.

Добавить таблицу на лист OneDrive

Чтобы добавить данные через Microsoft Graph API, вам необходимо вставить таблицу в лист OneDrive. Перейдите на страницу OneDrive. Щелкните книгу Excel в раскрывающемся списке «Создать».

Запись данных в лист OneDrive с помощью Microsoft Graph API и PHP

Как только вы окажетесь на странице листа, щелкните значок «Таблица», а затем «ОК» в открывшемся всплывающем окне.

Запись данных в лист OneDrive с помощью Microsoft Graph API и PHP

После этого вы увидите таблицу, вставленную в ваш лист OneDrive, как показано ниже.

Запись данных в лист OneDrive с помощью Microsoft Graph API и PHP

Отрегулируйте столбцы в соответствии с вашими требованиями. В моем случае я сохранил 3 столбца.

Теперь можно спросить, зачем нужно вставлять таблицу в лист? Когда я исследовал эту тему, я обнаружил, что это единственный способ записи данных в книгу Excel. Вы можете прочитать об этом больше в их документации.

Запомните, когда мы впервые вставляем таблицу на лист, ее значение будет «Таблица1». Нам это значение нужно во время вызова API. Если по какой-то причине вы удалите таблицу и вставите ее снова, тогда ее значение станет «Таблица2» и так далее.

Скопируйте идентификатор своего листа, который требуется при вызове API. Вы можете получить его по URL-адресу браузера, как показано на скриншоте ниже.

Запись данных в лист OneDrive с помощью Microsoft Graph API и PHP

Запись данных в лист OneDrive с помощью Microsoft Graph API и PHP

На этом мы закончили установку необходимых пакетов, вставку токенов в базу данных, создание книги Excel с таблицей в ней. Теперь мы готовы написать код, который добавляет данные в лист OneDrive с помощью Microsoft Graph API и PHP.

Я создаю файл, append-to-onedrive-sheet.phpи мой код будет таким, как написано ниже.

<?php
require_once 'config.php';
 
// here you can pass as many data as a separate array element
$arr_data = [
    ['John Doe', '[email protected]', '8888888888']
];
 
append_to_sheet($arr_data);
 
function append_to_sheet($arr_data = array()) {
    $item_id = 'YOUR_SHEET_ID';
    $table = 'Table1'; //in your case it can be Table2, Table3, ...
 
    $db = new DB();
 
    $arr_token = (array) $db->get_access_token();
    $accessToken = $arr_token['access_token'];
 
    try {
 
        $client = new GuzzleHttpClient([
            // Base URI is used with relative requests
            'base_uri' => 'https://graph.microsoft.com',
        ]);
 
        $response = $client->request("POST", "/v1.0/me/drive/items/$item_id/workbook/tables/$table/rows/add", [
            'json' => [
                'values' => $arr_data
            ],
            'headers' => [
                'Authorization' => 'Bearer '. $accessToken
            ],
            'verify' => false,
        ]);
    } catch(Exception $e) {
        if( 401 == $e->getCode()) {
            $refresh_token = $db->get_refersh_token();
 
            $client = new GuzzleHttpClient(['base_uri' => 'https://login.microsoftonline.com']);
 
            $response = $client->request('POST', '/common/oauth2/v2.0/token', [
                'form_params' => [
                    "grant_type" => "refresh_token",
                    "refresh_token" => $refresh_token,
                    "client_id" => ONEDRIVE_CLIENT_ID,
                    "client_secret" => ONEDRIVE_CLIENT_SECRET,
                    "scope" => ONEDRIVE_SCOPE,
                    "redirect_uri" => ONEDRIVE_CALLBACK_URL,
                ],
            ]);
 
            $db->update_access_token($response->getBody());
 
            append_to_sheet($arr_data);
        } else {
            echo $e->getMessage(); //print the error just in case your video is not uploaded.
        }
    }
}

В приведенном выше коде я создал массив, содержащий элемент массива с 3 значениями. Вы можете передать столько элементов массива. Вы должны передать свой идентификатор листа $item_idпеременной.

Этот код извлекает токен доступа из базы данных и отправляет запрос POST в требуемую конечную точку API. Если срок действия токена истекает, он автоматически регенерирует его в фоновом режиме и продолжает процесс.

Попробуйте, и вы увидите, что ваши данные добавлены в книгу Excel вашей учетной записи OneDrive.

Надеюсь, вы узнали, как записывать данные в OneDrive Sheet с помощью Microsoft Graph API и PHP. Пожалуйста, поделитесь своими мыслями и предложениями в разделе комментариев ниже.

Статьи по Теме

Источник записи: artisansweb.net

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