このWebサイト ひつじ帳 は、管理者がWEB関連の技術をまとめた備忘録サイトです。 Linux,CentOS,PHP,MySQL,Blogger,JavaScript,CSS について記録しています。

GoogleDriveバックアップ/予備情報

[ 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 を解凍して、下記スクリプトと同じディレクトリに配置する。
    URL:https://github.com/google/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);
    

0 件のコメント:

人気記事

このブログを検索