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

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

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

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

1、Google Analytics Reporting APIの使用準備

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

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

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

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

APIとサービスAPIとサービスを有効化とし、Google Analytics APIを選択し「有効」とする。

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

「必要な認証情報の種類を調べる」にて、

Google Analytics APIを選択
・必要な認証情報
APIを呼び出す場所:ウエブサーバー
アクセスするデータの種類:アプリケーションデータ
App Engine または Compute Engine でこの API を使用する予定はありますか?:いいえ使用していません

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

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

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/local/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 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 googleapiclient.discovery import build
>>> quit()

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

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

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

https://developers.google.com/analytics/devguides/reporting/core/v4/quickstart/service-py?hl=ja

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

VIEW_IDを自分のビューID(数値)に変更する
KEY_FILE_LOCATIONをキーJSONファイルのパスに変更する(analytics-key.json)
・print文のバーションがレンタルサーバーCORESERVERのpython3.6と合っていないので修正
・出力項目が少ないのでページタイトル・URLなどフル出力するようにする
・配列要素が無いなどのエラーが出るので帰ってきたresponseをそのままprintするだけにする(あとは利用者次第)

結果、以下のようなソースとなる。VIEW_ID,KEY_FILE_LOCATIONは自身のものに変えてください。

Pythonanalytics-report.pyGitHub Source
"""Hello Analytics Reporting API V4."""

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
KEY_FILE_LOCATION = 'analytics-key.json'
VIEW_ID = '123456789'

def initialize_analyticsreporting():
  """Initializes an Analytics Reporting API V4 service object.

  Returns:
    An authorized Analytics Reporting API V4 service object.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      KEY_FILE_LOCATION, SCOPES)

  # Build the service object.
  analytics = build('analyticsreporting', 'v4', credentials=credentials)

  return analytics

def get_report(analytics):
  """Queries the Analytics Reporting API V4.

  Args:
    analytics: An authorized Analytics Reporting API V4 service object.
  Returns:
    The Analytics Reporting API V4 response.
  """
  return analytics.reports().batchGet(
      body={
        'reportRequests': [
        {
          "viewId": VIEW_ID,
          "dateRanges": [{'startDate': '7daysAgo', 'endDate': 'today'}],
          "metrics": [{"expression": "ga:pageviews"}],
          "dimensions": [{"name": "ga:pagePath"}, {"name": "ga:pageTitle"}],
          "orderBys": [{"fieldName": "ga:pageviews", "sortOrder": "DESCENDING"}]
        }]
      }
  ).execute()

def main():
  analytics = initialize_analyticsreporting()
  response = get_report(analytics)
  print(response)

if __name__ == '__main__':
  main()

実行

python3.6 analytics-report.py

結果

{'reports': [{'columnHeader': {'dimensions': ['ga:pagePath', 'ga:pageTitle'], 'metricHeader': {'metricHeaderEntries': [{'name': 'ga:pageviews', 'type': 'INTEGER'}]}}, 'data': {'rows': [
{'dimensions': ['/article.cgi?id=customize-benesse-challenge-touch-to-android', '進研ゼミチャレンジタッチをAndroid端末化する'], 'metrics': [{'values': ['500']}]},
 {'dimensions': ['/article.cgi?id=javascript-find-filter-in-jsonarray', '【Javascript】JSON配列内にある特定要素の取得法【Node.js】'], 'metrics': [{'values': ['400']}]},
 {'dimensions': ['/article.cgi?id=hackintosh-macos-and-windows', '【Hackintosh】組立PCにWindowsとmacOSを同居させる場合の注意点'], 'metrics': [{'values': ['300']}]},
 {'dimensions': ['/article.cgi?id=customize-benesse-challenge-touch-to-android', '(not set)'], 'metrics': [{'values': ['200']}]},
 {'dimensions': ['/article.cgi?id=use-analog-fax-with-voip-and-hikaridenwa', '【ひかり電話+VoIPアダプタ】LANしか通ってない環境でアナログ電話とFAXを使う'], 'metrics': [{'values': ['100']}]},
 {'dimensions': ['/article.cgi?id=no-longer-provided-by-xcode', '【macOS Catalina】command line tools are no longer provided by Xcodeと言われた場合'], 'metrics': [{'values': ['50']}]},
 {'dimensions': ['/article.cgi?id=swiftui-voice-to-text', '【Swift UI】マイク使用許可を得て音声をテキストに変換する(音声認識)'],'metrics': [{'values': ['30']}]}
], 'totals': [{'values': ['1580']}], 'rowCount': 8, 'minimums': [{'values': ['30']}], 'maximums': [{'values': ['500']}]}}]}

ページタイトル、URL、アクセス数、アクセス数トータル、最低アクセス数、最高アクセス数などのサマリーデータなどもJSONで返る。
あとはこのデータをもとに自身のホームページHTMLをPythonで差し替えるなど、好きに調理しましょう。

5、各種エラー対策

SyntaxError: Missing parentheses in call to 'print'. Did you mean print(header + ': ' + dimension)?

などと出た場合、公式サンプルのprint文と異なるからかと。以下のように修正

print( header + ': ' + dimension)
        print ('Date range: ' + str(i))
          print( metricHeader.get('name') + ': ' + value)

ModuleNotFoundError: No module named 'oauth2client'

などと出た場合、インストール忘れかと

pip3.6 install --upgrade oauth2client --user

googleapiclient.errors.HttpError: <HttpError 403 when requesting https://analyticsreporting.googleapis.com/v4/reports:batchGet?alt=json returned "Analytics Reporting API has not been used in project NNNNNNNNNNNN before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/analyticsreporting.googleapis.com/overview?project=NNNNNNNNNNNN then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.". Details: "[{'@type': 'type.googleapis.com/google.rpc.Help', 'links': [{'description': 'Google developers console API activation', 'url': 'https://console.developers.google.com/apis/api/analyticsreporting.googleapis.com/overview?project=NNNNNNNNNNNN'}]}, {'@type': 'type.googleapis.com/google.rpc.ErrorInfo', 'reason': 'SERVICE_DISABLED', 'domain': 'googleapis.com', 'metadata': {'service': 'analyticsreporting.googleapis.com', 'consumer': 'projects/NNNNNNNNNNNN'}}]">

などと出た場合、Reporting APIの有効化忘れかと。上記、言われた通りのURLをクリックして、Google Analytics Reporting API有効化する。以下のようになってるか確認。

名前
Google Analytics Reporting API
提供者:
Google
サービス名
analyticsreporting.googleapis.com
概要
Accesses Analytics report data.
有効化のステータス
有効
※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

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