[ GoogleDriveバックアップ ]

Google OAuth 情報

Google Drive API(PHP) でアクセスするのに必要な情報を取得する方法を記録しています。
Google OAuth の クライアントID等 からアクセストークンやリフレッシュトークンを取得する方法。

リフレッシュトークンの取得

※ アクセストークンには、有効期限がある為、常にAPI接続するには、リフレッシュトークンが必要になる。

 
  1. Google API の情報が必要。
    Google API 情報は、https://console.developers.google.com/project から取得

  2. 承認ページにアクセス 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
    

  3. 承認コードを取得する
    【承認する】ボタンをクリックして、表示された承認コードをコピーする。

  4. 下記のPHPスクリプトに、「承認コード」「クライアント ID」「クライアント シークレット」を入力・設定する。
  5. 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.
    

アクセストークンの取得

上記で取得したリフレッシュトークンで、アクセストークンを取得する。

  1. 下記のPHPスクリプトに、「リフレッシュ トークン」「クライアント ID」「クライアント シークレット」を入力・設定する。
  2. 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ドライブ)に接続して、ファイルの一覧を取得する。

  1. 下記のPHPスクリプトに、「アクセス トークン」を入力・設定する。
  2. 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 で、ファイルをアップロードする。

  1. google-api-php-client をダウンロードする。
  2. ダウンロードした google-api-php-client を解凍して、下記スクリプトと同じディレクトリに配置する。
  3. アップロードするファイルを下記スクリプトと同じディレクトリに配置する。
  4. 下記のPHPスクリプトに、「アップロードするファイルのパス」「リフレッシュ トークン」「クライアント ID」「クライアント シークレット」を入力・設定する。
  5. 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);
    

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-02-24 (火) 20:59:18 (1484d)