読者です 読者をやめる 読者になる 読者になる

Python で Googleアナリティクスの API からデータを取得する - Core Reporting API v4 対応 / How to get Google Analytics data from Core Reporting API v4

python Google Analytics API RestfulAPI gcp

Python で Googleアナリティクスの API からデータを取得する - Core Reporting API v4 対応 / How to get Google Analytics data from Core Reporting API v4

** Sorry, this note is Japanese only, but please take a look at some code snippets. Hope it helps you a bit!

Googleアナリティクスのデータといえば Web の世界では基本中の基本。
API からデータを取り出せるということもあり、なんとか pandas.DataFrame の形でデータを取り出せないかな?と思っていた。
だけどそれ以前に、そもそも Python で Google アナリティクスのデータを取り出す方法がよくわかんない。
あまつさえ、最近 Googleアナリティクスの API は v4 という新しいバージョンに更新(注:リンク先はGoogleアナリティクスの Developer Guide。英語です。)しようとしてるらしい・・・。

そこで、Googleアナリティクスの API の使い方を学ぶとともに、新しいバージョンの API - Core Reporting API v4 をさわってみた。

Googleアナリティクス Core Reporting API v4 を使うための手順

参考にしたのはココ。

Hello Analytics API: Python quickstart for service accounts  |  Analytics Core Reporting API  |  Google Developers

この記事は Core Reporting API v3 のためのものなんだけど、大まかな作業の流れ変わらない。
その手順は大まかに次のような感じです。

  1. Googleアナリティクス API 用のサービスアカウントを作る
  2. サービスアカウントをデータを取り出したい Googleアナリティクス のユーザーとして追加する
  3. 必要なパッケージをインストールする
  4. コードを書く・その1:元になるコード HelloAnalytics.py をダウンロードする
  5. コードを書く・その2:gav4-python の機能を使って v3 -> v4 対応へとコードを修正する

Googleアナリティクス API 用のサービスアカウントを作る

サービスアカウントってのは、Googleアナリティクス の API にアクセスする、仮想的なユーザーみたいなものらしい。
ちなみに、Googleアナリティクス だけじゃなくて Google の API は全部(ほぼ?)このサービスアカウントという仕組みに対応してるみたいです。

Using OAuth 2.0 for Server to Server Applications  |  Google Identity Platform  |  Google Developers(英語)

このリンクから Google API コンソールとかいうサービスを作ってサービスアカウントを作る。

Python で Googleアナリティクスの API からデータを取得する - Core Reporting API v4 対応 ~ サービスアカウントの作成 / How to get Google Analytics data from Core Reporting API v4 - Create Service Account

なにやらプロジェクトという概念があるらしいので、既存のプロジェクトを作ったことある人はその中から選択、初めての人はここで作成をします。画面に沿ってやればすんなり出来た。
サービスアカウント名とサービスアカウントID を設定し、「秘密鍵を発行」にチェックチェック。
キーのタイプは上の Developer Guide に従って p12 にしました。JSON が推奨とか書いてるけど大丈夫かな・・・
で、サービスアカウントの作成をすると、キーのファイルがダウンロードされるので、これをこれから書くコードと同じ場所にわかりやすい名前で保存しておく。ここでは client_secrets.p12 とする。

また、この API コンソールってやつで、いろんな API の ON/OFF を設定することができるらしいです。
今回は Google アナリティクス のAPI ということで、「 Analytics API 」 と、後新しいバージョン v4 の API 「 Analytics Reporting API V4 」を ON にしておきましょう。

サービスアカウントをデータを取り出したい Googleアナリティクス のユーザーとして追加する

上の方法で発行したサービスアカウントには、メールアドレスがあるのでこれを Googleアナリティクスの管理画面から、利用者として追加する。

Googleアナリティクスにログインして、上の「管理」ってとこをクリック、「ビュー」の中の「ユーザー管理」のところから、上記のサービスアカウントを追加。追加する際の権限は「表示と分析」にした。

必要なパッケージをインストールする

