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の管理画面を開く。
左メニューの「管理」→アカウントのアクセス管理
右上の「+」を選択→ユーザーを追加
さきほど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を表示する
いよいよ実行してみる。ベースとなる、公式のサンプルは以下のものである。
これを以下のように修正を加える。
・環境変数GOOGLE_APPLICATION_CREDENTIALSにさきほど取得したキーJSONファイルのパスを設定する。
ここでは/virtual/hogeuser/analytics_ga4/analytics-key.json
プログラムで指定しているが、シェルであらかじめexportしておいてもよい。
・GA4_PROPERTY_ID変数を定義しさきほど取得したプロパティIDを文字列で指定する。ここでは111222333
・sample_run_report関数は定義のみなのでこのままでは実行されない。ソース最後でsample_run_report()と実行する。
Python | analytics-data-api.py | GitHub 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出力するコードに最後を変更。
完成したソースがこちら。
Python | analytics-data-api-2.py | GitHub 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.php?id=customize-benesse-challenge-touch-to-android" } ], "metricValues": [ { "value": "60" } ] }, { "dimensionValues": [ { "value": "【2022年最新版】Androidホームで左にスワイプすると出てくるニュース共を一切表示させない方法" }, { "value": "www.servernote.net/article.php?id=invisible-google-news-on-android" } ], "metricValues": [ { "value": "24" } ] }, { "dimensionValues": [ { "value": "【2022年最新版】Windows版Google Driveが使用中と言われアンインストールできない場合" }, { "value": "www.servernote.net/article.php?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.php?id=customize-benesse-challenge-touch-to-android 60 【2022年最新版】Androidホームで左にスワイプすると出てくるニュース共を一切表示させない方法 www.servernote.net/article.php?id=invisible-google-news-on-android 24 【2022年最新版】Windows版Google Driveが使用中と言われアンインストールできない場合 www.servernote.net/article.php?id=uninstall-google-drive-for-windows 19 【2022年最新版】Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合 www.servernote.net/article.php?id=google-family-link-location-error 18 【2022年最新版】【C/C++】小数点以下の切り捨て・切り上げ・四捨五入 www.servernote.net/article.php?id=c-cpp-decimal-point 13 【2022年最新版】【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法 www.servernote.net/article.php?id=repair-copy-paste-on-windows-remote-desktop 12
無事に昨日から今日までのページタイトル、URL、PV数が取得できました!出力数を制限するまたは出力順を指定するオプションも当然存在しそうだが、とりあえずデフォルトでPV数順で返ってきているので、良しとする。
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
Intel Macbook2020にBootCampで入れたWindows11 Pro 23H2のBluetoothを復活させる
Windowsのデスクトップ画面をそのまま配信するための下準備
WindowsでGPUの状態を確認するには(ASUS系監視ソフトの自動起動を停止する)
CORESERVER v1プランからさくらインターネットスタンダートプランへ引っ越しメモ
さくらインターネットでPython MecabをCGIから使う
さくらインターネットのPHPでAnalytics-G4 APIを使う
インクルードパスの調べ方
【Git】特定ファイルを除外する.gitignore
【Ubuntu/Debian】NVIDIA関係のドライバを自動アップデートさせない
【Apache】サーバーに同時接続可能なクライアント数を調整する
Windows版Google Driveが使用中と言われアンインストールできない場合
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
【Linux】iconv/libiconvをソースコードからインストール
Googleスプレッドシートを編集したら自動で更新日時を入れる
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
【ひかり電話+VoIPアダプタ】LANしか通ってない環境でアナログ電話とFAXを使う
Windows11でMacのキーボードを使うには