PHPとGoogle Analytics APIでページビューランキングを作る

PHP
広告

ページビューランキングは、自前のアクセスカウンターで行っていました。
しかしそれだと、週間や月間などが表示できない作りとしてしまったため、大幅な作り替えと今までの数は集計できません。
そこで、何か手が無いかなと調べていたら、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の使い方に書いてありますが、基本的には正規表現で書けば良いです。


完成です!


当サイトでは多少カスタマイズして右のサイドバーに設置してあります。