エス技研

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


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

   

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ヵ月より短くして、複数回取得する処理にする必要がでてくるわけです。

 - CakePHP 2.x 3.x

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い

CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。

CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法
CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法

CakePHP3に付属しているデバッグのためのツール、デバッグキットを強制的に有効化、無効化する方法を解説。初期設定では開発環境としてありそうなドメインの場合のみ有効になるように設定されている。

CakePHP3でファイルのアップロード処理を自作・解説付き・その1
CakePHP3でファイルのアップロード処理を自作・解説付き・その1

CakePHP3でファイルをアップロードする処理を、php.netにある「エラーを起こさない」と説明がある処理を参考に作成。サンプルソースとその解説付きで、コピペでも動くし、カスタマイズも簡単!

CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合

ID以外のカラムでアソシエーション(連携)させるための考え方とサンプルソースを用いての説明を行っています。

CakePHP 2.3でファイルのアップロード処理を作る

CakePHPでプラグインを使わないファイルアップロード処理を解説します。簡単です。DBにファイルを格納する方法も。

CakePHP3のCakeDC/Usersのログイン後のリダイレクトを設定解説
CakePHP3のCakeDC/Usersのログイン後のリダイレクトを設定解説

CakeDC謹製Usersプラグインの紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。

CakePHP 2.3 デバッグキット(DebugKit)超初心者向けフォロー講座

CakePHP初心者に向けてデバッグキット(DebugKit)のインストール方法、はまりポイントを解説。

CakePHP 2.3 bakeの超初心者向けフォロー講座

CakePHP 2.3 bakeの超初心者向けフォロー講座

CakePHPで favicon.icoやapple-touch-icon-144-precomposed.pngが could not be foundのエラーが出るときの対処方法
CakePHPで favicon.icoやapple-touch-icon-144-precomposed.pngが could not be foundのエラーが出るときの対処方法

CakePHPで「CakeDC/Users」などルーティングを行うプラグインを利用するときに、favicon.icoやapple-touch-icon-144-precomposed.pngがNotFoundエラーになることがある。その対処方法の解説。

CakePHP3でPHPExcelを使ってエクセルファイルを生成、出力する方法

CakePHP3でPHPExcelを利用してエクセルを編集、出力するサンプルソース+解説。PHPExcelのインストール方法の解説からファイル保存とダウンロードの方法なども解説。