Google Analytics からAPI で情報を取得することになりました。
しかし、Google Analytics もGoogle API も使ったことがないので全く分かりません。
ここでは、調べながらはてなブログ の情報をGoogle Analytics Reporting API で取得するまでをやってみます。
まずは、情報の基となるGoogle Analytics を設定します。
今回は、このponsuke_taro's blogをGoogle Analytics に設定して情報を蓄積できるようにします。
はてなブログ 用のデータ解析をユニバーサル アナリティクスプロパティで作成する
参考 : Google Analyticsを導入する - はてなブログ ヘルプ
ユニバーサル アナリティクスは前世代の Google アナリティクスです。ユニバーサル アナリティクス プロパティと Google アナリティクス 4 プロパティとでは、使用できるレポートに違いがあります。
ユニバーサル アナリティクス プロパティ - アナリティクス ヘルプ
(ない場合)Google アカウントの作成 でアカウントを作成する
お客様のビジネスに適した分析ツールとソリューション - Google アナリティクス を表示する
[無料で利用する]ボタンで次の画面へ遷移し、[測定を開始]ボタンで設定画面を表示する
「アカウント名」に何のアクセス解析 かわかる名前を設定して[次へ]ボタンで進む
「プロパティ名」などの入力項目を設定して登録する
[プロパティの設定]の下にある[詳細オプションを表示]リンクでユニバーサル アナリティクスプロパティの設定欄を表示して以下を設定して[次へ]ボタンで進む
ユニバーサル アナリティクス プロパティの作成 : ON
ウェブサイトの URL : 登録するはてなブログ のURL
ユニバーサル アナリティクスのプロパティのみを作成する : ON
[ビジネス情報]部分は任意で入力して[作成]ボタンで作成する
[プロパティ]で作成したプロパティを選択 > [トラッキング 情報] > [トラッキング コード] > [トラッキング ID]をメモしておく
はてなブログ にログインしてダッシュ ボード管理画面を表示する
[設定] > [詳細設定] > [解析ツール] > [Google Analytics 埋め込み]にメモしたGoogle Analytics のトラッキング IDを入力する
ページ下の[変更する]ボタンで変更を確定する
お茶しながら数時間待つとGoogle Analytics の画面にいろいろ表示され始める
作成したはてなブログ 用のデータ解析に溜まった情報をGoogle Cloud Platform(以降GCP )のAPI で取得できるように設定していきます。
まずは、Google Analytics Reporting API を使えるように設定します。
Google Cloud Platform にログインする
(ない場合)プロジェクトを作成する
GCP 画面上部でプロジェクトを選択 > [API とサービス] > [ライブラリ]
「Google Analytics API 」を検索して、「Google Analytics Reporting API 」を選択する
[有効にする]ボタンでAPI を有効化する
3つ候補に出てきたAPI の違いがいまいちわからないので頑張った概要の和訳を記録として書いておきます。
サービスアカウントを作成する
API を利用するサービスアカウントを作成します。
サービス アカウントは IAM によって管理されるもので、人間のユーザー以外のものを指しています。App Engine アプリの実行や Compute Engine インスタンス とのやり取りなど、アプリケーション自体がリソースにアクセスする場合や、アクションを独自に実行する必要がある場合を対象としています。
認証の概要 | Google Cloud
GCP 画面上部でプロジェクトを選択 > サイドメニュー[API とサービス] > [認証情報]
[認証情報を作成]ボタン > [サービス アカウント]
「サービス アカウント名」「サービス アカウント ID」に任意の値を入力して[完了]ボタンでアカウントを作成する
一覧にある作成したアカウントの[操作] > [詳細を管理]で詳細画面を表示
[キー]タブ > [鍵を追加] > [新しい鍵を作成]
[キーのタイプ]で「JSON 」を選択 > [作成]ボタンで作成して鍵ファイルをダウンロードする
ここでダウンロードする鍵ファイルは「再作成できない」「鍵があればサービスを使えてしまう」ので超大切に保管する
作成したアカウントがGoogle Analytics にあるはてなブログ の情報を取得できるように権限を設定します。
Google Analytics にログインする
管理 > 対象のアカウント選択 > [アカウントユーザーの管理]
右上の[+]ボタン > [ユーザーを追加]
以下を設定して[追加]ボタンで追加する
メールアドレス : 作成したサービスアカウントのサービスアカウントID(@
以降も入力する)
権限 : 表示と分析
早速、Google Analytics Reporting API を呼び出してみます。
Python とCloud9でちょっとだけ使ってみる
ponsuke-tarou.hatenablog.com
メトリクスとディメンションって何?
レポートの作成 | アナリティクス Reporting API v4 | Google Developers で基本の使い方を見ていくとまずはmetrics
とdimensions
なるものに引っかかりました。
Web分析をやっている人には疑問に思わないことなのでしょうが、Google Analytics はおろかWeb分析的なことをやったことがないので「メトリクス」「ディメンション」が何なのかわかりません。
アナリティクスのレポートは、すべてディメンションと指標の組み合わせに基づいて構成されます。
ディメンションはデータの属性です。たとえば、ディメンション「市区町村」はセッションの性質を表し、「横浜」、「川崎」などセッションが発生した市区町村を指定します。ディメンション「ページ」は、閲覧されたページの URL を表します。
指標はデータを定量 化したものです。指標「セッション」はセッションの合計数です。指標「ページ/セッション」は、セッションあたりの平均閲覧ページ数です。
ディメンションと指標 - アナリティクス ヘルプ
「メトリクス=量」「ディメンション=量の単位」みたいな感じです(正確には違うけど)。
「日単位のPV数を取得したい」だと「日」がディメンションで「PV数」がメトリクス・・・的な。
HelloAnalytics.pyのget_report
メソッドにあるパラメータをこんな感じに変えると・・・
※. ここのコードははじめてのGoogle Analytics Reporting APIをPythonとCloud9でちょっとだけ使ってみる - ponsuke_tarou’s blog で使ったものを基にしています。
'reportRequests' : [
{
'viewId' : VIEW_ID,
'dateRanges' : [{'startDate' : '7daysAgo' , 'endDate' : 'today' }],
'metrics' : [{'expression' : 'ga:pageviews' }],
'dimensions' : [{'name' : 'ga:date' }]
}]
こんな感じで「日単位のPV数」が取得できました。
ga:date: 20210316
Date range: 0
ga:pageviews: 411
ga:date: 20210317
Date range: 0
ga:pageviews: 845
ga:date: 20210318
Date range: 0
ga:pageviews: 787
ga:date: 20210319
Date range: 0
ga:pageviews: 498
メトリクスとディメンションで指定する値の意味が分からなくなりそうなので使ったものはメモしていきます。
dimensions
意味
レスポンス例
ga:date
日付
20210322
ga:pagePath
ページ
"/ponsuke0531/items/edf2eee638202aa7f61f"
ga:sourceMedium
参照元
"zenn.dev / referral"
ga:dimension{インデックス番号}
カスタム ディメンション
どこかに日本語で一覧があったらいいのに・・・。
metrics
意味
type
レスポンス例
ga:pageviews
ページビュー数
INTEGER
1631
ga:avgTimeOnPage
平均ページ滞在時間(秒)
TIME
"387.46666666666664"
ga:bounceRate
直帰率
PERCENT
"0.0"
Google API には、リクエス ト数の制限がありますので気をつけましょう。
遊びで使っているだけならいいのですが、お仕事で使う場合などにはAPI へのリクエス ト数の制限がありますので気をつけましょう。
ponsuke-tarou.hatenablog.com
Node.jsでちょっとだけ使ってみる
ponsuke-tarou.hatenablog.com
1回のAPI 呼出しで5こまでリクエス トを送信できます
各リクエス トには、別々のレスポンスが返されます。リクエス トは最大で 5 つ送信できます。すべてのリクエス トには、同じ dateRanges、viewId、segments、samplingLevel、および cohortGroup が含まれている必要があります。
リクエストの本文 | メソッド: reports.batchGet | アナリティクス Reporting API v4 | Google Developers
こんな感じで1回のAPI 呼出しで2このリクエス トを送信してみました。
※. ここのコードははじめてのGoogle Analytics Reporting APIをNode.jsでちょっとだけ使ってみる - ponsuke_tarou’s blog で使ったものを基にしています。
let dateRanges = [{ startDate: '2021-03-19' , endDate: '2021-03-30' }]
const res = await client.reports.batchGet({
requestBody: {
reportRequests: [
{
viewId: VIEW_ID,
dateRanges: dateRanges,
dimensions: [{ name: 'ga:pagePath' }] ,
metrics: [{ expression: 'ga:pageviews' } , { expression: 'ga:avgTimeOnPage' }] ,
orderBys: { fieldName: 'ga:pageviews' , sortOrder: 'DESCENDING' } ,
pageSize: 3
} ,
{
viewId: VIEW_ID,
dateRanges: dateRanges,
dimensions: [{ name: 'ga:sourceMedium' }] ,
metrics: [{ expression: 'ga:bounceRate' } , { expression: 'ga:avgTimeOnPage' }] ,
orderBys: { fieldName: 'ga:avgTimeOnPage' , sortOrder: 'DESCENDING' } ,
pageSize: 3
}
]
}
} )
レスポンスも2こ分返ってきました。(レスポンスは手ごろに改行しています。)
{ "reports ":[
{
"columnHeader ":{ "dimensions ":[ "ga:pagePath "] ,"metricHeader ":{ "metricHeaderEntries ":[{ "name ":"ga:pageviews ","type ":"INTEGER "} ,{ "name ":"ga:avgTimeOnPage ","type ":"TIME "}]}} ,
"data ":{ "rows ":[
{ "dimensions ":[ "/ponsuke0531/items/4629626a3e84bcd9398f "] ,"metrics ":[{ "values ":[ "1631 ","387.46666666666664 "]}]} ,
{ "dimensions ":[ "/ponsuke0531/items/df51a784b5ff48c97ac7 "] ,"metrics ":[{ "values ":[ "1160 ","601.5056179775281 "]}]} ,
{ "dimensions ":[ "/ponsuke0531/items/edf2eee638202aa7f61f "] ,"metrics ":[{ "values ":[ "999 ","401.8253968253968 "]}]}
] ,
"totals ":[{ "values ":[ "35429 ","382.3464974141984 "]}] ,
"rowCount ":499 ,
"minimums ":[{ "values ":[ "1 ","0.0 "]}] ,
"maximums ":[{ "values ":[ "1631 ","1679.0 "]}]} ,
"nextPageToken ":"3 "
} ,
{
"columnHeader ":{ "dimensions ":[ "ga:sourceMedium "] ,"metricHeader ":{ "metricHeaderEntries ":[{ "name ":"ga:bounceRate ","type ":"PERCENT "} ,{ "name ":"ga:avgTimeOnPage ","type ":"TIME "}]}} ,
"data ":{ "rows ":[
{ "dimensions ":[ "27.94.140.223:8080 / referral "] ,"metrics ":[{ "values ":[ "0.0 ","1335.0 "]}]} ,
{ "dimensions ":[ "nekorokkekun.hatenablog.com / referral "] ,"metrics ":[{ "values ":[ "0.0 ","996.0 "]}]} ,
{ "dimensions ":[ "zenn.dev / referral "] ,"metrics ":[{ "values ":[ "0.0 ","909.0 "]}]}
] ,
"totals ":[{ "values ":[ "86.22115384615384 ","382.3464974141984 "]}] ,
"rowCount ":69 ,
"minimums ":[{ "values ":[ "0.0 ","0.0 "]}] ,
"maximums ":[{ "values ":[ "100.0 ","1335.0 "]}]} ,
"nextPageToken ":"3 "
}
]}
試しにリクエス トの部分をコピペして6こリクエス トを送信したらちゃんと以下のエラーになりました。
$ node analytics.js
( node:7580 ) UnhandledPromiseRejectionWarning: Error: There are too many requests in the batch request. The max allowed is 5
at Gaxios._request ( C:\path\google-analytics-api\node_modules\gaxios\build\src\gaxios.js:127:23 )
at process._tickCallback ( internal/process/next_tick.js:68:7 )
( node:7580 ) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch() . ( rejection id: 1 )
( node:7580 ) [ DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Java とSpringBootでちょっとだけ使ってみる(現在奮闘中)
さて、実際に使いたい環境でもやってみようと思ったら・・・そもそもPython は使っていない・・・本当にぽんすけですね。
ということで今度はJava を使ってSpring Bootの環境でやってみたいと思います。
Spring Bootのプロジェクトを用意する
クライアント ライブラリをインストールする