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の使い方に書いてありますが、基本的には正規表現で書けば良いです。
完成です!
当サイトでは多少カスタマイズして右のサイドバーに設置してあります。