Google OAuth 情報
Google Drive API(PHP) でアクセスするのに必要な情報を取得する方法を記録しています。Google OAuth の クライアントID等 からアクセストークンやリフレッシュトークンを取得する方法。
リフレッシュトークンの取得
※ アクセストークンには、有効期限がある為、常にAPI接続するには、リフレッシュトークンが必要になる。- Google API の情報が必要。
Google API 情報は、https://console.developers.google.com/project から取得
- 承認ページにアクセス
client_id を自身の所有する情報を書き換えて、ブラウザのアドレスに貼り付けて、アクセスする。
https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/drive&response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob&client_id=クライアントID - 承認コードを取得する
【承認する】ボタンをクリックして、表示された承認コードをコピーする。
- 下記のPHPスクリプトに、「承認コード」「クライアント ID」「クライアント シークレット」を入力・設定する。
- PHPスクリプトを実行する。
<?php $_Post = array( // 承認コード 'code' => "" // クライアント ID ,'client_id' => "" // クライアント シークレット ,'client_secret' => "" // リダイレクト URI ,'redirect_uri' => "urn:ietf:wg:oauth:2.0:oob" // リクエストする形式 ,'grant_type' => "authorization_code" ); $data = array(); if($ch = curl_init()){ curl_setopt($ch, CURLOPT_URL, "https://accounts.google.com/o/oauth2/token"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $_Post); $data = curl_exec($ch); curl_close($ch); } if($data){ if(($Data = json_decode($data, TRUE))){ echo "<ul>".PHP_EOL; foreach($Data as $key => $val){ echo "<li>{$key} = {$val}</li>".PHP_EOL; } echo "</ul>".PHP_EOL; } }
- 結果(成功した場合)
access_token = ya29.JAEaKtQLHOcXRwU_WWSKxMuHWKQcQcLn8Bb5lG0gKZv1X9lds-4UfY5vHc2X50PiyMcs8wPxa6J3Kh token_type = Bearer expires_in = 3599 refresh_token = 1/wPNE0bRLiyujzSkP1TUIVbwSButB_Km3IL0vUaphgN7
- 結果(失敗した場合)
error = invalid_grant error_description = Code was already redeemed.
アクセストークンの取得
上記で取得したリフレッシュトークンで、アクセストークンを取得する。- 下記のPHPスクリプトに、「リフレッシュ トークン」「クライアント ID」「クライアント シークレット」を入力・設定する。
- PHPスクリプトを実行する。
<?php $_Post = array( // リフレッシュ トークン 'refresh_token' => "" // クライアント ID ,'client_id' => "" // クライアント シークレット ,'client_secret' => "" // リクエストする形式 ,'grant_type' => "refresh_token" ); $data = array(); if($ch = curl_init()){ curl_setopt($ch, CURLOPT_URL, "https://accounts.google.com/o/oauth2/token"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $_Post); $data = curl_exec($ch); curl_close($ch); } if($data){ if(($Data = json_decode($data, TRUE))){ echo "<ul>".PHP_EOL; foreach($Data as $key => $val){ echo "<li>{$key} = {$val}</li>".PHP_EOL; } echo "</ul>".PHP_EOL; } }
- 結果(成功した場合)
access_token = ya29.JAExHhUYikTblMolqy3JpIdNCNhT5fFMSO-2EQ9gCIDTvd3sI1MPYqO5ARG-BW5SN7AZ84qw76hYZA token_type = Bearer expires_in = 2855
- 結果(失敗した場合)
error = invalid_grant
Google Drive のファイル一覧を表示
GoogleDrive(Googleドライブ)に接続して、ファイルの一覧を取得する。- 下記のPHPスクリプトに、「アクセス トークン」を入力・設定する。
- PHPスクリプトを実行する。
<?php $_Post = array( // アクセス トークン を設定する 'access_token' => "" ); $data = array(); if($ch = curl_init()){ curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/drive/v2/files?access_token=".$_Post['access_token']); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $data = curl_exec($ch); curl_close($ch); } if($data){ if(($Data = json_decode($data, TRUE))){ if(isset($Data['items']) && count($Data['items'])){ echo "<ul>".PHP_EOL; for($i = 0; $i < count($Data['items']); ++$i){ echo "<li>".$Data['items'][$i]['title']."</li>".PHP_EOL; } echo "</ul>".PHP_EOL; } } }
- 結果(成功した場合)
・ example.txt
- 結果(失敗した場合)
Googleドライブにファイルをアップロード
Google Drive API で、ファイルをアップロードする。- google-api-php-client をダウンロードする。
- ダウンロードした google-api-php-client を解凍して、下記スクリプトと同じディレクトリに配置する。
URL:https://github.com/google/google-api-php-client - アップロードするファイルを下記スクリプトと同じディレクトリに配置する。
- 下記のPHPスクリプトに、「アップロードするファイルのパス」「リフレッシュ トークン」「クライアント ID」「クライアント シークレット」を入力・設定する。
- PHPスクリプトを実行する。
<?php $_Config = array( // アップロードするファイルのパス 例:"./test.txt" 'upload_file' => "" // リフレッシュ トークン ,'refresh_token' => "" // クライアント ID ,'client_id' => "" // クライアント シークレット ,'client_secret' => "" // google-api-php-client ディレクトリのパス ,'google_api_php_client' => "google-api-php-client-master" ); $Result = array('result' => FALSE, 'message' => ""); if(!is_file($_Config['upload_file'])){ $Result['message'] = "Is Not ".$_Config['upload_file']; } else { set_time_limit(120); $File = pathinfo($_Config['upload_file']); if(($finfo = finfo_open(FILEINFO_MIME_TYPE))){ $mimetype = finfo_file($finfo, $_Config['upload_file']); finfo_close($finfo); } $File['mimetype'] = $mimetype; try { require_once($_Config['google_api_php_client']."/src/Google/Client.php"); require_once($_Config['google_api_php_client']."/src/Google/Service/Drive.php"); if(($client = new Google_Client())){ $client->setClientId($_Config['client_id']); $client->setClientSecret($_Config['client_secret']); $client->setAccessToken('{"refresh_token":"'.$_Config['refresh_token'].'","access_token":""}'); $service = new Google_Service_Drive($client); $file = new Google_Service_Drive_DriveFile(); $file->setTitle($File['basename']); $file->setDescription($File['basename']); $file->setMimeType($File['mimetype']); $chunkSizeBytes = 1 * 1024 * 1024; $parent = new Google_Service_Drive_ParentReference(); $file->setParents(array($parent)); $client->setDefer(TRUE); $request = $service->files->insert($file); $media = new Google_Http_MediaFileUpload($client,$request,$File['mimetype'],NULL,TRUE,$chunkSizeBytes); $media->setFileSize(filesize($_Config['upload_file'])); if($fp = fopen($_Config['upload_file'], "rb")){ $Status = FALSE; while(!$Status && !feof($fp)){ $chunk = fread($fp, $chunkSizeBytes); $Status = $media->nextChunk($chunk); } if($Status != FALSE){ if(isset($Status->id)){ if(($Result['id'] = $Status->id)){ $Result['result'] = TRUE; $Result['message'] = 'id = '.$Status->id; } } } fclose($fp); } $client->setDefer(FALSE); } } catch (Google_Exception $e) { $Result['message'] .= '<span style="color:red;">'.$e->getMessage().'</span>'; } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <title>Google Drive API アップロード</title> </head> <body> <h1>Google Drive API アップロード</h1> <h2>結果 = <?php echo ($Result['result'] ? '<span style="color:blue;">成功' : '<span style="color:red;">失敗');?>しました。</span></h2> <?php echo $Result['message']; ?> </body> </html>
※ ブラウザからGoogleドライブにアクセスして、ファイルがアップロードされているか確認する。
ファイルを削除
/**
* 削除
*
* @param $service : object
* @param $fileId : ファイルのID
* @return object|FALSE
*/
function deleteFile($service, $fileId) {
try {
return $service->files->delete($fileId);
} catch (Exception $e) {
echo "An error occurred: " . $e->getMessage();
}
return FALSE;
}
ファイルをゴミ箱に移動
/**
* ゴミ箱に移動
*
* @param $service : object
* @param $fileId : ファイルのID
* @return object|FALSE
*/
function trashFile($service, $fileId) {
try {
return $service->files->trash($fileId);
} catch (Exception $e) {
echo "An error occurred: " . $e->getMessage();
}
return FALSE;
}
PHPの実行時間を変更
実行時間が長くなりタイムアウトする場合は、実行時間の設定を変更する。- .htaccess に記述
php_value max_execution_time 300
- php.ini に記述
max_execution_time = 300
- PHPスクリプト内に記述
set_time_limit(300);
0 件のコメント:
コメントを投稿