[PHP] API を使った Google Anapytics のデータ取得と、Google Drive へのファイルアップロードサンプル 2014-05 版

久しぶりに Google API の PHP ライブラリを見ると、Github に移動していてクラス名なども変わっていました。 で、当ブログの「[PHP] Google Analytics API v3.0 を使って解析データを取得する」や [PHP] Google Drive API を使って Google Drive のファイル一覧取得、ファイルの追加を行う などの記事のプログラムが古くなり、そのまま使えない状態でしたので、新しいライブラリに対応したプログラムを書きました。 ただ、そこまで大きく変更されているわけではないようで大きな変更はないです。

環境

  • Google APIs Client Library for PHP 1.0.5-beta

準備

ライブラリはgoogle/google-api-php-clientにあるのでダウンロード等して使用します。 公式ドキュメントには Composer を使ったやり方も書いてあるので、Composer 使ってる人は参照下さい。
Installation - Google APIs Client Library for PHP — Google Developers

また、API を使う際は Google Developers Console で、 使用したい API を有効にして、ID などを取得しておきます。こちらも以前とは画面が変わっていますが、基本は一緒なので説明は省略します。

Google Analytics のサンプル

<?php
// ライブラリのパスを通しておく
// パスは任意に
set_include_path(get_include_path().PATH_SEPARATOR.dirname(__FILE__).'/google-api-php-client/src');

// ライブラリ読み込み
require('./google-api-php-client/src/Google/Client.php');
// Google Analytics
require('./google-api-php-client/src/Google/Service/Analytics.php');

// セッションスタート
session_start();

$client = new Google_Client();

// クライアントID
$client->setClientId('ここにClient IDを入力');
// クライアントSecret
$client->setClientSecret('ここにClient secretを入力');
// リダイレクトURL
$client->setRedirectUri('ここにRedirect URIsを入力');

$service = new Google_Service_Analytics($client);

// 許可されてリダイレクトされると URL に code が付加されている
// code があったら受け取って、認証する
if (isset($_GET['code'])) {
	// 認証(トークン、リフレッシュトークンを取得)
	$client->authenticate($_GET['code']);
	// 取得したトークンをセッションにセット
	$_SESSION['token'] = $client->getAccessToken();
	// リダイレクト(ここらへんは任意に)
	header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
	die;
}

if (isset($_SESSION['token'])) {
	// トークンセット
	$client->setAccessToken($_SESSION['token']);
}

// トークンがセットされていたら
if ($client->getAccessToken() !== '[]') {

	try {
		 // ビュー ID
		$ids = 'ga:0000000';
		// 期間(スタート)
		$start_date = '2014-05-01';
		// 期間(エンド)
		$end_date = 'today';
		// メトリクス,複数の場合は , で区切る
		$metrics = 'ga:sessions,ga:pageviews';
		// ディメンション,複数の場合は , で区切る
		$dimensions = 'ga:pageTitle,ga:pagePath';
		// ソートする項目, - をつけると降順になります
		$sort = '-ga:pageviews';
		// 最大取得数
		$max_results = 20;
		$optParams = array('dimensions' => $dimensions, 'sort' => $sort, 'max-results' => $max_results);
		$data = $service->data_ga->get($ids, $start_date, $end_date, $metrics, $optParams);

		echo '<pre>';
		var_dump($data);
		echo '</pre>';
	} catch (Google_Exception $e) {
		echo $e->getMessage();
	}

} else {
	// 許可がほしい権限を指定、今回は Google Analytics 全般の操作
	$client->setScopes(Google_Service_Analytics::ANALYTICS);
	// 認証用URL取得
	$authUrl = $client->createAuthUrl();
	echo '<a href="'.$authUrl.'">アプリケーションのアクセスを許可してください。</a>';
}

基本は変わっていないようです。認証の所以外はクラス名を変えるだけで大丈夫でした。

Google Drive のサンプル

ファイルリストを取得する

<?php

// ライブラリのパスを通しておく
// パスは任意に
set_include_path(get_include_path().PATH_SEPARATOR.dirname(__FILE__).'/google-api-php-client/src');

// ライブラリ読み込み
require('./google-api-php-client/src/Google/Client.php');
// Google Drive
require('./google-api-php-client/src/Google/Service/Drive.php');

// セッションスタート
session_start();

// unset($_SESSION['token']);

$client = new Google_Client();

