みんな大好きGoogle Analytics、通称GA(ジーエー)。
JavaScriptのタグを入れるだけでウェブサイトのアクセス状況が自動で分析されてダッシュボードとして表示されるという簡便さから、GAは個人利用だけでなく法人利用でも圧倒的なシェアを誇っています。
ただし、GAで基本的に分析できるのは、要約されたマクロな集計値です。一人一人がどういう行動をとったかという個票レベルでのアクセスログは、分析どころかアクセスすることすらパッと見できそうではありません。
2016年3月に提供開始されたユーザーエクスプローラ(User Explorer)機能によって個別のユーザー行動を追えるようになっていますが、UIにはかなり癖があり、データ分析に適したものではありません。というのも、アクセスログはユーザーごとに別格納されていて、データとしてエクスポートしようにもユーザーごとに手作業をしなければならないからです。手作業、やってらんないですよね。。
なんならAPIで自動取得すればいいじゃんということでGAのAPIについて仕様を調べてみたら、思った以上に日本語情報がないどころか英語の公式情報すら調べづらい状態にあったので、ここで簡単にまとめることにしました。
(API取得ニーズはないんだろうか?いやきっとそれなりにあると思うのだけれど、ユーザーエクスプローラ自体がマイナーな機能だし、そもそもGAでそういうことをやろうという発想に至る人は少ないのかもしれません。)
GoogleアナリティクスのモダンAPIは、2020年4月現在で6つあるようです。
GAのAPIは基本的には以下の一覧に載っているのですが、
・・・なぜかUser Activity APIはここに載っていません。User Activity APIのURLは『/reporting/core/v4/user-reporting』なので、階層的にはReporting API V4に含まれる模様ですが、Reporting API V4とは全然毛色が違いますし、後述するライブラリの呼び出し方法も大上段から分岐します。なにより肝心のReporting API V4ページから辿れる導線が見当たりません。
不思議。。
さて本題に戻ります。アクセスログ自体を取得できるのは User Activity API ですが、このAPIはGA上でユーザーごとに定義されるクライアントIDをパラメータに渡さないと取得できません。そのため、バッチ処理でReporting API V4 を呼んで直近訪問者のクライアントIDを控えつつ、そのクライアントIDを使って User Activity API を呼んでアクセスログを取得する、というのが基本的な実装形式となりそうです。
なお、有料サービスである Google Analytics 360(GA 360)ではGoogle BigQueryへのエクスポートができるようなので、上記のような回りくどい実装は不要です。色々考えるのはめんどくさい、と言う人はGA360に移行するのがよいのかもしれません。
まずはReporting API V4を使ってクライアントIDを取得できる実装を考えます。今回は最速で実装したいので、Google Apps Script(GAS)で書いてみたいと思います。
通常だと、
という2つの事前作業が必要で、特に認証まわりはリファレンス情報自体が少ないうえに日本語は皆無、実装上は環境依存も多くて意外なところで壁にぶつかることこの上ないのですが、GASであれば同じGoogleサービス内ということでAPIを呼ばずとも『AnalyticsReporting』ライブラリ経由で直接使えるため、アプリ登録と認証という面倒な作業が不要になるという特大特典があります。「OAuth 2.0 何それ美味しいの?」という感じの方は、とりあえずGASぐらいの気持ちでGASを選定する方が絶対に楽です。
(細かいことを言うと、認証不要の恩恵を受けるには対象となるGAを保有しているGoogleアカウントのGASからのアクセスが必要です。別のGoogleアカウントが保有するGASからアクセスする場合は『AnalyticsReporting』で参照できないため、外部アプリとしてOAuth 2.0による認証が必要になります。)
なお、実際に作業に入る前に、参考になるページを以下に並べておきます。自分でもっと読みたい、調べたい、という方は是非ご覧ください。
それでは作業に入ります。
まずはGAS画面を立ち上げてライブラリの有効化をします。細かいGASアプリの立ち上げについて分からない人は、1年くらい前の記事を参照するかググってください。GAS画面にたどり着いたら、GAS画面の上タブの『リソース』から『Googleの拡張サービス』を選び、『Analytics Reporting API』を『V4』で有効化して『OK』ボタンを押します。ただし、初めての時は
Advanced Google Services
To enable Advanced Services for your Apps Script-managed Cloud Platform project, please accept the Cloud Console Terms of Service. If the terms were recently accepted, please wait a bit and try again.
などと表示されて、Google Cloud Platformの利用規約を承諾するよう促されるので、リンクをクリックして承諾します。すると、もう一度『Googleの拡張サービス』をクリックすると10数個の拡張サービス(ライブラリ)が並ぶので、『Analytics Reporting API』を『V4』で有効化して『OK』ボタンを押します。
ライブラリの有効化ができたら、あとはコードを書くだけです。
以下のコードサンプルは、対象としたいビューについてGAの管理画面でビューID(たぶん8桁の数字)を調べてグローバル変数『VIEW_ID』にて『ga:』の後に続くように入力するだけで使えるサンプルです。
ざっくり説明すると、『saveRecentAnalyticsActivityList』という関数を実行すると、昨日のアクティビティを取得して、【クライアントID、セッションID、日時、パス】に絞って整形してリスト化し、JSON形式でGoogle Driveに保存するような機能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
var VIEW_ID = 'ga:********'; //昨日のアクティビティを一覧として取得してJSON形式でDriveに保存する function saveRecentAnalyticsActivityList(){ //clientId以外に取得したいディメンションがあれば追記 var dimensionList = [ {'name':'ga:clientId', 'meaning':'clientId'} ]; //データ取得する期間を設定 var temp = new Date(); temp.setDate(temp.getDate() - 1); var startDate = Utilities.formatDate(temp, 'GMT', 'yyyy/MM/dd'); var endDate = Utilities.formatDate(temp, 'GMT', 'yyyy/MM/dd'); var yyyymmdd = Utilities.formatDate(temp, 'GMT', 'yyyyMMdd'); //ユーザー(クライアントID)情報をもとに、アクティビティを取得 var userList = getAnalyticsUserList(dimensionList,startDate,endDate); var activityList = getAnalyticsActivityList(userList,startDate,endDate); //my-driveにJSON形式にて保存する DriveApp.createFile('AnalyticsActivityList_' + yyyymmdd + '.json', JSON.stringify(activityList)); } //指定期間に訪問したユーザーのクライアントIDとユーザー定義値(ユーザーカスタムセグメント)を取得する function getAnalyticsUserList(dimensionList,startDate,endDate){ //リクエスト用に、データ取得したいディメンションを再定義してパラメータを生成 var dimensionNameList = []; for (var iDimension = 0; iDimension < dimensionList.length; iDimension++){ dimensionNameList.push({'name':dimensionList[iDimension]['name']}); }; var params = { 'reportRequests':[{ 'viewId': VIEW_ID, 'dateRanges': [ {'startDate':startDate, 'endDate':endDate} ], 'dimensions':dimensionNameList, 'metrics': [ {'expression':'ga:users'} ], 'samplingLevel':'LARGE', 'pageSize':'100000' }] } //ユーザ一覧を取得 var response = AnalyticsReporting.Reports.batchGet(params); //クライアントID+指定カスタムディメンションを抽出して返す var analyticsUserList = []; var rows = response['reports'][0]['data']['rows']; for (var i = 0; i < rows.length; i++){ var row = rows[i]; var analyticsUser = {}; for (var iDimension = 0; iDimension < dimensionList.length; iDimension++){ var meaning = dimensionList[iDimension]['meaning']; analyticsUser[meaning] = row['dimensions'][iDimension]; } analyticsUserList.push(analyticsUser); } return analyticsUserList; } //指定期間×指定クライアントIDのアクティビティを取得して一覧として返す function getAnalyticsActivityList(userList,startDate,endDate){ var analyticsActivityList = []; for (var i = 0; i < userList.length; i++){ //指定クライアントIDにてユーザアクティビティを取得 var user = userList[i]; var params = { 'viewId':VIEW_ID, 'user':{ 'type':'CLIENT_ID', 'userId':user['clientId'], }, 'dateRange':{ 'startDate':startDate, 'endDate':endDate }, 'activityTypes':['PAGEVIEW'] }; var response = AnalyticsReporting.UserActivity.search(params); //セッション×アクティビティごとに整形して配列に格納 var sessionList = response['sessions']; for (var iSession = 0; iSession < sessionList.length; iSession++){ var session = sessionList[iSession]; for (var iActivity = 0; iActivity < session['activities'].length; iActivity++){ var activity = session['activities'][iActivity]; var analyticsActivity = JSON.parse(JSON.stringify(user)); analyticsActivity['sessionId'] = session['sessionId']; analyticsActivity['activityIndex'] = iActivity; analyticsActivity['dateTime'] = Utilities.formatDate(new Date(activity['activityTime']), 'JST', 'yyyy/MM/dd HH:mm:ss'); analyticsActivity['pagePath'] = activity['pageview']['pagePath']; analyticsActivityList.push(analyticsActivity); } } } analyticsActivityList.sort(function(a,b){ var key = 'dateTime'; if (a[key] < b[key]){return -1;} if (a[key] > b[key]){return 1;} return 0; }); return analyticsActivityList; } |
留意点をいくつか挙げると、
あたりは気にしておいた方が良いかもしれません。
ということで、サンプルコードが半分くらいを占める投稿になってしまいましたが、AnalyticsReportingを使ったとしても意外とハマりやすいユーザーエクスプローラ情報の取得について書いてみました。
大規模なサイトでは上述の留意点をクリアする実装をするか、思い切って有料版であるGA360に切り替える必要がありますが、その点を考慮したとしても、GAさえ使っていれば案外簡単にアクセスログを引っこ抜くことができるのだなというのが今回の発見でした。
こうやって必要なデータだけに整形してアクセスログを取得してJSON形式で保管できれば、あとは煮るなり焼くなり好き勝手にできます。今回はAPIを使って自動取得に成功しているので、以降のデータ分析やアクションへの落とし込みまでを自動化すれば、かなり自由度の高いウェブマーケティングが実現できると思われます。
以上、作業メモでした。