アプリケーション開発ポータルサイト
ServerNote.NET
Amazon.co.jpでPC関連商品タイムセール開催中!
カテゴリー【CORESERVERGooglePython
レンタルサーバーCORESERVERのPythonでGoogle Analytics Data APIを使う
POSTED BY
2023-08-27

Google Analyticsが旧UAを廃止しGA4に完全移行になり、Google Analytics Reporting APIが使えなくなりました。
レンタルサーバーCORESERVERのPythonでGoogle Analytics Reporting APIを使う
上記Reporting APIの代わりにData APIを使わなければならず、今回はその対応版になります。

ホームページをレンタルサーバーで作成してページアクセス数などをGoogle AnalyticsGA4プロパティを使って確認している場合。

定期的に、そのホームページに「どの記事が人気か(アクセスがあるか)」などの情報を自動的に表示させたい場合がある。

CORESERVERなど、レンタルサーバーがSSH利用OKでかつPythonを実行できる環境であるなら、自分のローカルディレクトリにGoogle AnalyticsのPythonモジュールをインストールすれば、上記情報をAPIで取得しホームページを更新するなどに使える。

1、Google Analytics Data APIの使用準備

Google Analyticsを使用しているGmailアカウントに切り替えて、Google Cloud Platformへアクセスする。

https://console.cloud.google.com/

利用開始を承認して、「新しいプロジェクトを作成」

特にいじらずデフォルトの名前で「作成」し、しばらく待つとプロジェクトができてダッシュボードになるので、

APIとサービスAPIとサービスを有効化とし、検索ボックスにGoogle Analytics Data APIと入れて、出てきたこのAPIを「有効」とする。

すると認証情報が必要になる場合があります、と出るのでそのまま「認証情報を作成」とする。

「ウィザードで選択」にて、

・認証情報の種類
使用するAPI:Google Analytics Data APIを選択
アクセスするデータの種類:アプリケーションデータ
App Engine または Compute Engine でこの API を使用する予定はありますか?:いいえ使用していません

とし次へ、次に「サービスアカウントを作成する」

「サービスアカウント名」ここでは例えば

acc-analytics

と入力。

ロール:閲覧者 ※アクセス統計レポートをPythonで取得するだけなので閲覧のみ。
キーのタイプ:JSON

「次へ」で、アクセスキーファイルがJSONで作成され自動ダウンロードされるので、ファイル名を

analytics-key.json

などと変更し、

レンタルサーバーでPythonを実行する自分のディレクトリにアップロードしておく。

2、Google Analytics管理画面での設定

Cloud Platform側の準備ができたので、いつも見ているAnalyticsの管理画面を開く。

https://analytics.google.com/

左メニューの「管理」→アカウントのアクセス管理

右上の「+」を選択→ユーザーを追加

さきほどCloud Platformにて自動生成されたサービスアカウントの「メール」文字列をメールアドレスに貼り付ける。

acc-analytics@spatial-ship-XXXXXXX.iam.gserviceaccount.com

などという自動生成のメールアドレスのはずである。「ユーザーにメールを送信」とチェックされていてもそのまま大丈夫なはず。

権限閲覧者

「追加」とし、これでデータを取得できるようになった。

続けて、左メニューの「管理」→プロパティ設定→プロパティの詳細で「プロパティID」という数値があるので、これを控えておく。

このプロパティIDと、さきほど生成されたアクセスキーファイル(analytics-key.json)を、サンプルPythonプログラムで指定することになる。

3、レンタルサーバー側からアクセスする準備

レンタルサーバーにroot権限などは無いはずなので、pipおよびモジュールを自分のホームディレクトリの.localに入れることになる。

なお、pythonプログラム本体はシステムのもので良い。(/usr/bin/python3.6)。

pip3.6のセットアップ

curl -O https://bootstrap.pypa.io/get-pip.py
python3.6 get-pip.py --user

.local/以下にインストールされるので、.bashrc等を確認し、パスを通すようにする。

if [ -d $HOME/.local ]; then
 export PATH=$HOME/.local/bin:$PATH
fi

確認

which pip
~/.local/bin/pip

which pip3.6
~/.local/bin/pip3.6

