はじめてのGoogle Analytics Reporting APIをちょっとだけ使ってみる
Google AnalyticsからAPIで情報を取得することになりました。
しかし、Google AnalyticsもGoogle APIも使ったことがないので全く分かりません。
ここでは、調べながらはてなブログの情報をGoogle Analytics Reporting APIで取得するまでをやってみます。
Google Analyticsの設定をする
まずは、情報の基となるGoogle Analyticsを設定します。 今回は、このponsuke_taro's blogをGoogle Analyticsに設定して情報を蓄積できるようにします。
はてなブログ用のデータ解析をユニバーサル アナリティクスプロパティで作成する
参考 : Google Analyticsを導入する - はてなブログ ヘルプ
ユニバーサル アナリティクスは前世代の Google アナリティクスです。ユニバーサル アナリティクス プロパティと Google アナリティクス 4 プロパティとでは、使用できるレポートに違いがあります。
- (ない場合)Google アカウントの作成でアカウントを作成する
- お客様のビジネスに適した分析ツールとソリューション - Google アナリティクス を表示する
- [無料で利用する]ボタンで次の画面へ遷移し、[測定を開始]ボタンで設定画面を表示する
- 「アカウント名」に何のアクセス解析かわかる名前を設定して[次へ]ボタンで進む
- 「プロパティ名」などの入力項目を設定して登録する
- レポートのタイムゾーン」「通貨」 : 日本に設定する
- [プロパティの設定]の下にある[詳細オプションを表示]リンクでユニバーサル アナリティクスプロパティの設定欄を表示して以下を設定して[次へ]ボタンで進む
- ユニバーサル アナリティクス プロパティの作成 : ON
- ウェブサイトの URL : 登録するはてなブログのURL
- ユニバーサル アナリティクスのプロパティのみを作成する : ON
- [ビジネス情報]部分は任意で入力して[作成]ボタンで作成する
- [プロパティ]で作成したプロパティを選択 > [トラッキング情報] > [トラッキングコード] > [トラッキングID]をメモしておく
はてなブログにトラッキングIDを設定する
- はてなブログにログインしてダッシュボード管理画面を表示する
- [設定] > [詳細設定] > [解析ツール] > [Google Analytics 埋め込み]にメモしたGoogle AnalyticsのトラッキングIDを入力する
- ページ下の[変更する]ボタンで変更を確定する
Google Cloud PlatformでAPI使えるようにする
作成したはてなブログ用のデータ解析に溜まった情報をGoogle Cloud Platform(以降GCP)のAPIで取得できるように設定していきます。
Google Analytics Reporting APIを有効化する
まずは、Google Analytics Reporting APIを使えるように設定します。
- Google Cloud Platformにログインする
- (ない場合)プロジェクトを作成する
- GCP画面上部でプロジェクトを選択 > [APIとサービス] > [ライブラリ]
- 「Google Analytics API」を検索して、「Google Analytics Reporting API」を選択する
- [有効にする]ボタンでAPIを有効化する
3つ候補に出てきたAPIの違いがいまいちわからないので頑張った概要の和訳を記録として書いておきます。
API名 | 概要の頑張った和訳 |
---|---|
Google Analytics API | Analyticsの設定およびレポートデータへのアクセスを提供します。 |
Google Analytics Reporting API | Google Analyticsでレポートデータにアクセスするための最も高度なプログラム的方法です。Google AnalyticsレポートAPIを使用すると、カスタムダッシュボードを構築してGoogle Analyticsデータを表示したり、複雑なレポートタスクを自動化して時間を節約したり、Google Analyticsデータを他のビジネスアプリケーションと統合したりすることができます。 |
Google Analytics Data API | Google Analyticsのレポートデータにアクセスします。 |
サービスアカウントを作成する
APIを利用するサービスアカウントを作成します。
サービス アカウントは IAM によって管理されるもので、人間のユーザー以外のものを指しています。App Engine アプリの実行や Compute Engine インスタンスとのやり取りなど、アプリケーション自体がリソースにアクセスする場合や、アクションを独自に実行する必要がある場合を対象としています。
- GCP画面上部でプロジェクトを選択 > サイドメニュー[APIとサービス] > [認証情報]
- [認証情報を作成]ボタン > [サービス アカウント]
- 「サービス アカウント名」「サービス アカウント ID」に任意の値を入力して[完了]ボタンでアカウントを作成する
- 一覧にある作成したアカウントの[操作] > [詳細を管理]で詳細画面を表示
- [キー]タブ > [鍵を追加] > [新しい鍵を作成]
- [キーのタイプ]で「JSON」を選択 > [作成]ボタンで作成して鍵ファイルをダウンロードする
- ここでダウンロードする鍵ファイルは「再作成できない」「鍵があればサービスを使えてしまう」ので超大切に保管する
Google Analyticsで作成したサービスアカウントに権限を設定する
作成したアカウントがGoogle Analyticsにあるはてなブログの情報を取得できるように権限を設定します。
- Google Analyticsにログインする
- 管理 > 対象のアカウント選択 > [アカウントユーザーの管理]
- 右上の[+]ボタン > [ユーザーを追加]
- 以下を設定して[追加]ボタンで追加する
- メールアドレス : 作成したサービスアカウントのサービスアカウントID(
@
以降も入力する) - 権限 : 表示と分析
- メールアドレス : 作成したサービスアカウントのサービスアカウントID(
Google Analytics Reporting APIを呼び出す
早速、Google Analytics Reporting APIを呼び出してみます。
PythonとCloud9でちょっとだけ使ってみる
メトリクスとディメンションって何?
レポートの作成 | アナリティクス Reporting API v4 | Google Developersで基本の使い方を見ていくとまずはmetrics
とdimensions
なるものに引っかかりました。
Web分析をやっている人には疑問に思わないことなのでしょうが、Google AnalyticsはおろかWeb分析的なことをやったことがないので「メトリクス」「ディメンション」が何なのかわかりません。
アナリティクスのレポートは、すべてディメンションと指標の組み合わせに基づいて構成されます。
ディメンションはデータの属性です。たとえば、ディメンション「市区町村」はセッションの性質を表し、「横浜」、「川崎」などセッションが発生した市区町村を指定します。ディメンション「ページ」は、閲覧されたページの URL を表します。
指標はデータを定量化したものです。指標「セッション」はセッションの合計数です。指標「ページ/セッション」は、セッションあたりの平均閲覧ページ数です。
「メトリクス=量」「ディメンション=量の単位」みたいな感じです(正確には違うけど)。
「日単位のPV数を取得したい」だと「日」がディメンションで「PV数」がメトリクス・・・的な。
HelloAnalytics.pyのget_report
メソッドにあるパラメータをこんな感じに変えると・・・
※. ここのコードははじめてのGoogle Analytics Reporting APIをPythonとCloud9でちょっとだけ使ってみる - ponsuke_tarou’s blogで使ったものを基にしています。
# ...省略... 'reportRequests': [ { 'viewId': VIEW_ID, 'dateRanges': [{'startDate': '7daysAgo', 'endDate': 'today'}], # メトリクスにPVを指定 'metrics': [{'expression': 'ga:pageviews'}], # ディメンションに日にちを指定 'dimensions': [{'name': 'ga:date'}] }] # ...省略...
こんな感じで「日単位のPV数」が取得できました。
ga:date: 20210316 Date range: 0 ga:pageviews: 411 ga:date: 20210317 Date range: 0 ga:pageviews: 845 ga:date: 20210318 Date range: 0 ga:pageviews: 787 ga:date: 20210319 Date range: 0 ga:pageviews: 498
メトリクスとディメンションで指定する値の意味が分からなくなりそうなので使ったものはメモしていきます。
dimensions | 意味 | レスポンス例 |
---|---|---|
ga:date | 日付 | 20210322 |
ga:pagePath | ページ | "/ponsuke0531/items/edf2eee638202aa7f61f" |
ga:sourceMedium | 参照元 | "zenn.dev / referral" |
ga:dimension{インデックス番号} | カスタム ディメンション |
どこかに日本語で一覧があったらいいのに・・・。
metrics | 意味 | type | レスポンス例 |
---|---|---|---|
ga:pageviews | ページビュー数 | INTEGER | 1631 |
ga:avgTimeOnPage | 平均ページ滞在時間(秒) | TIME | "387.46666666666664" |
ga:bounceRate | 直帰率 | PERCENT | "0.0" |
Google APIには、リクエスト数の制限がありますので気をつけましょう。
遊びで使っているだけならいいのですが、お仕事で使う場合などにはAPIへのリクエスト数の制限がありますので気をつけましょう。
Node.jsでちょっとだけ使ってみる
1回のAPI呼出しで5こまでリクエストを送信できます
各リクエストには、別々のレスポンスが返されます。リクエストは最大で 5 つ送信できます。すべてのリクエストには、同じ dateRanges、viewId、segments、samplingLevel、および cohortGroup が含まれている必要があります。
リクエストの本文 | メソッド: reports.batchGet | アナリティクス Reporting API v4 | Google Developers
こんな感じで1回のAPI呼出しで2このリクエストを送信してみました。
※. ここのコードははじめてのGoogle Analytics Reporting APIをNode.jsでちょっとだけ使ってみる - ponsuke_tarou’s blogで使ったものを基にしています。
let dateRanges = [{startDate: '2021-03-19', endDate: '2021-03-30'}] // 1回のAPI呼出し const res = await client.reports.batchGet({ requestBody: { reportRequests: [ // 1こ目のリクエスト { viewId: VIEW_ID, dateRanges: dateRanges, dimensions: [{name: 'ga:pagePath'}], metrics: [{expression: 'ga:pageviews'}, {expression: 'ga:avgTimeOnPage'}], orderBys: {fieldName: 'ga:pageviews', sortOrder: 'DESCENDING'}, pageSize: 3 }, // 2こ目のリクエスト { viewId: VIEW_ID, dateRanges: dateRanges, dimensions: [{name: 'ga:sourceMedium'}], metrics: [{expression: 'ga:bounceRate'}, {expression: 'ga:avgTimeOnPage'}], orderBys: {fieldName: 'ga:avgTimeOnPage', sortOrder: 'DESCENDING'}, pageSize: 3 } ] } })
レスポンスも2こ分返ってきました。(レスポンスは手ごろに改行しています。)
{"reports":[ { "columnHeader":{"dimensions":["ga:pagePath"],"metricHeader":{"metricHeaderEntries":[{"name":"ga:pageviews","type":"INTEGER"},{"name":"ga:avgTimeOnPage","type":"TIME"}]}}, "data":{"rows":[ {"dimensions":["/ponsuke0531/items/4629626a3e84bcd9398f"],"metrics":[{"values":["1631","387.46666666666664"]}]}, {"dimensions":["/ponsuke0531/items/df51a784b5ff48c97ac7"],"metrics":[{"values":["1160","601.5056179775281"]}]}, {"dimensions":["/ponsuke0531/items/edf2eee638202aa7f61f"],"metrics":[{"values":["999","401.8253968253968"]}]} ], "totals":[{"values":["35429","382.3464974141984"]}], "rowCount":499, "minimums":[{"values":["1","0.0"]}], "maximums":[{"values":["1631","1679.0"]}]}, "nextPageToken":"3" }, { "columnHeader":{"dimensions":["ga:sourceMedium"],"metricHeader":{"metricHeaderEntries":[{"name":"ga:bounceRate","type":"PERCENT"},{"name":"ga:avgTimeOnPage","type":"TIME"}]}}, "data":{"rows":[ {"dimensions":["27.94.140.223:8080 / referral"],"metrics":[{"values":["0.0","1335.0"]}]}, {"dimensions":["nekorokkekun.hatenablog.com / referral"],"metrics":[{"values":["0.0","996.0"]}]}, {"dimensions":["zenn.dev / referral"],"metrics":[{"values":["0.0","909.0"]}]} ], "totals":[{"values":["86.22115384615384","382.3464974141984"]}], "rowCount":69, "minimums":[{"values":["0.0","0.0"]}], "maximums":[{"values":["100.0","1335.0"]}]}, "nextPageToken":"3" } ]}
試しにリクエストの部分をコピペして6こリクエストを送信したらちゃんと以下のエラーになりました。
$ node analytics.js (node:7580) UnhandledPromiseRejectionWarning: Error: There are too many requests in the batch request. The max allowed is 5 at Gaxios._request (C:\path\google-analytics-api\node_modules\gaxios\build\src\gaxios.js:127:23) at process._tickCallback (internal/process/next_tick.js:68:7) (node:7580) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:7580) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
JavaとSpringBootでちょっとだけ使ってみる(現在奮闘中)
さて、実際に使いたい環境でもやってみようと思ったら・・・そもそもPythonは使っていない・・・本当にぽんすけですね。 ということで今度はJavaを使ってSpring Bootの環境でやってみたいと思います。
- Spring Bootのプロジェクトを用意する
- クライアント ライブラリをインストールする