先日ブログにも書きましたがV2でのアクセスであり、ClientLoginだったので 今度はv3でのアクセスをやってみます。今回もJavaです。 Googleの日本語の資料はいつも通り古くほぼv2を使っているので しばらくは英語の文献の方が良いと思います。準備まずここからクライアントライブラリをダウンロードしてきます。 で ・google-api-client-1.6.0-beta.jar ・google-http-client-1.6.0-beta.jar ・google-oauth-client-1.6.0-beta.jar ・dependencies/gson-1.7.1.jar ・dependencies/guava-r09.jar ・dependencies/jackson-core-asl-1.9.1.jar を読み込みます。 Analytics用のライブラリはここにあります。OAuthでのアクセスする準備Google+のアクセス時に説明しましたが、API使用したり、クライアントID取得の為に GoogleAPIConsoleでAnalyticsをONしておく必要があります。 「Services」をクリックしてAnalyticsをON 「API Access」をクリックして、クライアントIDを発行します。 私自身はWebアプリで使いたいですけど、一旦アクセスする為に「installed applications」を選びました。 違いはWebアプリケーションの場合と違い、コールバックURLが固定値になり、 手作業で認可コードを設定するっていう手順が増えるだけです。認可を行うさて準備ができたので、アクセスしてみます。String authorizationUrl = new GoogleAuthorizationRequestUrl(CLIENT_ID, REDIRECT_URL, "https://www.googleapis.com/auth/analytics.readonly").build(); System.out.println(authorizationUrl); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String authorizationCode = null; try { authorizationCode = in.readLine(); } catch (IOException ioe) { throw new RuntimeException("Error",ioe); }GoogleAuthorizationRequestUrlに取得したクライアントIDとリダイレクトURLを設定します。 三番目の引数はスコープ(何にアクセスできるか)です。 認証用のURLを作成してコンソールに出力しreadLine()で認可コードを待ち受けます。 ブラウザを立ち上げて、コンソールに出力されたURLにアクセスすると Googleの認証画面(マルチアカウントの場合、ユーザ選択画面等もあります)が表示され 認可画面が現れて認可を行うと、認可コードを出力してくれるのでそれをコンソールに入力します。アクセストークンの取得コンソールに入力された認可コードを元にアクセストークンをとりにいきます。 APIコンソールで取得したIDとSecret、それと認可コードでAccessTokenResponseを生成NetHttpTransport httpTransport = new NetHttpTransport(); JacksonFactory jacksonFactory = new JacksonFactory(); AccessTokenResponse response = null; try { response = new GoogleAccessTokenRequest.GoogleAuthorizationCodeGrant( httpTransport, jacksonFactory, CLIENT_ID, CLIENT_SECRET, authorizationCode, REDIRECT_URL).execute(); } catch (IOException ioe) { throw new RuntimeException("Error",ioe); }認可コードが間違ってなかったらこれでOKのはず。 responseにアクセストークン、リフレッシュトークン等が取得されます。Analyticsのオブジェクトを生成取得したAccessTokenResponseを元にGoogleAccessProtectedResource googleAccessProtectedResource = new GoogleAccessProtectedResource(response.accessToken, httpTransport, jacksonFactory,CLIENT_ID, CLIENT_SECRET, response.refreshToken); Analytics analytics = Analytics.builder(httpTransport, jacksonFactory) .setHttpRequestInitializer(googleAccessProtectedResource) .setApplicationName("test") .build();というような感じでAnalyticsオブジェクトを生成します。データを取得してみるさてやっとアクセスですね。Get apiQuery; try { apiQuery = analytics .data() .ga() .get("ga:" + "13012476", "2011-09-01", "2011-09-30", "ga:visits,ga:pageviews"); } catch (IOException e) { throw new RuntimeException("Error", e); } apiQuery.setSort("-ga:visits"); apiQuery.setMaxResults(50); try { GaData data = apiQuery.execute(); Map取得してきたanalyticsオブジェクトのdata().ga().get()をおこなってGetオブジェクトを生成します。 第1引数はProfileIdになります。v2で言っていたTableIdですね。id自体は数値などで入っている為、 「ga:」をつけてやる必要があります。 これをexecute()するとデータが取れてきます。 この取得方法だと出力は「ga:visits,ga:pageview」が取得できます。 取得できるDimensionやMetricsなどはここにあります。totalsMap = data.getTotalsForAllResults(); for (Map.Entry entry : totalsMap.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); } } catch (IOException e) { throw new RuntimeException("Error", e); } ProfileのIdについて前述した「ga:13012476」についてですが v2の時はEntries()などで比較的容易に取得できましたけど。。。Management management = analytics.management(); Accounts accounts = management.accounts().list().execute(); List<Account> accountList = accounts.getItems(); Account account = accountList.get(0); String accountId = account.getId(); Webproperties prop = management.webproperties().list(accountId) .execute(); Webproperty webproperty = prop.getItems().get(0); String webId = webproperty.getId(); Profiles profiles = management.profiles().list(accountId, webId) .execute(); Profile profile = profiles.getItems().get(0); String profileId = profile.getId(); System.out.println("accountId:" + accountId); System.out.println("webId:" + webId); System.out.println("profileId:" + profileId);わかりやすくすべてのデータについて、itemsの1件目を取得してます。 Accountはマルチアカウント用なのかな、、、私の環境では1件でした。 WebPropertyは解析しているサイト数が出てきました。 その中からプロファイルを取得する感じですね。 少しAnalytics自体のデータ構造がわかってないのでこれで正しいのか不明です。 execute()時にAPIを発行しているはずなので、、、うーんって感じ。感想なんかライブラリが多すぎて少し引きました><。 実際実装する際にはライブラリではなく、RESTfulアクセスすると思います。 なぜかというと、個人(セッション)に対して何を残せば良いかがわかりにくく アクセスなどが隠蔽されているので何か使いにくいというか、、、って感じです。 ※いやこのコード位の事やるにはいいんですけどね。 まぁJSONからデータのオブジェクト作ったりするのが大変だったりもするんですけど。
2012年2月23日木曜日
GoogleAnalytics(v3)でアクセスする
GoogleAnalyticsにアクセスしてみる
そのまま勢いでv3のOAuthを作りました。 Google AnalyticsはWeb解析ソリューションです。 何も考えずにサイトにJavaSriptコードを埋め込む事でWebの訪問者などを調べる事をできます。 素晴らしいサービスであれこれ機能がありますが、 今回はAPIにJavaでアクセスしてみたいと思いました。準備・gdata-core-1.0.jar ・gdata-analytics-2.1.jar ・google-collections-1.0.jar を読み込みます。 見つけて行く過程で「google-api-service-analytics-v3-1.3.3-beta.jar」を見つけました。 これでアクセスするのが良かったかもなのですが、 ちょっと使い方がわからなかったので後日試します。 サンプルを元におこなってみます。まずは認証gdataに関してOAuthやAuthSubなどの認証方式がありますが、ClientLoginで試しました。AnalyticsService service = new AnalyticsService("applicationName"); service.setUserCredentials(username, password);ClientLoginはOAuthなどを触った事がある人ならわかると思いますが あまり好ましいと思える認証方式ではありません。 実際文献にも「てめーで使うようなアプリにしか使うなよ」って書いてあります。 OAuthなどを行いたかったのですが、今回はアクセスしてみる事を目標にしてますので 一旦この方式でアクセスしてみます。サイトの一覧を取得AnalytisServiceからアカウントの情報を取得してきます。URL feedUrl = new URL(""https://www.google.com/analytics/feeds/accounts/default""); AccountFeed service.getFeed(feedUrl, AccountFeed.class); for (AccountEntry entry : accountFeed.getEntries()) { }AccountFeedのgetEntries()によってそのアカウントが所有しているデータを取得する事が可能です。サイトの訪問者を見てみるAccountEntryには「TableId」というものがあって、それによりどのサイトかを識別できるようになってます。 そのテーブルIDを元にDataQueryを作成します。DataQuery query = new DataQuery(new URL(DATA_URL)); query.setIds(tableId); query.setStartDate("2012-01-01"); query.setEndDate("2012-01-31"); query.setDimensions("ga:browser"); query.setMetrics("ga:visits,ga:bounces");setDimensions()は何を取ってくるか? setMetrics()何を取ってくるか?です。 まぁ日付はそのままですね。 この場合、ブラウザについての訪問者を調べています。 このデータクエリに対してquery.setSort("-ga:visits"); query.setFilters("ga:browser!@Explorer"); DataFeed dataFeed = service.getFeed(query, DataFeed.class);というようにソートやフィルタをつけてあります。 この場合訪問者数の降順、「Explorer」とついたブラウザの排他ですね。 ・・・Googleのサンプルに悪意を見た。 これで取得したDataFeedに情報が入ってますのでfor (DataEntry entry : dataFeed.getEntries()) { System.out.println("\tBrowser: " + entry.stringValueOf("ga:browser")); System.out.println("\t\tVisits: " + entry.stringValueOf("ga:visits")); System.out.println("\t\tBounces: " + entry.stringValueOf("ga:bounces")); System.out.println("\t\tBounce rate: " + entry.longValueOf("ga:bounces") / (double) entry.longValueOf("ga:visits")); }みたいな感じで情報にアクセスできます。感想まぁサービスに埋め込むにはまだ色々と考えないとなぁと思いました。 ※まぁとにかく認証ですよね。 案外調べていてPHPで文献(ブログ)を出している人が多そうでした。 まぁ現状では埋め込むサイトはPHPの方が多そうですね。 Javaでアクセス解析必要なサービスって少し前なら想像できませんが 今はGoogleAppEngineもあるので、Javaでこういったものが必要なサービスも増えてくると思います。 1.6辺りからGoogleAppEngine対応されているみたいで
2010年2月22日月曜日
FlexでGoogleAnalytics
Flexでサービスを作成していましたが、
HTMLの呼び出ししかアクセス解析ができてなくて
ViewStack化しているような位置のアクセス解析ができてなかったので
アクセスログを取りたいなぁ。。。って思ってたら
「gaforflash」たるものを見つけました。
ダウンロードしたファイルのなかに[lib/analytics.swc]がありますので
ライブラリに追加してあげます。
Flashで使う場合はもう一個の「lib/analytics_flash.swc」を
使うみたいですね。
private static var tracker:AnalyticsTracker = null;
public static function initTracker(object:DisplayObject):void {
if (tracker == null) {
tracker = new GATracker(object, "UA-?????-??", "AS3");
}
}
public static function viewPage(pageUrl:String):void {
if ( tracker == null ) return;
tracker.trackPageview(pageUrl);
}
巷に落ちてるサンプルだと、常にnewしているようでしたが、
なんか勿体なかったので、Singletonパターンで作成しておいて
viewPage()でURLを設定する形を行いました。
コンストラクタの第四引数に「true」を設定してあげたら
デバッグモードで動作して、アクセスを確認できるみたいです。
登録:
投稿 (Atom)