GoogleAnalyticsAPIをPHPでたたくクラス

少し使ってみようと思い、GoogleAnalyticsAPIをPHPでたたくクラスを書いてみる(相変わらずのPHP4…orz)。

具体的にはHTTP_Requestを使って認証〜データ取得までしようということ。
GoogleAnalyticsAPIのドキュメントは全て英語ですが、あれこれやってみればわかる!そういうもんです。

コードはこんな感じ。

class googleAnalyticsAPI 
{
	//HTTP_Requestのオプション
	var $option;
	//ログインデータ
	var $auth_data;
	//トークン
	var $auth_token;
	//取得結果
	var $result;
	
	function googleAnalyticsAPI($option, $email, $passwd, $profile){
		if(!$option){
			$this->option = array("timeout" => "10", "allowRedirects" => true, "maxRedirects" => 3,);
		}else{
			$this->option = $option;
		}
		$this->auth_data['email'] = $email;
		$this->auth_data['passwd'] = $passwd;
		$this->auth_data['profile'] = $profile;
	}
	
	function googleLogin(){
		
		// HTTP_Requestの初期化
		$http = new HTTP_Request("https://www.google.com/accounts/ClientLogin", $this->option);
		
		// HTTPのヘッダー設定
		$http->setHttpVer("1.1");
		$http->setMethod(HTTP_REQUEST_METHOD_GET);
		
		$http->addQueryString("accountType", "GOOGLE");
		$http->addQueryString("Email",       $this->auth_data["email"]);
		$http->addQueryString("Passwd",      $this->auth_data["passwd"]);
		$http->addQueryString("service",     "analytics");
		$http->addQueryString("source",      "");
		
		$ret = array("status"    => false,
		"parameter" => array());
		
		// HTTPリクエスト実行
		$response = $http->sendRequest();
		
		if (!PEAR::isError($response)) {
			
			$code = $http->getResponseCode();
			
			if ($code == 200) {
				$ret["status"]    = true;
				$ret["parameter"] = $http->getResponseBody();
				
				preg_match('/Auth=(.*)/', $ret["parameter"], $matches);
				if (isset($matches[1])) {
					$this->auth_token = $matches[1];
				}
				
			} else {
				$ret["parameter"] = $http->getResponseBody();
			}
		}
	}
	
	function getGoogleAnalyticsXML($startDate, $endDate){
		$this->googleLogin();
		
		$url = "https://www.google.com/analytics/feeds/data";
		$ret = array("status" => false, "parameter" => array());
		
		// HTTP_Requestの初期化
		$http = new HTTP_Request($url, $this->option);
		
		// HTTPのヘッダー設定
		$http->setHttpVer("1.1");
		$http->setMethod(HTTP_REQUEST_METHOD_GET);
		$http->addHeader("Authorization", "GoogleLogin auth=$this->auth_token");
		
		$http->addQueryString("start-date", $startDate);
		$http->addQueryString("end-date", $endDate);
		$http->addQueryString("dimensions", "ga:pagePath");
		$http->addQueryString("metrics", "ga:uniquePageviews,ga:pageviews");
		$http->addQueryString("sort", "ga:pagePath");
		$http->addQueryString("max-results", "99999");
		$http->addQueryString("ids", "ga:" . $this->auth_data["profile"]);
		$http->addQueryString("prettyprint", "true");
		
		// HTTPリクエスト実行
		$response = $http->sendRequest();
		
		if (!PEAR::isError($response)) {
			
			$code = $http->getResponseCode();
			
			if ($code == 200) {
				$ret["status"]    = true;
				$ret["parameter"] = $http->getResponseBody();
				$this->result = $ret;
			} else {
				$ret["parameter"] = $http->getResponseBody();
				$this->result = $ret;
			}
		}
		return $this->result;
	}
}

googleAnalyticsAPIの引数はHTTP_Requestのオプション配列、Googleアカウントのメールアドレス、パスワード、それとGoogleAnalyticsのレポートのID。
GoogleAnalyticsのレポートのIDは、レポートを表示したときにURLに出てくるid=********の数字です(別名「プロファイル ID」というやつ)。


これで後は期日を設定すればXMLを取得できます。

$gaAPI = new googleAnalyticsAPI("", "mailaddress@gmail.com", "password", "profile-id");
$gaXML = $gaAPI->getGoogleAnalyticsXML("2009-04-01", "2009-04-07");
var_dump($gaXML);

簡単簡単。
こんな感じのXMLが取得できる。

取得結果のサンプル


ちなみに私の書いたクラスでは取得するデータの形式が次のようになっている。

		$http->addQueryString("dimensions", "ga:pagePath");
		$http->addQueryString("metrics", "ga:uniquePageviews,ga:pageviews");
		$http->addQueryString("sort", "ga:pagePath");

「dimensions」は解析結果を表示するときのベースとなるものだ。
例えば、アクセス元の国別にアクセス数等取得したい場合は「ga:country」。
アクセスブラウザ別に取得したい場合は「ga:browser」など。
「ga:pagePath」はアクセスURL別のアクセス数等を取得します(「ga:pageTitle」ならページタイトル別)。

詳しくはGoogleCodeのGoogle Analytics (Labs)に書かれています。
(Dimensionsの表の所)


「metrics」は、「dimensions」が行なら列に当たるもの。
ページビュー(ga:pageviews)やユニークユーザ数(ga:visitors)、直帰数(ga:bounces)などを入れます

詳しくはGoogleCodeのGoogle Analytics (Labs)に書かれています。
(Metricsの表の所)


「sort」は、ソートする順番。
同じくDimensions・Metricsの表から値を選んで入力する。


リクエストパラメーターは他にもあり、「filters」であらかじめフィルタリングして取得することもできる。
「ga:country%3D%3DJapan」みたいにすれば、日本からのアクセスだけに絞れるわれだ(%3DはURLエンコード)。

詳しくは「Filtering Dimensions or Metrics」を見ると分かります。




本当はページごとにブラウザ別のアクセス数とか見たかったんだけど、フィルタリングとかすれば取得できるのかなぁ〜。
今度試してみよう。

嘘を書いている場合はコメントで教えてください。