投稿日:2020年10月21日
GoogleAnalyticsには自信のサイトの情報を取得するAPIが用意されています。このAPIを利用することでブログの人気記事ランキングを非常に柔軟なものにすることができます。この記事ではGoogleAnalyticsReporting APIの設定方法、Python3からの呼び出し方を実際の利用例を合わせて解説しています。
GoogleAnalyticsには自信のサイトの情報を取得するAPIが用意されています。このAPIを利用することでブログの人気記事ランキングを非常に柔軟なものにすることができます。この記事ではGoogleAnalyticsReporting APIの設定方法、Python3からの呼び出し方を実際の利用例を合わせて解説しています。
この記事では以下のことを前提に話をしていきます。
まずはGoogleAnalyticsのアカウントからAPIを使用するための設定をする必要があります。
まずはGoogleAPIConsoleに入り左上のプロジェクトコンソールから『新しいプロジェクト』をクリックし、対象のブログ用のプロジェクトを作成します。
APIとサービスを有効化をクリックしAPIライブラリのページに移動します。
そこで『Google Analytics Reporting API』を検索し有効化します。
作成したプロジェクトで、
認証情報 > 認証情報を作成 > サービスアカウント
を選択して認証情報作成画面を開きます。
作成画面では以下の情報を入力します。
あとはデフォルトのままで作成します。
認証情報のページにリダイレクトされます。
この画面で表示されるサービスアカウントのメールアドレスはこの後使うのでコピーしておくと良いでしょう。
サービスアカウントから先程作成したサービスアカウントの編集ボタン(鉛筆アイコン)をクリックします。
鍵を作成 > 新しい鍵を作成
を選択しJSONにチェックを入れて作成をクリックしましょう。
新しい秘密鍵のJSONファイルがローカルのPCにダウンロードされます。このJSONのファイル名はわかりづらいためりりネームしておくと良いでしょう。今回はga_service_account.jsonという名前にかえておきます。
GoogleAnalyticsの対象のサイトのプロジェクトを開きます。
プロジェクトの左のメニューから管理を選択します。
管理ページが開くのでアカウント、またはプロパティ、ビューのいずれかのアカウントユーザーの管理からアカウント管理画面を開きます。
ここに現在のアカウント一覧が出るので新規追加ボタン(+マーク)をクリックし、ユーザーの追加を選択します。
情報として以下の値を入力します。
最後に追加ボタンを押しましょう。
これでアカウントの設定は完了です。
AnalyticsAPIでは対象のビューのIDを指定する必要があります。
この値はGoogleAnalyticsの管理ページのビューで指定したいビューを選択した後、ビューの設定から確認できます。
まずは必要なライブラリをインストールします。
$ pip install --upgrade google-api-python-client oauth2client
最終的にはランキングを取得し、それをDBに入れる処理を書いたのですがそれら全てのコードを説明すると流石に長くなってしまうため、
サンプルとして過去30日間の人気記事ランキングのUUID(自分の場合はURLパスの3番目の値とイコール)、タイトル、ビューカウントを表示する関数を作成してみます。
from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
SCOPES = ['https://www.googleapis.com/auth/analytics.readonly'] # アカウントのアクセスの権利の範囲
KEY_FILE_LOCATION = './ga_service_account.json' # サービスアカウントの相対パス
VIEW_ID = '188763279' # GoogleAnalyticsの対象ViewID
def get_monthly_ranking():
"""
月間の人気記事ランキングを取得
"""
credentials = ServiceAccountCredentials.from_json_keyfile_name(
KEY_FILE_LOCATION, SCOPES)
analytics = build('analyticsreporting', 'v4', credentials=credentials)
response = analytics.reports().batchGet(
body={
'reportRequests': [
{
'viewId': VIEW_ID,
'dateRanges': [{'startDate': '31daysAgo', 'endDate': 'today'}],
'metrics': [{'expression': 'ga:pageviews'}],
'dimensions': [
{'name': 'ga:pagePathLevel3'},
{'name': 'ga:pageTitle'},
],
"orderBys":
[
{"fieldName": "ga:pageviews", "sortOrder": "DESCENDING"},
]
}]
}
).execute()
data = response.get("reports")[0]["data"]
# 実際の処理はここでDBにデータをインサート
for i, page_data in enumerate(data["rows"]):
dimensions = page_data["dimensions"]
metrics = page_data["metrics"]
uuid = dimensions[0].replace("/","")
title = dimensions[1]
views = metrics[0]["values"][0]
print("{}位:[{}]【{}】 {}".format(i + 1, views, uuid, title))
実際に実行すると以下のようにランキングを表示できます。
>>> get_monthly_ranking()
1位:[357]【29305a78-1753-4f3d-9b53-6267e0f77018】 Ubuntuでexeファイルを実行する方法解説|MarsquaiBlog
2位:[286]【069dcbe1-02d1-4edd-a0e4-98ea46443600】 IIYAMAノートPC(STYLE-15FH052-i7-FE)のメモリ増設方法解説|MarsquaiBlog
3位:[215]【d57608c7-9718-4a57-9c03-5f7caf477ab4】 【2019年11月版】WindowsでDjangoの開発環境を構築しよう!|MarsquaiBlog
4位:[190]【dfc90725-b59c-47c4-84c3-4ba08194e7fa】 Unity 2019.1のUnityWebRequestの使い方解説|MarsquaiBlog
5位:[138]【b2deae90-5afc-4bcf-9159-722dfd1aadec】 Django2:ログのローテーションの方法について解説|MarsquaiBlog
6位:[138]【e7ae3563-d771-4420-8c34-ded8ec6273ef】 PythonでGoogleの2段階認証を実装する方法解説|MarsquaiBlog
7位:[97]【bc1bf9fe-9870-4491-b720-cf5d88ef82fa】 Python用SeleniumをDockerコンテナで作成する方法の解説|MarsquaiBlog
8位:[65]【de4d464b-1e55-47f4-b993-85dad837dcab】 Django2:独自のパスワード認証を作る際に便利なメソッド紹介|MarsquaiBlog
9位:[53]【71e724cd-212c-4301-b6d9-378312479f34】 docker-composeでbuildができなくなる問題の解決策メモ|MarsquaiBlog
10位:[47]【dc98d0af-f9e3-414d-ab2c-486a4057b87e】 Python3.6でカラー画像をモノクロ・グレー画像にする方法解説|MarsquaiBlog
11位:[43]【94569559-0b33-4d2d-8ccf-75b0a6458074】 【初心者チュートリアル】Django2でブログ作成(Part1)〜プロジェクトを作成〜|MarsquaiBlog
このAPIで取得できるデータにはブログ記事以外のページ(検索結果のページなど)も含まれているため、これを除外するために実際の処理はもう少し複雑になりますね。
それはそれとして、このブログの月間人気ランキングにはじっさいにこの機能が組み込まれています。
参考程度にこのブログで月間人気ランキングを更新するコードを載せておきます。
環境は以下のとおりです
from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
from django.conf import settings
from blog.models import BlogPage
# 設定ファイルの読み込み
SCOPES = settings.GA_SCOPES
KEY_FILE_LOCATION = settings.GA_KEY_FILE_LOCATION
VIEW_ID = settings.GA_VIEW_ID
THROTTLE = settings.THROTTLE_MONTHLY_VIEW_UPADTE
def update_view_count(is_all = True):
""" 全てのページの中からランダムに5つページを選び
閲覧数を更新する関数
is_all = Falseの場合はDjangoのsettingファイルで設定した
THROTTLE_MONTHLY_VIEW_UPADTEの数のページが更新される
記事は更新日時の古い順に選ばれる
記事データが大量になった際には
大量のレコードデータを一気に更新しないようにis_all=Falseにする
THROTTLE_MONTHLY_VIEW_UPDATEは数が多すぎると
マックスサイズエラーになるので注意
"""
# 認証情報を初期化
credentials = ServiceAccountCredentials.from_json_keyfile_name(
KEY_FILE_LOCATION, SCOPES)
analytics = build('analyticsreporting', 'v4', credentials=credentials)
if is_all:
# 全てのデータを取得
pages = BlogPage.objects.all()
else:
# 対象のページを最終編集日の古い順にTHROTTLE文だけ取得
pages = BlogPage.objects.order_by("edited")[:THROTTLE]
# フィルターを作成
filters_expressions = ""
if is_all == False:
for page in pages:
if filters_expressions:
filters_expressions += ","
filters_expressions += "ga:pagePath=={}".format(page.get_relative_url())
# リクエストを送信
response = analytics.reports().batchGet(
body={
'reportRequests': [
{
'viewId': VIEW_ID,
'dateRanges': [{'startDate': '31daysAgo', 'endDate': 'today'}],
'metrics': [{'expression': 'ga:pageviews'}],
'dimensions': [
{'name': 'ga:pagePath'},
],
"filtersExpression": filters_expressions,
}]
}
).execute()
# データを取得
data = response.get("reports")[0]["data"]
# ページのパスから閲覧数にマッピングする辞書を作成
data_dict = { row["dimensions"][0] : int(row["metrics"][0]["values"][0]) for row in data["rows"] }
# ページデータを更新
for i,page in enumerate(pages):
page_path = page.get_relative_url()
if page_path in data_dict.keys():
pages[i].view_count_monthly = data_dict[page.get_relative_url()]
# バルクアップデート
BlogPage.objects.bulk_update(pages, fields=['view_count_monthly',])
自分の場合はこのコードを定期実行で1日おきに実行しています。
Google Analytics Reporting APIは非常に正確なレポートを出してくれるため、このような人気ランキングをつくるにはとても便利そうですね!
他にもいろいろなAPIがあるので使ってみても良いかも??