Googleアナリティクス の API を Python から使うには、Google API Client Library for Python を使うと便利。
pip でインストールできるらしいので、デベロッパーガイドに沿ってインストールする。

$ pip install --upgrade google-api-client-python  

また、上記のライブラリは、Googleアナリティクス の API だと古いバージョン v3 にしか対応していないので、追加で v4 へのバージョンアップを助けてくれる Python モジュールもインストールします。
ここで配布してるみたいですが、直接 pip でインストールしちゃいましょう。

$ pip install --upgrade git+https://github.com/googleanalytics/gav4-python  

コードを書く・その1:元になるコード HelloAnalytics.py をダウンロードする

デベロッパーガイドにもリンクがありますが、ここからサンプルコードをダウンロードします。そんなに大したことができるコードじゃないですが、シンプルなのでわたしのようなビギナーにはかえってわかりやすい。

次に、このコードの中の「 Replace with your service account email address. 」「 Replace with /path/to/generated/client_secrets.p12 」の部分を、自分の環境に合わせて変更します。

ここまで出来たら、とりあえず古い API でちゃんと動くか試してみましょう。

12345678
View (Profile): ビューの名前
Total Sessions: 123

みたいな感じで、ビューの ID、名前、そして、セッション数が表示されれば成功です。ちなみに、コードによるとここで表示してるセッション数は直近7日分らしいです。

コードを書く・その2:gav4-python の機能を使って v3 -> v4 対応へとコードを修正する

いよいよコードを最新の Googleアナリティクスの API である Core Reporting API v4 に対応させるために修正します。
まず、冒頭で gav4-python のモジュールをインポート。

import gav4  

次に、service というオブジェクトを取得してる部分を修正します。具体的には、

service = get_service('analytics', 'v3', scope, key_file_location, service_account_email)  

となってるのを

service = get_service('analyticsreporting', 'v4', scope, key_file_location, service_account_email)

と修正します。
また、その次の profile を取得する部分ですが、これは、Management API というやつを通じて、さっきサービスアカウントを登録した Googleアナリティクス のビューのIDを勝手に取ってくるのですが、この Management API ってのが v4 には対応していないので、あらかじめ調べておいた値を直接設定します。

profile = 'YOUR_VIEW_ID'  

最後は、gav4.convert_request というメソッドを使って、v3 用のリクエストの内容を、v4 用に変換し、gav4.service.reports().batchGet().execute() メソッドを実行してデータを取得します。実際のコードはこんな感じです。

v3_request = {  
    "ids": 'ga:' + profile_id,  
    "start_date": '7daysAgo',  
    "end_date": 'today',  
    "metrics": 'ga:sessions'}  
v4_request = gav4.convert_request(**v3_request)  
v4_response = service.reports().batchGet(body=v4_request).execute()  

・・・が!ここで一つ落とし穴が・・・!

エラー TypeError: convert_request() takes 0 positional arguments but 1 was given に怒られる

gav4 の readmeでは、convert_request のところは

v4_request = gav4.convert_request(v3_request)  

となってますが、このまま実行すると TypeError が発生し、

TypeError: convert_request() takes 0 positional arguments but 1 was given  

と怒られてしまいます。メッセージの通りで、gav4.convert_request() メソッドは位置の引数はとらないので、このように書くとエラーとなります。
なので、上の例のように **v3_request を引数に設定してみてください。

コードの修正はこれで OK、ちゃんと動くかな・・・?

・・・

・・・

やりました! API からのレスポンスが dict 型のデータとして帰ってきました。
なんか、慣れると古いバージョンよりも新しい Core Reporting API v4 の方が、書き方は今風なのかもしれません。

コード全体はこんな感じです。

gist.github.com

Googleアナリティクス 関係のその他の記事

http://datalove.hatenadiary.jp/entry/google-analytics/N_sample_reports_you_must_check_out_on_Google_Analytics_demo_accountdatalove.hatenadiary.jp datalove.hatenadiary.jp datalove.hatenadiary.jp datalove.hatenadiary.jp