クライアントモジュールのインストール

pip3.6 install --upgrade google-api-python-client --user
pip3.6 install --upgrade google-analytics-data --user
pip3.6 install --upgrade oauth2client --user

.local以下にインストールされるので、以下のように確認する。

python3.6
Python 3.6.8 (default, Jun  6 2019, 03:20:13)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from google.analytics.data_v1beta import BetaAnalyticsDataClient
>>> from google.analytics.data_v1beta.types import (DateRange,Dimension,Metric,RunReportRequest,)
>>> quit()

エラーが出なければ、無事APIモジュールが使えるようになっている。

4、Google Analytics Data APIを呼んでレポートJSONを表示する

いよいよ実行してみる。ベースとなる、公式のサンプルは以下のものである。

https://developers.google.com/analytics/devguides/reporting/data/v1/quickstart-client-libraries?hl=en#python

これを以下のように修正を加える。

・環境変数GOOGLE_APPLICATION_CREDENTIALSにさきほど取得したキーJSONファイルのパスを設定する。
 ここでは/virtual/hogeuser/analytics_ga4/analytics-key.json
 プログラムで指定しているが、シェルであらかじめexportしておいてもよい。
・GA4_PROPERTY_ID変数を定義しさきほど取得したプロパティIDを文字列で指定する。ここでは111222333
・sample_run_report関数は定義のみなのでこのままでは実行されない。ソース最後でsample_run_report()と実行する。

Pythonanalytics-data-api.pyGitHub Source
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import (
    DateRange,
    Dimension,
    Metric,
    RunReportRequest,
)
import os

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "/virtual/hogeuser/analytics_ga4/analytics-key.json"
GA4_PROPERTY_ID = "111222333"

def sample_run_report(property_id=GA4_PROPERTY_ID):
    """Runs a simple report on a Google Analytics 4 property."""
    # TODO(developer): Uncomment this variable and replace with your
    #  Google Analytics 4 property ID before running the sample.
    # property_id = "YOUR-GA4-PROPERTY-ID"

    # Using a default constructor instructs the client to use the credentials
    # specified in GOOGLE_APPLICATION_CREDENTIALS environment variable.
    client = BetaAnalyticsDataClient()

    request = RunReportRequest(
        property=f"properties/{property_id}",
        dimensions=[Dimension(name="city")],
        metrics=[Metric(name="activeUsers")],
        date_ranges=[DateRange(start_date="2020-03-31", end_date="today")],
    )
    response = client.run_report(request)

    print("Report result:")
    for row in response.rows:
        print(row.dimension_values[0].value, row.metric_values[0].value)

sample_run_report()

実行

python3.6 analytics-data-api.py

結果

Report result:
(not set) 10819
Osaka 5884
Minato City 5131
Yokohama 3452
Chiyoda City 3447
Shinjuku City 2299
....
Ota 59
Toda 59
Aizuwakamatsu 58
Hakusan 58
Tokoname 58
....
Izumo 37

無事に取得できたようだ。公式サンプルでは2020年から本日までの市ごとのアクティブユーザー数をカウントする、というものらしい。

しかし今回の目的は日付範囲を指定してページビュー数上位順にページタイトルとページURLとページビュー数を取得したいというものです。よってソースを更に修正する必要があります。

https://developers.google.com/analytics/devguides/reporting/data/v1/api-schema?hl=ja

がリファレンスで、指定できるDimension, Metric一覧がある。これによれば、目的を果たすにはDimensionにpageTitleとfullPageUrl、MetricにscreenPageViewsを指定すれば良さそうだ!

早速dimensionsに配列値を追加指定し、metricsを変更しDateRangeにyesterday〜todayを指定し昨日から今日までのランキングを取得するソースに変更。
また、返ってきたprotobuf型のデータは扱いづらいのでJSONに変換して出力するコードも追加。
さらに、生データとしてページタイトル・URL・PV数をTAB区切りでprint出力するコードに最後を変更。

完成したソースがこちら。

Pythonanalytics-data-api-2.pyGitHub Source
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import (
    DateRange,
    Dimension,
    Metric,
    RunReportRequest,
)
from google.protobuf import json_format
import os
import json

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "/virtual/hogeuser/analytics_ga4/analytics-key.json"
GA4_PROPERTY_ID = "111222333"

