エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


Google Analytics APIを CakePHP3で動かしてレポートデータを取得する方法の解説

      2019/02/24

Google Analytics APIを CakePHP3で動かしてレポートデータを取得する方法

 
この記事では、Google Analytics APIを CakePHP3用に作り変えて、Analyticsのレポートデータを取得する方法を解説します。
 
 
Google Analytics APIのベースとなるサンプルソースは、下記のものです。
 
はじめてのアナリティクス Reporting API v4: ウェブ アプリケーション向け PHP クイックスタート
https://developers.google.com/analytics/devguides/reporting/core/v4/quickstart/web-php?hl=ja
 
これは、PHP用のサンプルソースですが、このままでは CakePHP3で動かすことは出来ないため、これを CakePHP3で動作するように変更する方法の解説です。
 
また、カスタマイズ方法も解説します。
 
 
ただ、最初は、サンプルソースとして提示してある生の PHPのソースコードを利用して、正しく動作することを確認しておくことをおススメします。
 
「[認証情報] ページ」で説明がされている「client_secrets.json」ファイルに認証情報が保存していますが、その「client_secrets.json」ファイルの設定は正しく動作する、という確認をあらかじめしておく方がいいでしょう。
万一エラーが出た場合の不具合の切り分けが楽になります。
 
 

Google Analytics APIを利用するための前準備

 
まず始めは、「https://developers.google.com/analytics/devguides/reporting/core/v4/quickstart/web-php?hl=ja」の「1. API を有効にする」の設定をします。
 
認証情報は、下記の URLから設定を行います。
https://console.cloud.google.com/apis/credentials?hl=ja
 
この時に設定する「承認済みのリダイレクト URI」は「http://example.com/api-googles/oauth2-callback」を設定します。
 
 

Google Analytics APIをインストール

 
Google Analytics APIをインストールします。
 
下記コマンドで Google Analytics API(Google APIクライアントライブラリ「google/apiclient」)をインストールします。
 
コマンドを実行する場所は、CakePHP3のアプリケーションのルートフォルダです。
Composerコマンドは、ルート権限ではないユーザ権限で実行します。
 

 
必要となる APIは、Google APIクライアントライブラリ「google/apiclient」と呼ばれるもので、Google Analytics専用の APIライブラリというわけではありません。
Analyticsのほか、Search Consoleにも使いますので、使い方を理解すると、Googleの他のサービスを APIからコントロールすることができるようになります。
 
CakePHP3を利用して Google APIクライアントライブラリ「google/apiclient」を使う場合は、Composerを使って Google APIクライアントライブラリ「google/apiclient」をインストールします。
 
インストールをすると、下記フォルダが作成され、その中に各種ライブラリがインストールされます。
 /vendor/google
 


 

CakePHP3対応の Google Analytics APIサンプルプログラムを設置

 
Google Analytics APIのサンプルとして提示してあったファイルを CakePHP3用にカスタマイズしたプログラムが下記になります。
 
このプログラムを「ApiGooglesController.php」というファイル名で保存し、「/src/Controller/」フォルダの中に設置します。
 

 
 

CakePHP3対応の Google Analytics APIサンプルプログラムのソースコードの解説

 
2行目、4行目に CakePHP3の定型文として namespaceと use句を追加します。
 
加えて、15、16行目の Classの設定をします(157行目の Classの閉じカッコも)。
今回は、Googleの APIを使うということで、クラス名は「ApiGooglesController」としています。(ファイル名は「ApiGooglesController.php」です。)
 
 
6行目~12行目の「use ...句」では、使用する APIのクラスをインポートします。
ここで解説している以外のクラスを使う場合は、この use句を追加していきます。
 
Composerを使用して 「google/apiclient」をインストールしていますので、「use ...句」を記述するだけで、APIのクラスを利用できるようになります。
 
APIのクラスまでのパスなどは、Composerが管理しています。
具体的には、下記のファイルなどにパスなどが記述されています。
 /vendor/composer/autoload/autoload_classmap.php
 /vendor/composer/autoload/autoload_namespaces.php
 
各クラスの呼び出しは、use句で行いますので、24行目の「require_once」で「autoload.php」を呼び出す必要はなくなります。
(あるとエラーになりますので、コメントアウトしています。)
 
プログラムを実行したときに「Class 'App\Controller\Google_Service_Analytics' not found」のエラーが出る場合は、「use ...句」で指定しているクラスに抜けがある場合があります。
 
 
21行目、126行目の「$this->render()」でテンプレート読み込みを OFFにします。
CakePHP3では、デフォルトで自動的にレイアウトファイルとテンプレートファイルを呼び出しますので自動レンダリングを OFFにします。
 
