Google Analytics API と PHP でアクセスランキングを表示する

Posted by
ぴろり
Posted at
2015/06/04 10:55
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
開発メモ カテゴリ
カバーイメージ

 OAuth 認証を受けて Google API を叩けるようになったので、Google Analytics の集計データを API で取得して、PHP で アクセス ランキングを表示してみます。

このエントリーをはてなブックマークに追加  

ソースコード

error_reporting( 0 );
$client_id =     '123456789012-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com';
$client_secret = 'HogeFugaPiyoHogeFugaPiyo';
$refresh_token = 'XXXXXXXX_REFRESH_TOKEN_XXXXXXXX';

$end_date =   date('Y-m-d'); // 今日から
$start_date = date('Y-m-d', strtotime("- 7 days")); // 過去 1 週間分を集計
$limit =     10; // 最大取得ページ数

// refresh_token から access_token を得る
$url = 'https://accounts.google.com/o/oauth2/token';
$data = array(
    'refresh_token' =>  $refresh_token,
    'client_id' =>      $client_id,
    'client_secret' =>  $client_secret,
    'grant_type' =>     'refresh_token',
);
$options = array('http' =>
    array(
        'method' => 'POST',
        'content' => http_build_query($data),
    ),
);
@$response = file_get_contents($url, false, stream_context_create($options));
if (!$response) {
    echo "authentication failed.";
    exit();
}
$json = json_decode($response);
$access_token = $json->access_token;

// pageviews を取得
$url = 'https://www.googleapis.com/analytics/v3/data/ga';
$data = http_build_query( array(
    'ids' =>            'ga:3857126',
    'dimensions' =>     'ga:pagePath,ga:pageTitle',
//    'filters' =>        'ga:pagePath=~^/archive/\\d+/\\d+/',
    'metrics' =>        'ga:pageviews',
    'sort' =>           '-ga:pageviews',
    'max-results' =>    $limit,
    'start-date' =>     $start_date,
    'end-date' =>       $end_date,
    'access_token' =>   $access_token,
));
@$response = file_get_contents( $url. '?'. $data );
if (!$response) {
    echo "pageviews failed.";
    exit();
}
$json = json_decode($response);
//print_t($json);
$size = count($json->rows);

// 整形して出力
echo '<ul>';
for ($i = 0; $i < $size; $i++) {
    $item = $json->rows[$i];
    echo '<li><a href="'. $item[0]. '">'. ($i+1) . "位:". $item[1]. '</a> '. $item[2]. " hits </li>\n";
}
echo '</ul>';

解説

2 ~ 4 行目
 前回記事を参照。Google Developers Console で登録したアプリケーションのクライアント ID とクライアント シークレットとリフレッシュ トークンが必要です。
6 ~ 8 行目
 ランキングを集計する期間とランキングの表示数を指定します。
11 ~ 23 行目
 access_token を取得するための POST リクエストを組み立てます。
24 ~ 28 行目
 組み立てたリクエストをネットワーク送信して、戻り値をエラーチェック。
29 ~ 30 行目
 リクエストが成功すると JSON 形式でデータが返ってくるので、ハッシュ オブジェクトに分解して、access_token を取り出します。
33 ~ 44 行目
 アクセス ランキングを取得するため、Google Analytics API のリクエストを組み立てます。
35 行目
 Google Analytics のプロファイル ID です。
36 行目
 ランキングに表示するために、ページのパスとタイトルを取得します。
37 行目
 トップページを除いて個別のブログ記事だけを集計するなどの場合、フィルタを指定できます。
38 行目
 集計基準にページビューを指定します。
39 行目
 集計結果をページビューで降順に並び替えます。
40 行目
 集計する最大件数を指定します。
41 ~ 42 行目
 集計する期間を指定します。
43 行目
 先ほど取得しておいた access_token が必要です。
45 ~ 49 行目
 組み立てたリクエストを送信して、エラーチェック
50 ~ 52 行目
 成功すると JSON 形式でデータが返ってくるので、ハッシュ オブジェクトに分解します。どのようなデータが取得できているか、データ構造を print_r で確認してみてください。