def sample_run_report(property_id=GA4_PROPERTY_ID):
    """Runs a simple report on a Google Analytics 4 property."""
    # TODO(developer): Uncomment this variable and replace with your
    #  Google Analytics 4 property ID before running the sample.
    # property_id = "YOUR-GA4-PROPERTY-ID"

    # Using a default constructor instructs the client to use the credentials
    # specified in GOOGLE_APPLICATION_CREDENTIALS environment variable.
    client = BetaAnalyticsDataClient()

    request = RunReportRequest(
        property=f"properties/{property_id}",
        dimensions=[Dimension(name="pageTitle"), Dimension(name="fullPageUrl")],
        metrics=[Metric(name="screenPageViews")],
        date_ranges=[DateRange(start_date="yesterday", end_date="today")],
    )
    response = client.run_report(request)

    #json_response = json_format.MessageToJson(response._pb)
    json_response = json_format.MessageToDict(response._pb)
    print(json.dumps(json_response, indent=2, ensure_ascii=False))

    print("Report result:")
    for row in response.rows:
        print(row.dimension_values[0].value + "\t" + row.dimension_values[1].value + "\t" + row.metric_values[0].value)

sample_run_report()

実行

python3.6 analytics-data-api-2.py

結果

{
  "dimensionHeaders": [
    {
      "name": "pageTitle"
    },
    {
      "name": "fullPageUrl"
    }
  ],
  "metricHeaders": [
    {
      "name": "screenPageViews",
      "type": "TYPE_INTEGER"
    }
  ],
  "rows": [
    {
      "dimensionValues": [
        {
          "value": "【2022年最新版】進研ゼミチャレンジタッチをAndroid端末化する"
        },
        {
          "value": "www.servernote.net/article.cgi?id=customize-benesse-challenge-touch-to-android"
        }
      ],
      "metricValues": [
        {
          "value": "60"
        }
      ]
    },
    {
      "dimensionValues": [
        {
          "value": "【2022年最新版】Androidホームで左にスワイプすると出てくるニュース共を一切表示させない方法"
        },
        {
          "value": "www.servernote.net/article.cgi?id=invisible-google-news-on-android"
        }
      ],
      "metricValues": [
        {
          "value": "24"
        }
      ]
    },
    {
      "dimensionValues": [
        {
          "value": "【2022年最新版】Windows版Google Driveが使用中と言われアンインストールできない場合"
        },
        {
          "value": "www.servernote.net/article.cgi?id=uninstall-google-drive-for-windows"
        }
      ],
      "metricValues": [
        {
          "value": "19"
        }
      ]
    },
....
   }
  ],
  "rowCount": 107,
  "metadata": {
    "currencyCode": "USD",
    "timeZone": "Asia/Tokyo"
  },
  "kind": "analyticsData#runReport"
}
Report result:
【2022年最新版】進研ゼミチャレンジタッチをAndroid端末化する  www.servernote.net/article.cgi?id=customize-benesse-challenge-touch-to-android  60
【2022年最新版】Androidホームで左にスワイプすると出てくるニュース共を一切表示させない方法  www.servernote.net/article.cgi?id=invisible-google-news-on-android  24
【2022年最新版】Windows版Google Driveが使用中と言われアンインストールできない場合  www.servernote.net/article.cgi?id=uninstall-google-drive-for-windows  19
【2022年最新版】Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合  www.servernote.net/article.cgi?id=google-family-link-location-error  18
【2022年最新版】【C/C++】小数点以下の切り捨て・切り上げ・四捨五入  www.servernote.net/article.cgi?id=c-cpp-decimal-point  13
【2022年最新版】【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法  www.servernote.net/article.cgi?id=repair-copy-paste-on-windows-remote-desktop  12

無事に昨日から今日までのページタイトル、URL、PV数が取得できました!出力数を制限するまたは出力順を指定するオプションも当然存在しそうだが、とりあえずデフォルトでPV数順で返ってきているので、良しとする。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

☆ServerNote.NETショッピング↓
ShoppingNote / Amazon.co.jp
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】