パラメータストアに保存した接続情報を使ってGA4のAPIをPythonで実行してみる

2023.06.27

はじめに

データアナリティクス事業本部のkobayashiです。

Google AnalyticsのUniversalAnalytics(UA)が7月1日にて終了します。UAから変わるのがGoogleAnalytics(GA4)ですが、この変更によりUAで使用していたGoogle Analytics Reporting APIもGoogle Analytics Data API v1に移行する必要があります。

今回は以前UAで試してみた以下と同じ内容をGA4で試してみたいと思います。

Google Analytics Data APIでデータを取得する手順

Google Analytics Data APIを使ってGoogle Analyticsのデータを取得するには、

  • Google Analytics Data APIの設定を行う
  • クライアントライブラリをインストールする
  • Pythonでコードを記述し実行する となります。

では初めに設定を行います。

Google Analytics Data APIを使う準備

Google Analytics Data APIを有効化する

Google Analytics Data APIを使ってGA4のデータを取得するためにはGoogleCloudのプロジェクトでサービスアカウントを作成することとGoogle Analytics Data APIをプロジェクトで有効にする必要があります。サービスアカウントについては以前作成したUA用のものを使った上でそのサービスアカウントに対してGoogle Analyticsでサービスアカウント用のユーザーに表示と分析の権限を与えている状態としますが、Google Analytics Data APIは今回新しく有効にする必要があります。

手順1)GoogleCloudにログインしAPIとサービスへ進み、ライブラリを押下する。

手順2)検索フォームにAnalyticsと打ち込みGoogle Analytics Data APIを検索し、ライブラリの画面で有効にするを押下してライブラリを有効化する。

これでGoogle Analytics Data APIが有効になったので次にPythonでGA4のデータを取得してみたいと思います。

Analytics Data API用のクライアントライブラリのインストール

今回使うライブラリもpipにて簡単にインストールできますので下記のコマンドを実行します。

pip install google-analytics-data

以上でPythonにてGA4のデータを取得できる準備が整ったので実際にデータを取得するコードを記述します。

Analytics APIを使ってデータを取得する

以前はアナリティクス Reporting API v4のドキュメントのサンプルコードを元に「メトリックをページビュー、ディメンションをページパスとして、ページビューのデータを降順で取得 」していましたが今回も同じデータを取得してみたいと思います。

Analytics Data APIライブラリのドキュメントは「Python Client for Analytics Data API — google-analytics-data documentation 」 にありますのでこちらを参考にしつつコードを記述します。

またUAからGA4へ行う際にメトリックとディメンションがGA4用で変わっているので以下の公式ドキュメントを参考に以前のコードを読み替えます。

ユニバーサル アナリティクスと Google アナリティクス 4 で同等のディメンションと指標について  |  デベロッパーによる API の移行  |  Google for Developers

またサービスアカウントの認証情報をローカルに保存してあるJsonファイルのパスから取得するのではなくAWS Systems Manager Parameter Storeに保存してそこから文字列として取得した上で、Analytics Data APIを使う際の認証情報として使用するようにします。

import json
from pprint import pprint

import boto3
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import (DateRange, Dimension, Filter,
                                                FilterExpression, Metric,
                                                OrderBy, RunReportRequest)
from google.protobuf.json_format import MessageToDict

PARAM_KEY = "/ServiceAccountCredential/ga4-test"
GA_PROPERTY_ID = '<REPLACE_WITH_PROPERTY_ID>'
LIMIT = 10000


def initialize_analytics_reporting():
    # パラメータストアからサービスアカウントの認証法を取得
    ssm = boto3.client("ssm")
    service_account_key = json.loads(
        ssm.get_parameter(Name=PARAM_KEY, WithDecryption=True)["Parameter"]["Value"]
    )

    return BetaAnalyticsDataClient.from_service_account_info(service_account_key)


def get_report(analytics, offset=0):
    # パラメータ
    params = {
        "property": f"properties/{GA_PROPERTY_ID}",
        "limit": LIMIT,
        "offset": offset * LIMIT,
        "date_ranges": [DateRange(start_date="7daysAgo", end_date="today")],
        "metrics": [
            Metric(name="screenPageViews"),
        ],
        "dimensions": [Dimension(name="pagePath"), Dimension(name="pageTitle")],
        "order_bys": [OrderBy(metric=OrderBy.MetricOrderBy(metric_name="screenPageViews"), desc=True)],

    }

    # GA4データの取得
    response = analytics.run_report(RunReportRequest(**params))

    # レスポンスをDictに変換
    json_response = MessageToDict(response._pb)

    return json_response


def get_response(response):
    metric_name = response['metricHeaders'][0]["name"]
    dimension_names = [_d["name"] for _d in response['dimensionHeaders']]

    rows = [{
        metric_name: _r['metricValues'][0]['value'],
        dimension_names[0]: _r['dimensionValues'][0]['value'],
        dimension_names[1]: _r['dimensionValues'][1]['value'],
    } for _r in response.get("rows", [])]

    return rows, response.get("rowCount")


def print_response(analytics):
    offset, row_count = 0, LIMIT
    rows = []
    while offset < row_count or row_count is None:
        response = get_report(analytics, offset)
        r, row_count = get_response(response)
        rows.extend(r)
        offset += LIMIT

    pprint(rows)


def main():
    analytics = initialize_analytics_reporting()
    print_response(analytics)


if __name__ == "__main__":
    main()

はじめにパラメータストアに保存してあるサービスアカウントを取得してAnalytics Data APIの認証情報として使うためにinitialize_analytics_reporting関数を作成してあります。

次にUAとの違いはBetaAnalyticsDataAsyncClient.run_reportを使っているget_report関数になります。run_reportの使い方は公式ドキュメント(BetaAnalyticsData — google-analytics-data documentation )に使い方が載っていますのでそちらを参考に行いました。

  • paramsを指定する場合にはDateRangeMetricsなど型をきちんと使用する
  • run_reportで取得できるレスポンスがRunReportResponse型で返ってくるのでMessageToDict(response._pb)にてDictに変換して後続で使用する

と行った点が大きく異なります。

他の箇所も以前のUAのコードと変わっている部分がありますが主にリファクタリング目的なのでUAとGA4用のコードでのデータ取得という点では違いはありません。

上記のコードを実行して見ると以前と同じ形でデータが取得できます。

{'pagePath': '/',
  'pageTitle': 'クラスメソッド発「やってみた」系技術メディア | DevelopersIO',
  'screenPageViews': 'xxxxx'},
 {'pagePath': '/articles/rds-bg-deploy/', 'pageTitle': '【衝撃】AWSのRDSがデータを失わないBlue/Greenデプロイに対応しました | DevelopersIO', 'screenPageViews': 'xxxxx'},
 {'pagePath': '/articles/iphone_simplified_chart/', 'pageTitle': '[iPhone] 歴代iPhone早見表をまとめてみました(2022年前期時点) | DevelopersIO', 'screenPageViews': 'xxxxx'},

上記のコードのメトリックスとディメンションを公式ドキュメント を参考に色々変えることで今までと同じ用に様々なデータを取得することができますので欲しいデータの内容に書き換えて利用すれば良いかと思います。

まとめ

GA4のデータを簡単にPythonで扱えるPython Client for Analytics Data APIライブラリを使って以前UAで取得したデータを同じ形式でデータを取得してみました。UAのライブラリよりもPython Client for Analytics Data APIのライブラリの方がリクエストやレスポンスがわかりやすくなって使い勝手は向上しています。

最後まで読んで頂いてありがとうございました。