テンプレートファイルやレイアウトファイルを変更や OFFにする詳細な方法は「CakePHP3のcontroller内でテンプレート、レイアウトを変更する際の指定方法」を参考にしてください。
 
 
52、147、154行目は、リダイレクトの設定を変更しています。
CakePHP3でリダイレクトをさせる場合は「header('Location: ****');」を使わず、「$this->redirect()」を使います。
そのため、51行目は 52行目のように、146行目は 147行目のように、153行目は 154行目のように修正します。
 
 
「oauth2callback.php」は、クラス「ApiGooglesController」内の一つのアクションとして取り込みます。
アクション名は「oauth2Callback」となります(「C」が大文字になっています)。
 
そして、アクセスする URLは indexアクションが以下になります。
http://example.com/api-googles/
 
「oauth2Callback」アクションの URLは以下になります。
http://example.com/api-googles/oauth2-callback
 
この URLは、先に解説をした、APIの「認証情報」で登録した「承認済みのリダイレクト URI」の URLと同じものです。
 
これに合わせるため、49行目は 50行目のように、138行目は 139行目のように、151行目は 152行目のように修正します。
(indexアクション内で、APIの認証情報を取得できていない場合は、「oauth2Callback」アクションにリダイレクトし、認証情報を取得(セッションに保存)。そして、indexアクションに改めてリダイレクトする、という処理になっています。)
 


 

Google Analytics APIをカスタマイズする方法

 

Google Analytics APIをカスタマイズしたサンプルソース

 
前項のサンプルソースのうち、「getReport」アクションの部分が、取得するレポートの内容を規定している箇所になります。
この部分をカスタマイズすることで、求めるレポートを取得することができます。
 
例えば、前項のサンプルソースは、全ページの合計の「sessions」値を取得する処理になっています。
 
ですが、これを下記の条件で取得するように変更します。
 ・ランディングページ単位でレポートを取得
 ・「sessions」「pageviews」「users」の項目を取得
 ・「sessions」をキーとして降順で並べる
 ・最大 10件までを取得する
 
