Google AnalyticsのRealtime APIの結果を雑にSlackに流す

Google AnalylticsのRealtime APIはGoogle Analytics画面のレポート>リアルタイムの数字をAPIで取得するものですが、公式ドキュメントにあるとおりベータで利用するには事前申請が必要...と思っていた訳ですが、普通にたたけばデータ取得できたのでこの数字を雑にSlackへ流すことにしました。

直近のイベントをSlackや別の何かですぐに気づきたい場合に利用できます。
V3のエンドポイントに対してRealtime API専用のdimensionsやmetricsを設定していく感じになります。無駄にDataFrameとか使っていますが出力を多少キレイにするためにtabulateパッケージを使ってSlackへ投稿していますので、以下のソースはサンプルというレベルです。

import httplib2
import json
import requests
import pandas as pd
from oauth2client.service_account import ServiceAccountCredentials


def ga_realtime():
    SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
    KEY_FILE_LOCATION = '' #file path

    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        KEY_FILE_LOCATION, scopes=SCOPES)

    session = requests.Session()
    session.headers = {'Authorization': 'Bearer ' +
                       credentials.get_access_token().access_token}

    args = {
        'ids': 'ga:00000000000',  # viewID
        'metrics': 'rt:totalEvents',
        'dimensions': 'rt:eventCategory,rt:eventAction,rt:eventLabel',
        'filters': 'rt:eventAction==click'
    }

    response = session.get('https://www.googleapis.com/analytics/v3/data/realtime?ids={}&metrics={}&dimensions={}&filters={}'.format(
        args['ids'], args['metrics'], args['dimensions'], args['filters']))
    result = response.json()

    list = []

    try:
        rows = result['rows']
        for row in rows:
            list.append(row)
        df = pd.DataFrame(list, index=None, columns=[
                          'category', 'action', 'label', 'count'])

        WEB_HOOK_URL = 'https://hooks.slack.com/services/....'  # webhookurl
        requests.post(WEB_HOOK_URL, data=json.dumps({
            'text': df,
            'username': u'bot',
            'icon_emoji': u':robot_face:'
        }))
    except:
        pass

サンプルだとイベントデータを取得していて且つフィルタでアクションが `click` のものだけを取得しています。

今個人的にはGCP内、具体的にはGoogle Functionsで動かしており。KEYはGCSで管理してしまっているため上のコードだけではちゃんと動かないのですが。
サクッと作って誰かに通知したいとかそんな用途だと、このくらいのレベル感がとても良い気がします。
Share:

0 コメント:

コメントを投稿