SPIRALのカスタムプログラムでGoogleDriveのファイルをダウンロードし、
SPIRALのDBへファイルを格納するサンプルプログラムをご紹介いたします。
全体像
GoogleDriveのAPIを用いてGoogleDrive内のファイルをダウンロードし、
そのファイルをSPIRALのAPIを用いてDBへアップロードします。
GoogleDriveのファイルをダウンロードするにはGoogleAPIのアクセストークンが必要なので取得します。
また、ダウンロードしたいファイルを指定するのにファイルIDも必要な為
GoogleDriveのAPIを用いてファイルIDを取得します。
ダウンロードが出来たらSPIRALのAPIを用いてファイルをアップロードします。
DB設定
任意のDBを作成し、ファイル型フィールドを用意してください。
この際ファイル型フィールドの差し替えキーワードを控えておいてください。
SPIRALのAPIの仕様上ファイル型フィールド以外にもう一つフィールドが必要なので、
登録日時フィールドを差し替えキーワードregistDateにして追加してください。
設定方法
Google側の設定(OAuth認証の作成)
Google側に任意のプロジェクトを作成していください。その後Google側設定画面へアクセスしてください。
認証情報より「+認証情報を作成」をクリックして「OAuthクライアントID」をクリックしてください。
アプリケーションの種類は「ウェブアプリケーション」
承認済みのリダイレクトURIには「http://localhost/oauth2callback.php」と入力してください。
そのまま作成まで進み、モーダルに「クライアントID」と「クライアントシークレット」が表示されますので、必ず控えてください。
次に「OAuth同意画面」をクリックしてください。
「OAuth consent screen」では任意の情報を入力してください。
「スコープ」では何も入力しなくて大丈夫です。
「Test users」ではテストユーザにご自身のログインされているGoogleアカウント(Gmail)を入力してください。
ファイルのダウンロードをするにはアクセストークンが必要です。
しかし、アクセストークンには有効期限等があるので継続的にファイルのダウンロードが出来るように、
リフレッシュトークンを生成して、リフレッシュトークンからアクセストークンを都度生成する形にします。
設定値ファイルをカスタムモジュールに作成
<?php $client_id = 'クライアントIDを入力'; $client_secret = 'クライアントシークレットを入力'; $redirect_uri = 'http://localhost/oauth2callback.php';
その後ご自身のGoogleの接続情報を記載してください
ステップ1 リフレッシュトークンの取得
<?php require_once "config.php"; $auth_code = ''; // 認証コードをここに入力 if (empty($auth_code)) { // 認証コードが入力されていない場合、認証URLを生成 $auth_url = 'https://accounts.google.com/o/oauth2/auth?' . http_build_query([ 'client_id' => $client_id, 'redirect_uri' => $redirect_uri, 'response_type' => 'code', 'scope' => 'https://www.googleapis.com/auth/drive.readonly', 'access_type' => 'offline', ]); echo '認証URLをブラウザで開いて、認証コードを取得してください:'; echo PHP_EOL . PHP_EOL; echo $auth_url . PHP_EOL; } else { // 認証コードが入力されている場合、アクセストークンとリフレッシュトークンを取得 $token_url = 'https://oauth2.googleapis.com/token'; $post_fields = [ 'code' => $auth_code, 'client_id' => $client_id, 'client_secret' => $client_secret, 'redirect_uri' => $redirect_uri, 'grant_type' => 'authorization_code', ]; $ch = curl_init($token_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_fields)); $response = curl_exec($ch); if ($response === false) { echo 'Error: ' . curl_error($ch); curl_close($ch); exit(); } curl_close($ch); $token_data = json_decode($response, true); var_dump($token_data); } ?>
そうすると認証URLが出力されますので、そのURLをブラウザに貼り付けて遷移してください。
遷移するとエラーが表示されると思いますが、大丈夫です。
リダイレクトされた後URLに
http://localhost/oauth2callback.php?code=XXX&scope=YYYY
といった形でcodeのパラメータが付与されていますので、
このcodeパラメータ「XXX」を$auth_codeに代入して再度実行してください。
実行結果より「refresh_token」の値を控えてください。
作成したカスタムモジュールを編集
<?php $client_id = 'クライアントIDを入力'; $client_secret = 'クライアントシークレットを入力'; $redirect_uri = 'http://localhost/oauth2callback.php'; $refresh_token = "ステップ2で取得したリフレッシュトークンを入力";
先ほど控えた値を$refresh_tokenの値に入力してください。
ステップ2 ファイルIDの取得
<?php require_once "config.php"; $folder_id = ""; //フォルダIDを指定 $token_url = 'https://oauth2.googleapis.com/token'; $post_fields = [ 'refresh_token' => $refresh_token, 'client_id' => $client_id, 'client_secret' => $client_secret, 'grant_type' => 'refresh_token', ]; $ch = curl_init($token_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_fields)); $response = curl_exec($ch); curl_close($ch); $token_data = json_decode($response, true); $access_token = $token_data['access_token']; $folder_id = isset($folder_id) ? $folder_id : null; // Google Drive APIを使用してファイルリストを取得 if ($folder_id) { // フォルダIDが存在する場合、フォルダ内のファイルを取得 $drive_url = 'https://www.googleapis.com/drive/v3/files?q=' . urlencode("'" . $folder_id . "' in parents"); } else { // フォルダIDが存在しない場合、全てのファイルを取得 $drive_url = 'https://www.googleapis.com/drive/v3/files'; } $ch = curl_init($drive_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $access_token, ]); $response = curl_exec($ch); if ($response === false) { echo 'Error: ' . curl_error($ch); curl_close($ch); exit(); } curl_close($ch); $file_list = json_decode($response, true); if (isset($file_list['error'])) { echo 'Error: ' . $file_list['error']['message']; exit(); } // ファイルリストを表示 foreach ($file_list['files'] as $file) { echo 'File ID: ' . $file['id'] . ' - File Name: ' . $file['name'] . PHP_EOL; } ?>
実行結果にファイルIDとファイル名が記載されますので、File ID:の後のIDを控えてください。
$file_list['files']にファイルのリストが格納されています。
フォルダの絞り込み等を行いたい場合は
$drive_url = 'https://www.googleapis.com/drive/v3/files?q=' . urlencode("'" . $folder_id . "' in parents");
の様な形でAPIの接続先にパラメータを付与してリクエストを行ってください
パラメータの仕様については下記Google公式リファレンスをご確認ください。
Method: files.list
ファイルやフォルダを検索する
ステップ3 ファイルダウンロード及びSPIRALへアップロード
<?php //変更不要 require_once "config.php"; define("MULTIPART_BOUNDARY", "SPIRAL_API_MULTIPART_BOUNDARY"); // スパイラルAPI接続用設定値 define("API_TOKEN", ""); define("API_SECRET", ""); define("DB_TITLE", ""); //格納したいDBタイトル define("RESIST_DATE_FIELD_NAME", "registDate"); //登録日時フィールド名 define("RESIST_DATE", "now"); //登録日時のvalue値 define("FILE_FIELD", "file"); //ファイル型フィールドの差し替えキーワード $file_id = ''; //ステップ3で控えたfileId $file_name = "image.png"; //ファイル名(拡張子をファイルと合わせてください) // スパイラルAPIのURLを取得するための設定 $locator = "https://www.pi-pe.co.jp/api/locator"; $locator_token = API_TOKEN; // ロケータ用トークン // ロケータのAPI用のHTTPヘッダ $locator_headers = array( "X-SPIRAL-API: locator/apiserver/request", "Content-Type: application/json; charset=UTF-8", ); // リクエストデータを作成 $locator_parameters = array(); $locator_parameters["spiral_api_token"] = $locator_token; // ロケータ用トークン // JSON形式にエンコード $locator_json = json_encode($locator_parameters); // cURLでロケータURLを取得 $curl = curl_init($locator); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $locator_json); curl_setopt($curl, CURLOPT_HTTPHEADER, $locator_headers); $response = curl_exec($curl); // エラーがあればエラー内容を表示 if (curl_errno($curl)) { echo curl_error($curl); exit; } $response_json = json_decode($response, true); curl_close($curl); // スパイラルAPIのURLを取得 $api_url = $response_json['location']; // トークンを取得するためのURLとPOSTフィールド $token_url = 'https://oauth2.googleapis.com/token'; $post_fields = [ 'refresh_token' => $refresh_token, 'client_id' => $client_id, 'client_secret' => $client_secret, 'grant_type' => 'refresh_token', ]; // cURLでアクセストークンを取得 $ch = curl_init($token_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_fields)); $response = curl_exec($ch); curl_close($ch); $token_data = json_decode($response, true); $access_token = $token_data['access_token']; // Google Driveからファイルをダウンロード $download_url = "https://www.googleapis.com/drive/v3/files/{$file_id}?alt=media"; $ch = curl_init($download_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $access_token, ]); $file_content = curl_exec($ch); curl_close($ch); // スパイラルAPI用のHTTPヘッダ $api_headers = array( "X-SPIRAL-API: database/insert/request", "Content-Type: multipart/form-data; boundary=" . MULTIPART_BOUNDARY, ); // 送信するJSONデータを作成 $parameters = array(); $parameters["spiral_api_token"] = API_TOKEN; // トークン $parameters["db_title"] = DB_TITLE; // DBのタイトル $parameters["passkey"] = time(); // エポック秒 $parameters["data"] = array(array("name" => RESIST_DATE_FIELD_NAME, "value" => RESIST_DATE)); // 署名を付ける $key = $parameters["spiral_api_token"] . "&" . $parameters["passkey"]; $parameters["signature"] = hash_hmac('sha1', $key, API_SECRET, false); // POSTデータを生成 $postdata = "--" . MULTIPART_BOUNDARY . "\r\n"; $postdata .= "Content-Type: application/json; charset='UTF-8';\r\n"; $postdata .= "Content-Disposition: form-data; name='json'\r\n\r\n"; $postdata .= json_encode($parameters); $postdata .= "\r\n\r\n"; $postdata .= "--" . MULTIPART_BOUNDARY . "\r\n"; $postdata .= "Content-Type: application/octet-stream;\r\n"; $postdata .= "Content-Disposition: form-data; name=\"" . FILE_FIELD . "\"; filename=\"" . $file_name . "\"\r\n\r\n"; $postdata .= $file_content; $postdata .= "\r\n\r\n"; $postdata .= "--" . MULTIPART_BOUNDARY . "--\r\n"; // curlライブラリを使って送信 $curl = curl_init($api_url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata); curl_setopt($curl, CURLOPT_HTTPHEADER, $api_headers); $response = curl_exec($curl); curl_close($curl); // 結果を表示 echo mb_convert_encoding(print_r(json_decode($response, true), true), 'CP932', 'UTF-8'); ?>
設定値をご自身の環境に合わせて修正してください。
$file_idにはステップ3で控えた値を入力してください。
修正が完了し、実行すると指定したファイルがSPIRALへアップロードされます。
その他
外部(Google)との連携になりますので、データの取扱や認証情報の取り扱いには十分お気をつけください。
特にクライアントIDやクライアントシークレット、認証キー等は他人に絶対に知られない様にしてください。
知られてしまうとGoogleアカウント上のデータが他人に操作、閲覧されてしまう可能性がございます。