PHPとGoogle Analytics APIでページビューランキングを作る
ページビューランキングは、自前のアクセスカウンターで行っていました。
しかしそれだと、週間や月間などが表示できない作りとしてしまったため、大幅な作り替えと今までの数は集計できません。
そこで、何か手が無いかなと調べていたら、Google Analytics APIを利用すると簡単にできるようですので、早速やってみました。
サンプルコードは色々と検索にひっかかるのですが、現行のGoogle謹製ライブラリを使うと、そのままでは動きませんでしたので、記載しておこうと思います。
(きっと数ヶ月後には、この書き方では動かなくなることでしょう・・・)
前提
Google Analytics APIには利用方法に制限がありますので、定期的にサーバ上でGoogle Analytics APIを叩いて、その結果をファイルに書き込みます。
そのファイルをブログでは読み込みページビュー数を表示しようと思います。
そのため、利用する認証情報はサービスアカウントとなります。
Google Analytics APIを使うための準備
- Google Developers Consoleでプロジェクトを作成
- Google Analytics APIを有効化
- OAuth2.0の認証情報を作成
- ・・・
- ビューIDの取得
など一連の流れは、「Google Analytics API v3をPHPから利用する方法」を参考に作ってください。
多少画面は違いますが、流れは同じです。
そして、注意事項としては、サービスアカウントを作成するときにp12ではなくjsonで作成してください。
プログラムで使用するのは、以下の情報です。
- サービスアカウントのjsonファイル
- ビューID
また、APIを簡単に使えるライブラリとして「Google APIs Client Library for PHP」を使用します。
PHPからGoogle Analytics APIを使用する
早速、Google Analytics APIを叩いて情報を取得するプログラムを作ってみます。
//秘密鍵のjsonファイルの場所を指定
$auth_file = 'xxx.json';
//ビューIDを指定
$view_id = 'xxxxxx';
//開始日
$from = '7daysAgo';
//終了日
$to = 'today';
//取得件数
$max = 10;
//ドメイン
$doamin = '//localhost';
//Google APIs Client Library for PHPのcomposerで作成したautoloadの場所を指定
require_once '/google-api-php-client/vendor/autoload.php';
$client = new Google_Client();
$client->setApplicationName('Access Analysis');
$client->setAuthConfig($auth_file);
putenv('GOOGLE_APPLICATION_CREDENTIALS='. $auth_file);
$client->useApplicationDefaultCredentials();
$client->setScopes(array('https://www.googleapis.com/auth/analytics.readonly'));
if ($client->isAccessTokenExpired()) {
$client->refreshTokenWithAssertion();
}
$ga = new Google_Service_Analytics($client);
$result = $ga->data_ga->get(
'ga:'. $view_id,
$from,
$to,
'ga:pageviews',
[
'dimensions' => 'ga:pageTitle,ga:pagePath',
'sort' => '-ga:pageviews',
'max-results' => $max
]
);
$tmp = '<ul>';
for ($i = 0; $i < count($result['rows']); $i++) {
$title = $result['rows'][$i][0];
$link = $domain. $result['rows'][$i][1];
$pv = $result['rows'][$i][2];
$tmp .= '<li><p><a href="'. $link. '">'. $title. '</a><br /> '. number_format($pv). '</p></li>';
}
$tmp .= '</ul>';
//保存
file_put_contents('log.txt', $tmp);
cronなどで定期的に取得
これで動けば、あとはcronで好きな周期で取得すれば大丈夫です。
1日50,000リクエストまでですので、その制限に引っかからないようにすれば大丈夫です。
表示側のPHPでjavascriptなどで読み出す
ajaxなどでファイルの中身を返すようなプログラムとするか、そのままincludeする形でも良いかと思います。
好きなように動かせば大丈夫です。
除外設定
このままですと、(not set)などの情報も含まれてきますので、フィルター設定で除外されることをおすすめします。
$result = $ga->data_ga->get(
'ga:'. $view_id,
$from,
$to,
'ga:pageviews',
[
'dimensions' => 'ga:pageTitle,ga:pagePath',
'sort' => '-ga:pageviews',
'max-results' => $max,
'filters' => 'ga:pagePath!~/index.php.*' //filter
]
);
フィルターの設定はAPIの使い方に書いてありますが、基本的には正規表現で書けば良いです。
完成です!
当サイトでは多少カスタマイズして右のサイドバーに設置してあります。















