Google AppEngineでGoogle Analytics Core Reporting API
Google AppEngineにはAppIdentityっていうAPIがあってこれを使ってGoogleのサービスをAppEngine側から利用できる(※あくまでクライアント依存ではなくサーバーを利用しているユーザー依存かと)
っていう事で、このAppIdentity APIを使って自分が登録しているGoogle Analyticsのレポートデータを簡単に取得できるようにしてみた
サービス関連の設定
- Google AppEngineのアプリケーションを取得する。でそこのApplication SettingsにあるService Account Nameに記載されているメールアドレスをコピーしておく
- http://console.developers.google.com にアクセスしてGoogle AppEngineアプリケーションのプロジェクトを選んでAPIセクションにてGoogle Analytics APIを使えるように許可を設定しておく
- Google Analyticsにアクセスして設定画面にてユーザー管理にて先ほどコピーしたメールアドレスでのアクセスを許可するようにしておく(権限まで指定できるけど表示と分析程度でいいはず。設定するところはアカウント・プロパティ・ビューの3つ)
サービス関連の設定は以上。これをAppIdentity APIを使ってデータを取得して表示する
build.gradle
色々ライブラリを使うので(dependencies以外は無視してオッケー)
ext {
targetDir = "target"
}
buildDir = targetDir
apply plugin: "war"
repositories {
mavenCentral()
maven {
url "http://maven.seasar.org/maven2"
}
}
sourceSets {
main {
output.classesDir = "${buildDir}/classes"
output.resourcesDir = "${buildDir}/classes"
}
test {
output.classesDir = "${buildDir}/classes"
}
apt
}
dependencies {
compile "javax.servlet:servlet-api:2.5"
// Google API ClientとGoogle APIs Servicesなライブラリを使う
compile "com.google.api-client:google-api-client:1.20.0"
compile "com.google.api-client:google-api-client-appengine:1.20.0"
compile "com.google.api-client:google-api-client-jackson2:1.20.0"
compile "com.google.apis:google-api-services-analytics:+"
compile "com.google.appengine:appengine-api-1.0-sdk:1.9.20"
compile "org.slim3:slim3:1.0.16"
providedRuntime "com.google.appengine:appengine-api-stubs:1.9.20"
testCompile "junit:junit:4.11"
aptCompile("org.slim3:slim3-gen:1.0.16") {
exclude group: "org.apache.ant"
}
}
task compileAptJava(overwrite: true) {
sourceSets.apt.output.resourcesDir.mkdir()
ant.path(id: "aptFactoryPath", location: configurations.aptCompile.asPath)
ant.apt(
compile: false,
includeAntRuntime: false,
factorypathref: "aptFactoryPath",
classpath: configurations.compile.asPath,
preprocessdir: sourceSets.apt.output.resourcesDir,
encoding: "UTF-8"
) {
sourceSets.main.java.srcDirs.each {
src(path: it)
}
}
}
compileAptJava.inputs.dir sourceSets.main.java.srcDirs
compileAptJava.outputs.dir sourceSets.apt.output.resourcesDir
compileJava.dependsOn compileAptJava
sourceSets.main.java.srcDirs += sourceSets.apt.output.resourcesDir
AnalyticsController.java
Slim3を使ってるので(ry
package sample.controller;
import java.util.Arrays;
import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;
import com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential;
import com.google.api.client.extensions.appengine.http.UrlFetchTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.analytics.Analytics;
import com.google.api.services.analytics.model.GaData;
public class AnalyticsController extends Controller {
private static final String[] SCOPES = {
// Analyticsクラスに定数があるはずなんでそれ指定すればいいはず
"https://www.googleapis.com/auth/analytics"
};
public Navigation run() throws Exception {
AppIdentityCredential credential = new AppIdentityCredential(
Arrays.asList(SCOPES)
);
Analytics analytics = new Analytics.Builder(
new UrlFetchTransport(),
new JacksonFactory(),
credential
)
.setApplicationName("hoge fuga foobar")
.build();
GaData data = analytics.data().ga()
.get(
// AnalyticsのビューID
"ga:([0-9]+)",
// start date
"2015-05-15",
// end date
"2015-05-15",
// metrics
"ga:pageviews"
)
// ページタイトル・ページパスを取得
.setDimensions("ga:pageTitle,ga:pagePath")
// 観覧数を降順でソート
.setSort("-ga:pageviews")
.execute();
response.setContentType("application/json; charset=utf-8");
response.getWriter().println(data.toString());
return null;
}
}
AppIdentityCredentialっていうを使う事でGoogle AppEngine AppIdentityを使ってリクエストできる模様。あとはGoogle API ClientとGoogle APIs Service Clientのクラスリファレンスに沿って書いていく
一応、AppIdentityService.getAccessToken(SCOPES).getAccessTokenでアクセストークンを取得する事自体は可能なので、別にクライアントライブラリ使わないならそのアクセストークンを使ってAPIをコールするような実装を行えば良い
っていう感じでビルドしてGoogle AppEngine側にデプロイしてアクセスしてみると
※必要の無い情報を修正してあります
っていうような感じでGoogle AppEngineが持つアカウントがGoogle Analytics Core Reporting APIにアクセスしてデータを取得して表示するような事をやろうと思えばできるっぽい。自分のサイトとかのアクセス解析でもってランキングとかを作成したいような場合にクライアントサイドからデータを取得したいような要件とかにはこういうサーバーを作っておけばさらっとできちゃうのではないかと