Google AppEngineでGoogle Analytics Core Reporting API

2015-05-15T00:00:00+09:00 Java Google App Engine

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にアクセスしてデータを取得して表示するような事をやろうと思えばできるっぽい。自分のサイトとかのアクセス解析でもってランキングとかを作成したいような場合にクライアントサイドからデータを取得したいような要件とかにはこういうサーバーを作っておけばさらっとできちゃうのではないかと

ServiceWorkerを使ったPush APIをやってみた chrome.identity APIを使ってGoogle App Engine OAuth2を使う