※閲覧者が多いページなので、より丁寧な解説に変更しました。(2018/12)
PHPでのGoogle Drive APIの使い方について説明していきます。最近仕様が大きく変わり、まだ記事があまり出回っていないようなので、やっていきたいと思います。
今回もっともわかりにくいのは、Composerという依存関係をまとめるソフトを使うところだと思います。参考サイトと併せて、ご覧ください。
スポンサーリンクComposerのインストール
とりあえず、必要になるComposerをインストールしてしまいます。
その前に、ローカル環境で動かす場合、phpをまだ入手していない方は、適当なバージョンを1つGetしてきてください。最新バージョン(2018年12月3日現在ではPHP 7.2)にしておくと無難です。PHP 5, 7.0はサポートが終了します。
Windowsの場合、こちらからダウンロードできます。
そのうえで、Composerをインストールしていきます。
https://getcomposer.org/download/
このサイトから、Composerをいただいてきます。
以下、2つのケースがあります。
①Windowsの環境でComposerを動作させる場合はComposer-Setup.exeを選択・そのままインストールします。Composerをインストールする段階で、phpの実行ファイルの場所を聞かれるので、先ほどダウンロードしたphpファイルの場所を教えてあげます。
②Linux系サーバーにSSH等で接続して動作させる場合は、まずcomposerコマンドが使えるかどうか確認してください。使える場合、composerコマンドを実行するとアスキーアートが浮かび上がります。使えない場合、こちらから最新バージョンのpharファイルをダウンロードして、それをFTP等でAPIを使用するディレクトリにアップロードします。
ライブラリの入手・準備
最初に、Google Drive API用ファイルを設置するディレクトリにcomposer.jsonを作成します。中身は
{ "require": { "google/apiclient": "^2.0" } }
となります。
次に、そのディレクトリでComposerを動作させます。2つの場合に分けて説明します。
①Windowsの環境で動作させる場合、Composerをインストールして再起動した段階で、コマンドプロンプトにおいてcomposerコマンドが使用できるようになっていると思いますので、composer.jsonと同じディレクトリでコマンドプロンプトを開き、
composer install
を行います。
②Linux系サーバーで動作させる場合、 SSHにてcomposerコマンド、またはphp composer.phar コマンドが動くはずですので(正常に動かない場合、単純なphpコマンドではなくCLI版で動作させる必要があります)
composer install
または
php composer.phar install
を行います。
SSHを使用できない環境の場合、この記事で方法を解説しています。
キーの取得
以下、Google本家を日本語で解釈し直したものです。正確な情報は本家をご覧ください。
はじめに、OAuthクライアントIDを取得します。
まず、Googleアカウントでログインして、Google API Consoleを開きます。
次に、プロジェクトを作成して、APIのページに移動します。ダッシュボードから「APIとサービスの有効化」を押します。
Google Drive APIを探してクリックします。
有効にします。
次に認証情報を作成します。
2. OAuth 2.0 クライアント ID を作成する については、適当な名前、ユーザー認証後に帰ってくるべきURLを指定します。このURLには、ログインが完了したことを示す「承認コード」が付加された状態で帰ってくることになります。それを使用してAPIが使えるようになるわけです。URLは正確に入力してください。
3. OAuth 2.0 同意画面を設定する では、デベロッパーとしてのメールアドレス、APIを提供する際のサービス名を入力します。サービス名はユーザーが目にするものなので、注意してください。
ここまで入力して完了となります。(まだJSONはダウンロードしないでください)
ここで、念のため今作成した認証情報を開いて、「承認済みのリダイレクト URI」が正常に設定されていることを確認してください。
設定されていない場合、認証情報→OAuth 同意画面
から、使用するドメイン(私の場合はtanidaiz.comとしました)を「承認済みドメイン」にて追加・保存します。
再度作成した認証情報を開き、「承認済みのリダイレクト URI」を追加してください(私の場合はhttps://second.tanidaiz.com/googledrive/callback.phpとしました)。
ここまで確実に行った上で、認証情報のJSONをダウンロードしてきます。
このJSONの中には「client_secret」が入っているため、漏えいしないように注意してください。
次に、APIキーを取得します。
セキュリティのため、キーを制限することをお勧めします。具体的には、キーを使用できるURLを、ワイルドカードを使用して設定しておきます。私の場合、tanidaiz.com関連のURLからのアクセスを許可するため、https://*.tanidaiz.com/*としました。
よくわからない場合、まだ設定せず、正常にプログラムが動作することを確認してから設定すると良いかもしれません。
いずれにせよ、すぐにAPIキーを取得できるので、漏えいに注意して保管します。
プログラムの作成
ここにきて初めてコードを書いていくことになります。
基本的にはGoogle本家のサンプルをそのまま使用すれば良いのですが、一部サンプルに反映されていない仕様変更点などがありましたので、ご注意ください。
また、PHP版のドキュメントの不足部分は、部分的に他の言語のドキュメントから引っ張ってくることも有用です。
index.phpにアクセスした時、セッション変数にアクセストークンが無かった場合、callback.phpに移動してユーザーにログイン操作を行わせ、そこでアクセストークンを取得し、それをセッション変数に代入します。
その後、index.phpに戻り、セッション変数にセットしたアクセストークンを使用してAPIを実際に利用するという流れとなります。
以下、https://second.tanidaiz.com/googledrive/でAPIを利用する場合のコードとなります。適宜、ご利用中の環境に合わせて読み替えてください。
※重要※
認証情報のJSONファイル client_secrets.json については、外部からアクセスできない場所に設置してください。私の場合はgoogledrive/deny/をアクセス拒否ディレクトリとして、そこに設置しました。
<?php
//index.php
session_start();
require_once('./vendor/autoload.php');
$client = new Google_Client();
$client->setAuthConfig('./deny/client_secrets.json');
$client->setAccessType("offline"); // offline access
$client->setIncludeGrantedScopes(true); // incremental auth
$client->addScope(Google_Service_Drive::DRIVE_FILE);
$client->setDeveloperKey("ここにAPIキーを入力してください");
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$client->setAccessToken($_SESSION['access_token']);
$drive = new Google_Service_Drive($client);
/* ここからAPIを利用する処理を記述します。 */
$files = $drive->files->listFiles(array())->getFiles();
foreach($files as $file){
echo $file['name']."rn";
}
/* ここまで */
} else {
header('Location: /googledrive/callback.php');
}
<?php
//callback.php
session_start();
require_once('./vendor/autoload.php');
$client = new Google_Client();
$client->setAuthConfig('./deny/client_secrets.json');
$client->setAccessType("offline"); // offline access
$client->setIncludeGrantedScopes(true); // incremental auth
$client->addScope(Google_Service_Drive::DRIVE_FILE);
$client->setDeveloperKey("ここにAPIキーを入力してください");
if (!isset($_GET['code'])) {
$auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
$client->authenticate($_GET['code']);
$_SESSION['access_token'] = $client->getAccessToken();
header('Location: /googledrive/index.php');
}
現時点では、本家にAPI利用コードが
$files = $drive->files->listFiles(array())->getItems();
と書いてありますが、これでは正常に動きません。getFiles();に書き換えました。
/googledrive/index.phpにアクセスすると、自動的にGoogleの認証画面に移動します。そこでアカウントにログインして認証します。
そのまま通れます。
認証完了後、自動的にindex.phpに戻ります。
これでGoogle Drive内のファイル一覧が返ってきます。
アプリを開発するために必要なドキュメント
今回はScopeとしてDRIVE_FILEを指定しましたが、他にもScopeがあります。操作に制限をかけられます。
Class Google_Service_Drive
その他、多くの機能がありますので、必要なものを調べてみてください。
例えばファイルを作成する時はGoogle_Service_Drive_Files_Resourceこちらでしょうか。
ご覧いただきありがとうございました。
何かありましたらコメントを頂けると幸いです。
それでは、良いAPIライフを。