Dimensions & Metrics Explorerページの”Google Analytics Demos and Tools”移管

Google AnalyticsのCore Reporting APIでDimension名やMetric名を調べる際に調べるDimensions & Metrics Explorerページですが、今後Google Analytics Demos and Tools側に移管されるようです。


Notice: The Dimensions and metrics explorer is moving to Google Analytics Demos and Tools, and will be turned down in the coming weeks. Please try out the new site and report any issues you run into on the Issue Tracker.
他の開発側ページだとこの案内はなさそうに見えますがGoogle AnalyticsのAPI、コードまわりは一部developersから移管されていくのかもしれません。
Bookmarkしている場合はとりあえず変更しておくと良いかもです。

ウェブサイトの主要なURLのIndexチェックはCustom Search APIを利用する

SEOでGoogle検索のランキングチェックをしている企業や個人も多いと思います。Search Consoleでのレポートも多いため普段はそちらをチェックしているのですが、以前なんの拍子でか主要ページURLがIndexから外れていたという事がありました。Search Console側では数日後に検知されていましたが。

ただ、これを気に主要ページだけでもIndexチェックを自動的に回したいなと思い、毎月1回主要ページをのIndexチェックをCustom Search APIを利用することにしました。
Index調査は色々ツールもあるでしょうし、もっと簡単に分かる方法もあるとは思いますが今回はCustom Search APIを利用した場合です。
※1日100リクエストまで無料なので無料枠範囲内で毎日別のURLチェックをすることである程度低価格 OR 無料範囲内でチェック可能

ざっと適当なコードはこちら。


API_KEY = '' #consoleで発行したAPI KEY
CUSTOM_SEARCH_ENGINE = '' #Custom search engineで発行されたID

def get_url(search_keyword):
    urls = []
    query = 'https://www.googleapis.com/customsearch/v1?key=' + API_KEY + '&cx=' + CUSTOM_SEARCH_ENGINE + '&num=1&q=' + quote(search_keyword)
    res = urllib.request.urlopen(query)
    data = json.loads(res.read().decode('utf-8'))
    
    try:
        urls.append(data["items"][0]["link"])
        return urls
    except:
        # Indexされていないことを伝える通知とか

こんな感じでCustom Search APIを叩いていきます。
検索キーワードはGoogle先生おなじみの `site:` を利用していきます。

例) site:www.google.co.jp

で叩いているURLを見れば分かるように1位しか取得していません。1位のURLがIndexしたいURLと同一であればIndexされている。そうでなければされていないと判断でしていきます。

ただ必ず1位になるわけではない点は注意です。
適切にウェブサイトが整えられていて、サイト内リンク構造もキレイであれば基本的には1位になるわけですが、そうでない場合は1位に来ないのでそこは反省しましょう(?)

(参考)Custom Search JSON API

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で管理してしまっているため上のコードだけではちゃんと動かないのですが。
サクッと作って誰かに通知したいとかそんな用途だと、このくらいのレベル感がとても良い気がします。