はじめてのGoogle Analytics Reporting APIをちょっとだけ使ってみる

Google AnalyticsからAPIで情報を取得することになりました。

しかし、Google AnalyticsGoogle APIも使ったことがないので全く分かりません。

ここでは、調べながらはてなブログの情報をGoogle Analytics Reporting APIで取得するまでをやってみます。

Google Analyticsの設定をする

まずは、情報の基となるGoogle Analyticsを設定します。 今回は、このponsuke_taro's blogをGoogle Analyticsに設定して情報を蓄積できるようにします。

はてなブログ用のデータ解析をユニバーサル アナリティクスプロパティで作成する

参考 : Google Analyticsを導入する - はてなブログ ヘルプ

ユニバーサル アナリティクスは前世代の Google アナリティクスです。ユニバーサル アナリティクス プロパティと Google アナリティクス 4 プロパティとでは、使用できるレポートに違いがあります。

ユニバーサル アナリティクス プロパティ - アナリティクス ヘルプ

  1. (ない場合)Google アカウントの作成でアカウントを作成する
  2. お客様のビジネスに適した分析ツールとソリューション - Google アナリティクス を表示する
  3. [無料で利用する]ボタンで次の画面へ遷移し、[測定を開始]ボタンで設定画面を表示する
    • f:id:ponsuke_tarou:20210316135110p:plainf:id:ponsuke_tarou:20210316135148p:plain
  4. 「アカウント名」に何のアクセス解析かわかる名前を設定して[次へ]ボタンで進む
    • f:id:ponsuke_tarou:20210316135344p:plain
  5. 「プロパティ名」などの入力項目を設定して登録する
  6. [プロパティの設定]の下にある[詳細オプションを表示]リンクでユニバーサル アナリティクスプロパティの設定欄を表示して以下を設定して[次へ]ボタンで進む
    • ユニバーサル アナリティクス プロパティの作成 : ON
    • ウェブサイトの URL : 登録するはてなブログのURL
    • ユニバーサル アナリティクスのプロパティのみを作成する : ON
  7. [ビジネス情報]部分は任意で入力して[作成]ボタンで作成する
  8. [プロパティ]で作成したプロパティを選択 > [トラッキング情報] > [トラッキングコード] > [トラッキングID]をメモしておく
    • f:id:ponsuke_tarou:20210317210549p:plain

はてなブログにトラッキングIDを設定する

  1. はてなブログにログインしてダッシュボード管理画面を表示する
  2. [設定] > [詳細設定] > [解析ツール] > [Google Analytics 埋め込み]にメモしたGoogle AnalyticsのトラッキングIDを入力する
  3. ページ下の[変更する]ボタンで変更を確定する
  4. f:id:ponsuke_tarou:20210317212016p:plain
    お茶しながら数時間待つとGoogle Analyticsの画面にいろいろ表示され始める

Google Cloud PlatformでAPI使えるようにする

作成したはてなブログ用のデータ解析に溜まった情報をGoogle Cloud Platform(以降GCP)のAPIで取得できるように設定していきます。

Google Analytics Reporting APIを有効化する

まずは、Google Analytics Reporting APIを使えるように設定します。

  1. Google Cloud Platformにログインする
  2. (ない場合)プロジェクトを作成する
  3. GCP画面上部でプロジェクトを選択 > [APIとサービス] > [ライブラリ]
    • f:id:ponsuke_tarou:20210317215137p:plain
  4. Google Analytics API」を検索して、「Google Analytics Reporting API」を選択する
    • f:id:ponsuke_tarou:20210317220350p:plain
  5. [有効にする]ボタンで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 インスタンスとのやり取りなど、アプリケーション自体がリソースにアクセスする場合や、アクションを独自に実行する必要がある場合を対象としています。

認証の概要 | Google Cloud

  1. GCP画面上部でプロジェクトを選択 > サイドメニュー[APIとサービス] > [認証情報]
    • f:id:ponsuke_tarou:20210316112228p:plain
  2. [認証情報を作成]ボタン > [サービス アカウント]
    • f:id:ponsuke_tarou:20210316112518p:plain
  3. 「サービス アカウント名」「サービス アカウント ID」に任意の値を入力して[完了]ボタンでアカウントを作成する
    • f:id:ponsuke_tarou:20210316144819p:plain
  4. 一覧にある作成したアカウントの[操作] > [詳細を管理]で詳細画面を表示
    • f:id:ponsuke_tarou:20210316144906p:plain
  5. [キー]タブ > [鍵を追加] > [新しい鍵を作成]
    • f:id:ponsuke_tarou:20210316144932p:plain
  6. [キーのタイプ]で「JSON」を選択 > [作成]ボタンで作成して鍵ファイルをダウンロードする
    • ここでダウンロードする鍵ファイルは「再作成できない」「鍵があればサービスを使えてしまう」ので超大切に保管する
    • f:id:ponsuke_tarou:20210316145010p:plain

Google Analyticsで作成したサービスアカウントに権限を設定する

作成したアカウントがGoogle Analyticsにあるはてなブログの情報を取得できるように権限を設定します。

  1. Google Analyticsにログインする
  2. 管理 > 対象のアカウント選択 > [アカウントユーザーの管理]
    • f:id:ponsuke_tarou:20210316145208p:plain
  3. 右上の[+]ボタン > [ユーザーを追加]
  4. 以下を設定して[追加]ボタンで追加する
    • メールアドレス : 作成したサービスアカウントのサービスアカウントID(@以降も入力する)
    • 権限 : 表示と分析

Google Analytics Reporting APIを呼び出す

早速、Google Analytics Reporting APIを呼び出してみます。

PythonとCloud9でちょっとだけ使ってみる

ponsuke-tarou.hatenablog.com

メトリクスとディメンションって何?

レポートの作成  |  アナリティクス Reporting API v4  |  Google Developersで基本の使い方を見ていくとまずはmetricsdimensionsなるものに引っかかりました。

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へのリクエスト数の制限がありますので気をつけましょう。

ponsuke-tarou.hatenablog.com

Node.jsでちょっとだけ使ってみる

ponsuke-tarou.hatenablog.com

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の環境でやってみたいと思います。

  1. Spring Bootのプロジェクトを用意する
  2. クライアント ライブラリをインストールする