Core Reporting API


Google AnalyticsにはCore Reportion APIがあり、API経由でアクセス情報を取得することができます。これを使って、自分のサイトのアクセスランキングなどを作って、リアルタイムにサイトに表示することを考えます。


Api Clientによるアクセス


Core Reporting APIは、Googleの提供するapi clientを使用してアクセスすることができます。api clientは、oauth2による認証が必要です。実装例が、Google APIs Client Library for Python : Using Google App Engineに記載されているので、参考にします。

読んで頂ければ、用途によっていろいろな認証が定義されていることが分かります。最初に解説されているOAuth2DecoratorFromClientSecretsは、アクセスしているユーザで認証するため、今回のようにアクセスランキングを作るような用途には向きません。やりたいことは、server-to-serverのアクセスであり、AppAssertionCredentialsになります。

AppAssertionCredentialsは、Googleのサービスアカウントでログインする形になります。Analyticsのアカウント設定で、このサービスアカウントに表示権限を与えれば、目的は達成できます。

しかし、AppAssertionCredentialsは、開発用サーバでは動きません。開発用サーバでも動くようにするには、SignedJwtAssertionCredentialsを使う必要があります。


サービスアカウントの作成とAnalyticsへの追加


SignedJwtAssertionCredentialsは、Google Api Consoleで作成したサービスアカウントでAnalyticsにアクセスする形になります。認証は秘密鍵を使用します。

まず、Google Api ConsoleのAPIと認証のタブで、サービス アカウントを作成します。サービスアカウントを作成すると、秘密鍵を.p12形式でダウンロードすることができます。


service


AppEngineで使えるようにするために、.p12形式のファイルを、pem形式に変換します。

openssl pkcs12 -passin pass:notasecret -in privatekey.p12 -nocerts -passout pass:notasecret -out key.pem
openssl pkcs8 -nocrypt -in key.pem -passin pass:notasecret -topk8 -out privatekey.pem
rm key.pem


次に、Analyticsの設定で、サービスアカウントのメールアドレス(hoge@developer.gserviceaccount.com)に表示権限を与えます。


analytics


Pycryptoのインストール


SignedJwtAssertionCredentialsを使うにはpycryptoが必要ですので、app.yamlに定義します。

libraries:
- name: pycrypto
version: latest


本番環境はこれでOKですが、開発サーバは自前でpycryptoをinstallする必要があります。

sudo port install py27-crypto


コード例


SignedJwtAssertionCredentialsが使えるようになりました。

import httplib2

from google.appengine.api import memcache

from apiclient.errors import HttpError
from apiclient import discovery
from apiclient.discovery import build

from oauth2client.client import AccessTokenRefreshError
from oauth2client import appengine
from oauth2client import client
from oauth2client.client import SignedJwtAssertionCredentials

class AnalyticsGet():
def get(self,bbs_name):
KEY = "privatekey.pem"
SCOPES = [
'https://www.googleapis.com/auth/analytics',
'https://www.googleapis.com/auth/analytics.edit',
'https://www.googleapis.com/auth/analytics.manage.users',
'https://www.googleapis.com/auth/analytics.readonly',
]
SERVICE_ACCOUNT = "hoge@developer.gserviceaccount.com"
key = open(KEY).read()
credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT,
key,
scope=SCOPES)
http = httplib2.Http()
httplib2.debuglevel = True
http = credentials.authorize(http)
service = build('analytics', 'v3', http=httplib2.Http(memcache))


後は、Hello Analyticsのサンプルプログラムの、get_first_profile_id以降を呼ぶような感じで、Analyticsのデータを取得することができます。

API制約

Google Analytics APIは、1日あたり、Analyticsのアカウント単位で50000アクセス、Profile IDにつき、10000アクセスまでに制約されます。Quota limit for google analytics APIによると、アカウント単位の制約は問い合わせで増加させることができるようですが、Profile IDの制約を増加させることはできないので、注意が必要です。ページランキングなどの場合は、動的に生成せず、一定間隔でcronなどでランキングを作成、表示するなどして、APIのアクセス数を減らす必要があります。