55 ~ 60 行目
取得したデータを整形して表示します。複雑な出力が必要であれば、テンプレート エンジンの採用を検討すべきかも。

応用例 1. この記事を読んだ人はこんな記事も読んでいます

 API のリクエスト パラメータを変更すると、Google Analytics のあらゆるデータをそこそこ高度に集計できるので、現在のページを起点に、訪問者が次に遷移したページのランキングから、"この記事を読んだ人はこんな記事も読んでいます"一覧を生成することもできます。
 このサイトでも、ブログ記事毎に"この記事を読んだ人はこんな記事も読んでいます"一覧を表示しています。以前は自前で作った仕組みで集計していましたが、"餅は餅屋"ということで、アクセス集計は全て Google Analytics に一本化し、現在のところその集計データからランキングを生成するようにしています。

$data = http_build_query( array(
    'ids' =>            'ga:3857126', // ここはユーザ毎に変わります
    'dimensions' =>     'ga:pagePath,ga:pageTitle',
    'filters' =>        'ga:previousPagePath==/archive/1234/12345678/index.php;'. // 起点となるページ
                        'ga:nextPagePath!=/archive/1234/12345678/index.php;'. // 自身は集計から外す
                        'ga:nextPagePath=~^/archive/\\d+/\\d+/', // 次に遷移した個別のブログ記事のみ集計する
    'metrics' =>        'ga:pageviews',
    'sort' =>           '-ga:pageviews',
    'max-results' =>    $limit,
    'start-date' =>     $start_date,
    'end-date' =>       $end_date,
    'access_token' =>   $accessToken,
));

解説

4 行目
 起点となるページのパスを指定します。サンプルコードでは固定値としていますが、記事毎に集計する場合には、変数で動的に指定するなどしてください。
5 行目
 ユーザが次に遷移したページの集計から、自分自身を除きます。Google Analytics の集計をよく理解できていないのですが、ga:previousPagePathga:nextPagePath が同じ自分自身を指すデータを除外します。
6 行目
 ユーザが次に遷移したページを個別のブログ記事に限定して集計します。サイトごとに URL パスのパターンが異なると思うので、適宜書き換えてください。

応用例 2. Amazon の気になる商品ランキング

 このサイトでは、Amazon のアフィリエイト リンクのクリックも Google Analytics で集計しています。アフィリエイト リンクがクリックされると、/_tracking/ASIN/1234567890 の URL が記録されるので、この URL のアクセスを集計して、"Amazon の気になる商品ランキング"なんてものも生成することもできます。ただし、取得できるデータが ASIN だけですので、商品名や商品画像を表示するにはここから更に一ひねりが必要です。

$data = http_build_query( array(
    'ids' =>            'ga:3857126', // ここはユーザ毎に変わります
    'dimensions' =>     'ga:pagePath',
    'filters' =>        'ga:pagePath=~^/_tracking/ASIN/',
    'metrics' =>        'ga:pageviews',
    'sort' =>           '-ga:pageviews',
    'max-results' =>    $limit,
    'start-date' =>     $start_date,
    'end-date' =>       $end_date,
    'access_token' =>   $accessToken,
));

解説

4 行目
 /_tracking/ASIN/ で始まるアクセスのみ集計します。

応用例 3. 人気のダウンロード一覧

 Amazon の気になる商品ランキングと同様、このサイトでは、ソフトウェア アーカイブなどのダウンロード リンクのクリックも集計していますので、"人気のダウンロード一覧"といったランキングの生成も簡単です。

$data = http_build_query( array(
    'ids' =>            'ga:3857126', // ここはユーザ毎に変わります
    'dimensions' =>     'ga:pagePath',
    'filters' =>        'ga:pagePath=~^/_tracking/download/',
    'metrics' =>        'ga:pageviews',
    'sort' =>           '-ga:pageviews',
    'max-results' =>    $limit,
    'start-date' =>     $start_date,
    'end-date' =>       $end_date,
    'access_token' =>   $accessToken,
));

解説

4 行目
 /_tracking/download/ で始まるアクセスのみ集計します。
このエントリーをはてなブックマークに追加  



関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。