PythonでGoogle AnalyticsのAPIを叩く

ちょっとGoogle AnalyticsのWebだとやりにくいアクセス集計がやりたくて、Analytics APIを叩いてみました。以前Google CalendarのAPIを使った事があるので大丈夫かと思ったら、結構手間取ったので記録しておきます。

まずコードを書く前に準備が必要です

  • Google APIコンソールでAnalytics APIを有効にする
  • Google APIコンソールからclient_secrets.jsonをダウンロードしておく

それで何に手間取ったかというと、Analytics APIにはCollectionとConfigurationとReportingの3つの機能があるのですが、訪問数とかページビューとか取得するのがCollectionだと思い込んでいて、中々機能が見つかりませんでした。欲しい機能はReportingでした。なおドキュメントはコチラ

それでコードは大した事無くて、下記のような感じになります。本ブログへのページビューが多い参照先一覧を上から10件表示しています。なおクエリを投げている部分でga:pageviewsとかga:sourceとかを指定していますが、使えるパラメータはこのページにあります。やたらありますね。Webではやりにくい集計も結構簡単に使えるので、一回触っておくと面白いかなぁと思っています。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import time
import httplib2
from apiclient.discovery import build
from oauth2client.client import OAuth2WebServerFlow, flow_from_clientsecrets, SignedJwtAssertionCredentials
from oauth2client.file import Storage
from oauth2client.tools import run
 
def main():
    PROFILE_ID = '5840204'
    TOKEN_FILE_NAME = 'analytics.dat'

	# 認証してサービスオブジェクトを取得
    FLOW = flow_from_clientsecrets(
        'client_secrets.json',
        scope='https://www.googleapis.com/auth/analytics.readonly')
    storage = Storage(TOKEN_FILE_NAME)
    credentials = storage.get()
    if credentials is None or credentials.invalid:
        credentials = run(FLOW, storage)
    http = httplib2.Http()
    http = credentials.authorize(http)
    service = build('analytics', 'v3', http=http)

    # サービスに対してクエリを投げる
    results = service.data().ga().get(
        ids='ga:%s' % PROFILE_ID,
        start_date='2013-01-01',
        end_date='2013-01-15',
        metrics='ga:pageviews',
        dimensions='ga:source',
        sort='-ga:pageviews',
        start_index='1',
        max_results='10').execute()

	# 結果を表示
    if results.get('rows', []):
        for row in results.get('rows'):
            print '\t'.join(row).encode('utf-8')
    

if __name__ == '__main__':
    main()

ところで上記のコードはブラウザでOAuth認証を行います。実行したらデフォルトブラウザで認証ページが開かれてOAuth2の一連の認証処理が走ります。でもAnalytics APIはサーバで動かしたいわけですよね。集計結果に基づいて色々やりたいです。ベタなところで言うと人気記事ランキングなんかを作りたいんです。

それで色々調べていると、SignedJwtAssertionCredentialsっていうのが見つかりまして、これを使うとサーバ内でブラウザ使わずに認証できるんです。APIコンソールでClient IDを作る際にAccount TypeをService Accountにして作ると、秘密鍵ファイルが貰えます。その鍵を使って認証処理を行うという流れになります。コードとしてはcredentialsオブジェクトの作り方が違います。その部分の抜粋が以下です。

ACCOUNT_MAIL = 'YOUR ACCOUNT MAIL'
KEY_FILE = 'YOUR PRIVATE KEY FILE'
key = open(KEY_FILE, 'rb').read()
credentials = SignedJwtAssertionCredentials(
    ACCOUNT_MAIL, key,
    scope=['https://www.googleapis.com/auth/analytics.readonly'])

これでやりたい事が出来る!と思ったのですがこのコード動きません。何回やっても”User does not have sufficient permissions for this profile.”ってエラーが出ます。何でと思ってAPIコンソールの周辺を探しまわっても見つかりません。諦めかけた時に、この記事を見つけました。

Analytics APIは未対応。えー。対応サービス一覧とかドキュメントになくね?

ちなみに使えるサービスは以下のみのようです。

  • Google Cloud Storage
  • Google Prediction API
  • Google URL Shortener
  • Google OAuth 2.0 Authorization Server
  • Google APIs Console

まぁCloud Storageがかろうじて使えそうですが、その他はサッパリですね。おとなしくAnalyticsが対応されるのを待ちましょう。さっきの記事のコメント欄を見ると皆Analyticsを欲しがっているようです。

1 thought on “PythonでGoogle AnalyticsのAPIを叩く”

Leave a Reply

Your email address will not be published. Required fields are marked *