Google Analyticsのユーザ毎のアクセスデータをエクスポートする。

#ゴール
Google Cloud Compute（以下、GCE）上にインスタンスを作成し、Pythonのプログラムを使用してGoogle Analytics（以下、GA）のデータをエクスポート、MySQLにインポートし、整形したデータをエクスポートするというような構成を目指します。


#環境（GCP）
OS： Ubuntu 14.04 LTS
Machine Type: g1-small (1 vCPU, 1.7 GB memory)
その他の設定はデフォルトですが、例外としてAPIを使用できるように権限を付与してください。


#手順

###事前準備
#####GAでアクセスユーザのIPを取得する。
ユーザ毎のアクセスログは無料版ではデフォルトで取得します。が、ユーザを一意にするための軸がありません。そのため、グループ分けを行う軸として、アクセスユーザのIPを取得します。
流れとしては下記のようになります。
①　GAにてカスタムディメンションを定義する。
②　WebサイトのJavaScriptにIPを取得するコードを追加する。
③　GA上で取得できている事を確認する。

■詳細説明
①　GAにてカスタムディメンションを定義する。
まずはカスタムディメンションを定義。カスタムディメンションはWebページから標準で提供される情報以外を送信したい場合に使用します。
![image](https://qiita-image-store.s3.amazonaws.com/0/129783/8d18f254-2b12-cfe5-8c29-3943bc0fefda.png)


新しいカスタムディメンションを作成します。（図では作成済み）
![image](https://qiita-image-store.s3.amazonaws.com/0/129783/3694ec58-5c73-f152-9f9f-7264bd55d585.png)

任意の名前を付けて作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/129783/43d2adbe-27bc-fb35-46c6-fcb234825f25.png)


作成したカスタムディメンションの値を取得するコードを確認します。
このコードをWebページのヘッダーに貼りつける、追加したカスタムディメンションに値を設定する事ができれば、Googleアナリティクス上で確認可能となります。
![image](https://qiita-image-store.s3.amazonaws.com/0/129783/ee498b76-e9a5-3ac1-e6b8-c1eccaa38537.png)

dimensionValueにtrackCommonMethod.getIP()と指定することでこのカスタムディメンションにIPが設定され、GAに送付されます。このスクリプトをサイトに追加します。
必ず、ga('send', 'pageview');の前に追加してください。
このサービスは下記のページを運営されている「けい」さんが作成されたようです。ありがとうございます。
http://lfll.blog73.fc2.com/blog-entry-258.html

これを使うのに抵抗がある場合は自分でスクリプトを書いても実現できそうな感じはあります。
僕の場合はJimdoのサイトに埋め込んだのでスクリプトが自由に書けず、横着しました。



```

<script type="text/javascript" src="//www.analyticsip.net/getIP/public_html/ra/script.php">

//中略

</script>
  ga('set', 'dimension1', trackCommonMethod.getIP());
  ga('send', 'pageview');

```


次にGAのデータが更新されるタイミングで各レポートのセカンダリディメンションに先ほど作成したカスタムディメンションを指定することでIPが表示されると思います。

![image](https://qiita-image-store.s3.amazonaws.com/0/129783/d2a9f03f-d02d-d49b-7cd1-5c716c90cde7.png)


#####GAからアクセスデータをエクスポートする。
これで下準備ができましたので、公式ページを参照して、サービスアカウントを作成します。
https://developers.google.com/analytics/


下記のようなPythonコードを作成して、GAのデータをCSVにエクスポートします。

```
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import sys
import HelloAnalytics
from apiclient.errors import HttpError
from oauth2client.client import AccessTokenRefreshError
import csv
import codecs
import subprocess
import datetime
import os
 
# information for call API.
scope = ['https://www.googleapis.com/auth/analytics.readonly']
service_account_email = '作成したサービスアカウントのeメール'
key_file_location = '作成したキーファイルの配置パス'
view_id = 'GAの管理画面で取得できるビューID'
 
# Authenticate and construct service.
# ここの接続設定は他の方のソースを流用したので、修正して下さい。
service = HelloAnalytics.get_service('analytics', 'v3', scope, key_file_location, service_account_email)
args = sys.argv
exec_date = args[1]
   
print ""
print "exec_date:" + exec_date
 
#--------------------------------------------
# データ収集(Main)
# ページビューに関する情報を日単位で取得
#--------------------------------------------
results = service.data().ga().get(
  ids='ga:' + view_id,
  start_date='7daysAgo',
  end_date='today',
  metrics='ga:pageviews',
  dimensions='ga:dimension1,ga:pagePath',
  max_results=20000
).execute()
rows = results.get('rows')
 
# Write Output File(CSV)
csvFileName = "GoogleAnalyticsData_" + exec_date + ".csv"
fout = codecs.open(csvFileName, 'w', 'utf-8')
filestr = "analysis_date" \
  + "," + "dimension1" \
  + "," + "pagepath" \
  + "," + "pageviews" + "\n"
fout.write(filestr);
 
count = 0;
for row in rows:
  dimension1 = row[0]
  pagepath = row[1];
  pageviews = row[2];
  filestr = exec_date \
    + "," + dimension1 \
    + "," + pagepath \
    + "," + pageviews + "\n" 

  fout.write(filestr)
  count = count+1;
 
print count;

```

#####エクスポートしたデータをMySQLにインポートし、整形する。
僕の場合はGAからのエクスポート、MySQLへのインポート、整形をまとめてやりたかったので、下記のようなシェルを作りました。ファイルのパスとかID、パスワードは適宜変更して下さい。

```
#!bin/bash
today=`date '+%F'`
lastWeek=`date --date '7days ago' +%F`
# Export CSY From GoogleAnalytics
# 先ほどのプログラム
python exportData.py $today
mv GoogleAnalyticsData_$today.csv files/

# Import Data From CSV To MySql
mysql -u analytics -panalytics  -D analytics -e "LOAD DATA LOCAL INFILE '/usr/local/analytics/files/GoogleAnalyticsData_$today.csv' IGNORE INTO TABLE raw_data FIELDS TERMINATED BY ',' ENCLOSED BY '""' IGNORE 1 LINES;"
# インポートしたデータを整形するSQLファイルを用意しました。
mysql -u analytics -panalytics  -D analytics < ImportData.sql

# Create CSV For TensorFlow
# MySQLではカラム名の出力ができなかったので、カラム名のみのテンプレートファイルにデータを出力する感じにしました。
mv /var/lib/mysql-files/ExportData.csv files/
if [ -f files/tfData_$today.csv ]; then
  rm files/tfData_$today.csv
fi
touch files/tfData_$today.csv
cat files/columns.csv  >> files/tfData_$today.csv
cat files/ExportData.csv  >> files/tfData_$today.csv

```



##感想

GAはネットでも情報が多いので、ほぼ難関無く目的を達成する事ができました。