変更するのは「getReport()」アクションで、下記の様に変更します。
 

 
このカスタマイズでは、新しく「Google_Service_AnalyticsReporting_Dimension」「use Google_Service_AnalyticsReporting_OrderBy」クラスを使用しています。
そのため、ファイルの初めの方に記述している「use句」の辺りに下記の use句を追記し、それぞれのクラスを呼び出しておきます。
(「use Google_Service_AnalyticsReporting_GetReportsRequest;」の下あたりに追加します。
 

 
 

Google Analytics APIからディメンションを追加してレポートを取得

 
元々のサンプルソースは、全ページの合計の「sessions」値を取得する処理になっています。
 
ですが、通常は、
 「ページ単位でアクセス数が多いものから順番に」
 「1日単位でアクセス数が多いものから順番に」
といったように、何かしらの単位で区切って集計したデータを取得すると思います。
 
その「ページ単位で」「1日単位で」などの属性単位で区切る項目を「ディメンション」と言います。
 
詳しくは下記を参照してください。
 
ディメンションと指標(アナリティクスヘルプ)
https://support.google.com/analytics/answer/1033861?hl=ja
 
 
このディメンションを設定するのが 7、8行目です。
 
設定したディメンションをリクエストに追加するのが 42行目です。
 
このサンプルでは「landingPagePath」(ランディングページ)単位でレポートを取得しています。
 
 
また、ディメンションを複数設定する場合は、下記の様に、ディメンションのオブジェクトを増やして対応します。
 

 
そして、上記で設定した内容を 42行目のリクエストに追加します。
42行目はもともと配列で設定するように記述してありますので、変数をカンマ(,)でつないでいくだけで OKです。
 

 
 

Google Analytics APIから取得する項目(カラム、Metric)を追加してレポートを取得

 
元々は、取得する項目は「sessions」だけでしたが、「pageviews」「users」を加えたのが上記のサンプルです。
 
レポートして取得する項目(カラム、Metric)を追加する場合は、20行目~28行目の様に、「Google_Service_AnalyticsReporting_Metric()」を追加し、オブジェクトごと追加します。
 
また、追加したオブジェクトを、40行目の「$request->setMetrics()」の配列の中に追加することでリクエストに追加します。
 
 

Google Analytics APIから取得するレポートをソートする

 
取得するレポートをどういう条件で並べて取得するか、を指定することもできます。
 
サンプルプログラムでは、30行目~34行目がそれに当たります。
追加したソート条件を 43行目でリクエストに追加します。
 
 
また、ソートもまた、複数の項目を指定してソート条件を指定することもできます。
指定方法は、ディメンションやメトリックスと同じように、オブジェクトごと追加していきます。
 

 
また、上記で設定したソート順のオブジェクトは、43行目の「setOrderBys」で指定を行いますが、先のサンプルでは配列で指定するようにはなっていませんでした。
ですが、「setOrderBys」でも配列で指定することで複数の項目を指定することができます。
 

 
ちなみに、「ASCENDING」が「昇順」で、「DESCENDING」が「降順」です。
 
 

Google Analytics APIから取得するレポート件数を指定する

 
デフォルトでは取得件数に制限がなく、全件取得する設定になっています。
そのため、指定する条件によってはすごい数のレポートが取得できてしまう場合もあります。
 
そのようなときのために、取得するレポートの件数を指定することもできます。
指定方法は、44行目の様に「setPageSize()」で指定します。
 
取得件数の指定は、クラスで条件を指定せず、リクエストに直接記述するだけです。
 


 

Google Analytics APIから取得するレポートのディメンションにフィルタを設定する

 
取得するレポートによっては、すべてのレポートを必要としておらず、特定の条件のレポートだけ取得できればいい、という場合があるでしょう。
 
例えば、来訪者のレポートを取得するときに「Organic Search」のみのデータを欲しい、という場合です。
 
こういう場合は、ディメンションのフィルタ機能を使い、取得するデータを絞ることができます。
 
 
まず最初に、use句を追記します。
一つ目の「Google_Service_AnalyticsReporting_Dimension」はすでに記載しているものだと思いますので、それに続けて設定するといいでしょう。
 

 
続けて、これまで解説をしてきた「getReport」アクションの中のレポートの取得条件の中に下記を追記します。
 

 
「setDimensionName」でフィルタを設定するディメンションの項目名を指定します。
「setOperator」では項目名に対してどういう条件か、を指定します。サンプルの「EXACT」は完全一致するレコードを抽出します。
「setExpressions」では条件となる文字列を指定します。「/」はドキュメントルート、ということを示しています。
 
このサンプルでは、「landingPagePath」の項目が「/」と完全一致するレコードのみ取得する、というフィルタ設定になります。
 
これまで解説した項目と同じく、複数の項目を設定したい場合は、複数のオブジェクトを設定します。
 
ちなみに、フィルタを設定するディメンションの項目は、ディメンションとして登録してある必要はありません。
ただ、一般的にはフィルタリングを設定した内容が正しいか、の確認のためにはフィルタリングを設定している項目はディメンションに入れておく方がいいでしょう。
 
 
また、下記の記述を 38行目辺りの「$request->set*****」に追記します。
 

 
 
ちなみに、「Dimension」「Filter」の複数形の「s」のありなしが結構面倒です。
下記の Googleのオフィシャルサイトでは「DimensionsFilters」となっていますので、両方に「s」がいるのかと思いきや、そうではないようです。
https://developers.google.com/analytics/devguides/reporting/core/v4/basics?hl=ja#filtering_1
 
 

Google Analytics APIから取得するレポートのメトリックスにフィルタを設定する

 
前項では、ディメンションにフィルタを設定する方法を解説しました。
この項での解説は、メトリックスにフィルタを設定する方法です。
 
例えば、取得したデータのうち、「session」数が「50」以上のデータだけを取得したい、というような場合に使用する設定です。
 
前項は、ディメンションとして設定する項目に対して設定するフィルタで、この項目ではメトリックスとして設定する項目に対して設定するフィルタです。
 
 
まず最初に、use句を追記します。
一つ目の「Google_Service_AnalyticsReporting_Metric」はすでに記載しているものだと思いますので、それに続けて設定するといいでしょう。
 

 
続けて、これまで解説をしてきた「getReport」アクションの中のレポートの取得条件の中に下記を追記します。
 

 
「setMetricName」でフィルタを設定するディメンションの項目名を指定します。
「setOperator」では項目名に対してどういう条件か、を指定します。サンプルの「GREATER_THAN」はその値より大きい値を取得します。同じ値の場合は「EQUAL」を、未満の値の場合は「LESS_THAN」を指定します。
「setComparisonValue」では条件となる値を指定します。
 
このサンプルでは、「users」の項目が「50」件を超えるレコードのみ取得する、というフィルタ設定になります。
 
これまで解説した項目と同じく、複数の項目を設定したい場合は、複数のオブジェクトを設定します。
 
また、下記の記述を 38行目辺りの「$request->set*****」に追記します。
 

 
 

Google Analytics APIのさらなるカスタマイズ

 
Google Analytics APIのレポート取得処理のさらなるカスタマイズとして、レポートを取得する期間を複数設定したり、ディメンションを任意の範囲で分けてレポートを出力する設定をしたり、ということもできます。
 
さらなるカスタマイズ方法については、下記のオフィシャルサイトが参考になります。
https://developers.google.com/analytics/devguides/reporting/core/v4/basics
 
また、項目名については、Google Analyticsの画面の項目名を見るといいのですが、通常は日本語表示となっていると思いますので、英語表記が分かりません。
 
そんな時は、下記の記事にあるように、一度英語表記に変えるといいでしょう。
英語表記して、表記してある項目名を使うことで、APIからデータを取得することができます。
https://www.adminweb.jp/analytics/setup/index2.html
 
また、下記のサイトではレポートの項目名の解説がしてありますので、こちらも参考になります。
http://onocom.net/blog/google-analytics-core-reporting-api-%E3%83%87%E3%82%A3%E3%83%A1%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%A1%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9%E3%81%AE%E8%A6%9A%E6%9B%B8%EF%BC%BB%E5%BE%90/
 
 

Google Analyticsのサンプリング

 
Google Analyticsには「サンプリング」という機能があります。
https://support.google.com/analytics/answer/2637192?hl=ja
https://developers.google.com/analytics/devguides/reporting/core/v4/basics#sampling
 
上記の説明ではよく分かりませんが、アクセス数が多いサイトは、すべてのデータを集計するのではなく、一定の割合のデータをサンプリングして、全体のデータを計算して提示している、というものです。
 
つまり、集計元のデータが大きい場合は、実数なのではなく、計算値である、ということです。
 
 
APIでレポートデータを取得する上で問題になるのは、GoogleAnalyticsの管理画面で見ているデータと、APIから取得しているデータの集計期間が違う場合です。
 
管理画面では特定の 1ヵ月のデータを見ているとします。
 
対して、APIから取得したデータでも 1ヵ月分の集計データを見ていたとします。
ですが、APIから取得する際、12ヵ月の期間を指定してレポートデータを取得し、それを自作のプログラムで集計し直して 1ヵ月分のデータとして画面に表示する処理となっているとします。
 
この場合、アクセスが少ないサイトであれば問題は起こらないのですが、アクセスがある一定以上ある場合は、12ヵ月の期間を指定したことによってサンプリングを実施するための閾値(しきいち)を超える場合があります。
そうすると、サンプリングの処理が行われるため、管理画面で見ている数値と、APIから取得したレポートの数値とで差異が出てくる場合があるのです。
 
このような場合は、APIからデータを取得する期間を 12ヵ月より短くして、複数回取得する処理にする必要がでてくるわけです。
 
 

CakePHP3の関連記事

CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3でCookieを保存、呼び出し、削除の操作・CakePHP3.7対応
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
CakePHP3のdatetime型カラムの日時の扱い。秒まで正しく表示する方法
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 2.x 3.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法
CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法

CakePHP2の検索プラグイン「CakeDC/Search」で、重複レコードを省くgroup by、distinctを使う方法についての解説。設定する場所はpaginatorの条件とするので、find()関数と同じ。

CakePHP3のCakeDC/UsersのUserHelperでログアウトやreCAPTCHAをカスタマイズ
CakePHP3のCakeDC/UsersのUserHelperでログアウトやreCAPTCHAをカスタマイズ

CakeDC謹製Usersプラグインの紹介。UserHelperを利用し、ログアウトのリンクや権限があるときのみ表示されるリンク、プロフィールページへのリンク、reCAPTCHAの設置方法などを解説。

CakePHP 2.x系 Viewでのコメントの記述方法など

CakePHPにおいて View、ctpファイルでコメントを記述する方法を解説。

CakePHP 2.3 Model、Controllerの見たい変数の中身をログ出力

CakePHPの Modelや Controllerの変数の中身をログとして出力して見る方法を提供します。

CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法
CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法

コントローラーからビューに送ったテーブルのオブジェクトを連想配列に変換し、ビューの中で自由に使えるようにするメソッド「toArray()」の解説。連想配列に変換できれば利用度アップ!

CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法

CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。

CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)

CakePHP3の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。

CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法

CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!

CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法
CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法

CakePHP3でtitleタグ、h1タグのテキストをデフォルトから変更する方法を解説。テンプレートファイルに「$this->assign()」でテキストを指定して「/Layout/defult.ctp」で受け取る。

CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法

CakePHP3のツリービヘイビアを使ったツリーカテゴリーの子階層も含めての検索を検索プラグイン「friendsofcake/search」を使って実現する方法を解説しました。