// クライアントID
$client->setClientId('ここにClient IDを入力');
// クライアントSecret
$client->setClientSecret('ここにClient secretを入力');
// リダイレクトURL
$client->setRedirectUri('ここにRedirect URIsを入力');

$service = new Google_Service_Drive($client);

// 許可されてリダイレクトされると URL に code が付加されている
// code があったら受け取って、認証する
if (isset($_GET['code'])) {
	// 認証(トークン、リフレッシュトークンを取得)
	$client->authenticate($_GET['code']);
	// 取得したトークンをセッションにセット
	$_SESSION['token'] = $client->getAccessToken();
	// リダイレクト(ここらへんは任意に)
	header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
	die;
}

if (isset($_SESSION['token'])) {
	// トークンセット
	$client->setAccessToken($_SESSION['token']);
}

// トークンがセットされていたら
if ($client->getAccessToken() !== '[]') {

	try {

		// 親ディレクトリ
		// root でマイドライブ, root 以外は名前ではなく ID を指定
		$parents = 'root';
		if (isset($_GET['parents'])) {
			$parents = htmlspecialchars($_GET['parents'], ENT_QUOTES);
		}
		// 次ページに移動する場合に渡すトークン
		$pageToken = null;
		if (isset($_GET['pageToken'])) {
			$pageToken = $_GET['pageToken'];
		}
		$parameters = array('q' => "'{$parents}' in parents", 'maxResults' => 20);
		if ($pageToken) {
			$parameters['pageToken'] =$pageToken;
		}
		// ファイルリスト取得, Google_Service_Drive_FileList のオブジェクトが返ってくる
		$files = $service->files->listFiles($parameters);
		// ファイルの一覧データ
		$results = $files->getItems();
		// 次ページのトークン取得, ない場合は NULL
		$pageToken = $files->getNextPageToken();
		// 結果表示
		foreach ($results as $result) {
			// フォルダだったらリンクに
			if ($result->mimeType === 'application/vnd.google-apps.folder') {
				echo '<a href="http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?parents='.urlencode($result->id).'">フォルダ : '.$result->title.'</a><br />';
			} else {
				echo "ファイル : {$result->title}<br />";
			}
		}
		// pageToken があったら次ページヘのリンク表示
		if ($pageToken) {
			echo '<a href="http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?parents='.urlencode($parents).'&pageToken='.urlencode($pageToken).'">次ページ</a>';
		}
	} catch (Google_Exception $e) {
		echo $e->getMessage();
	}

} else {
	// 許可がほしい権限を指定、今回は Google Drive 全般の操作
	// 各クラスで定義されているので、URL を自分で指定するより定義されているものを使ったほうがよいかと
	$client->setScopes(Google_Service_Drive::DRIVE);
	// 認証用URL取得
	$authUrl = $client->createAuthUrl();
	echo '<a href="'.$authUrl.'">アプリケーションのアクセスを許可してください。</a>';
}

ファイルアップロード ( リジューム )

$filename = './test.zip';

// アップロードするファイル情報をセット
$file = new Google_Service_Drive_DriveFile();
$file->setTitle($filename);
$file->setDescription('テストのファイルですよ');
$file->setMimeType('application/zip');

// アップロードする親フォルダを指定
$parent = new Google_Service_Drive_ParentReference();
$parent->setId('0B5abC7E925odY2swdk5CVGdlM0U');
$file->setParents(array($parent));

$client->setDefer(true);
$request = $service->files->insert($file);

// チャンクサイズ, 今回は 256 KB
$chunkSizeBytes = 256 * 1024;
$media = new Google_Http_MediaFileUpload($client, $request, 'application/zip', null, true, $chunkSizeBytes);
$media->setFileSize(filesize($filename));

$status = false;
$handle = fopen($filename, "rb");
while (!$status && !feof($handle)) {
	$chunk = fread($handle, $chunkSizeBytes);
	$status = $media->nextChunk($chunk);
}
fclose($handle);
$client->setDefer(false);

こちらも基本は変わってないですね。

2014-05-05 追記

デフォルトではリフレッシュトークンを取得しないようになっていますね。
リフレッシュトークンも取得したい場合は、access_typeofflineapproval_promptforceをセットする必要があります。

$client->setAccessType('offline');
$client->setApprovalPrompt('force');

参考

Trackbacks & Pingbacks

  • None

Comments

  • No Comment
Name
Mail(任意) 公開されません
Web Site(任意)
Comment

日本語が含まれない投稿は無視されますのでご注意ください