Google Analytics V4 API(Java) URL ごとのpageview を取得する


Mezzanine の ページランキング Plugin でも作ってみようかなで、
Google Analytics V4 API でURLごとのpageview数を取得できるか試してみました。
言語はJavaで。。


参考サイト


v3, v4 APIの違いについて

こちら に記載があります。
ざっくり以下の3点が大きく変わったところかと思います。

  • v4 のリリース以降に、google analytics に追加された機能に対するapi は v4 側に追加される

  • APIがManagement APIMetadata API から独立した独立したので、単独使用する際は、VIEW_IDの指定が必要

    アナリティクス Reporting API V4 は、V3 の他の API (Management API や Metadata API など) から独立しているため、
    別個にクライアントライブラリが必要です。
    スペースに制約があるアプリケーション (モバイル アプリケーション)を作成する場合は、この点が API V3 を使用する 際の考慮事項になります。

  • sort 指定方法等 API のパラメータが変更されている。(Java API の IF には変更はないが、指定できる文字列が変わっている)


APIを使う前にやっておくこと

初心者でも分かる!なGoogle Analytics APIの使い方 が参考になりました。
以下、2点補足です。

1. Analytics API は 2つあり、V4 が付いているのが V4になります。

画像のAnalytics API がv3 APIで、
Analytics Reporting API V4 が v4 API になります。

Analytics Reporting API V4

2. サービスキーの種類は使用状況によって異なる。

API の 呼び出す場所を選択する必要があります。
今回は、CLIツールなので、その他のUI (Windows、CLIツール等) を選択しました。

CLI Tool


実装

1. V4 API のライブラリを依存関係に追加する。

Maven リポジトリに jar が登録されているので、そちらから取得しました。
以下指定方法です。

  • gradle
compile group: 'com.google.apis', name: 'google-api-services-analyticsreporting', version: 'v4-rev11-1.22.0'
// https://mvnrepository.com/artifact/com.google.api-client/google-api-client-gson
compile group: 'com.google.api-client', name: 'google-api-client-gson', version: '1.22.0'
  • maven
    <!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-analyticsreporting -->
    <dependency>
        <groupId>com.google.apis</groupId>
        <artifactId>google-api-services-analyticsreporting</artifactId>
        <version>v4-rev4-1.21.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client-gson -->
    <dependency>
        <groupId>com.google.api-client</groupId>
        <artifactId>google-api-client-gson</artifactId>
        <version>1.22.0</version>
    </dependency>
    

2. HelloAnalytics.java をコピー

はじめてのアナリティクス Reporting API V4: サービス アカウント向け Java クイックスタート
HelloAnalytics.javaをコピーして実行します。

以下、変更を加えた箇所について記載します。

import文の記載

sample code 上 以下の記載がありますが、

import com.google.analyticsreporting.v4.AnalyticsreportingScopes;
import com.google.analyticsreporting.v4.Analyticsreporting;
import com.google.analyticsreporting.v4.model.ColumnHeader;
import com.google.analyticsreporting.v4.model.DateRange;
import com.google.analyticsreporting.v4.model.DateRangeValues;
import com.google.analyticsreporting.v4.model.Dimension;
import com.google.analyticsreporting.v4.model.GetReportsRequest;
import com.google.analyticsreporting.v4.model.GetReportsResponse;
import com.google.analyticsreporting.v4.model.Metric;
import com.google.analyticsreporting.v4.model.MetricHeaderEntry;
import com.google.analyticsreporting.v4.model.Report;
import com.google.analyticsreporting.v4.model.ReportRequest;
import com.google.analyticsreporting.v4.model.ReportRow;
これは、以下が正しいようです。 パッケージ名、及び、以下クラス名がv3から変わっています。
Analyticsreporting > AnalyticsReporting
AnalyticsreportingScopes > AnalyticsReportingScopes

import com.google.api.services.analyticsreporting.v4.AnalyticsReportingScopes;
import com.google.api.services.analyticsreporting.v4.AnalyticsReporting;
import com.google.api.services.analyticsreporting.v4.model.ColumnHeader;
import com.google.api.services.analyticsreporting.v4.model.DateRange;
import com.google.api.services.analyticsreporting.v4.model.DateRangeValues;
import com.google.api.services.analyticsreporting.v4.model.Dimension;
import com.google.api.services.analyticsreporting.v4.model.GetReportsRequest;
import com.google.api.services.analyticsreporting.v4.model.GetReportsResponse;
import com.google.api.services.analyticsreporting.v4.model.Metric;
import com.google.api.services.analyticsreporting.v4.model.MetricHeaderEntry;
import com.google.api.services.analyticsreporting.v4.model.Report;
import com.google.api.services.analyticsreporting.v4.model.ReportRequest;
import com.google.api.services.analyticsreporting.v4.model.ReportRow;

認証情報の作成方を変更

P12 キー ではなく、JSON キーを使うようにしたため、GoogleCredential の作成方を以下のように変更しました。

GoogleCredential.fromStream(new FileInputStream(KEY_FILE_LOCATION))KEY_FILE_LOCATIONに、
JSONキーのファイルパスを指定することで、認証情報を生成できました。

    /**
     * Initializes an authorized Analytics Reporting service object.
     *
     * @return The analytics reporting service object.
     * @throws IOException
     * @throws GeneralSecurityException
     */
    private AnalyticsReporting initializeAnalyticsReporting() throws GeneralSecurityException, IOException {
        HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream(KEY_FILE_LOCATION))
                .createScoped(AnalyticsReportingScopes.all());
        // Construct the Analytics Reporting service object.
        return new AnalyticsReporting.Builder(httpTransport, JSON_FACTORY, credential)
                .setApplicationName(APP_NAME).build();
    }

Metrics のValue値の取得方法の変更

v3、v4だと戻り値が微妙に変わったらしく上手く取得できず、
サンプルコードの記述を少し変更しました。
Value値が格納される階層が1つ深くなったのではないかと思います。

  • 変更前
    for (int j = 0; j < metrics.size(); j++) {
          System.out.print("Date Range (" + j + "): ");
          DateRangeValues values = metrics.get(j);
          for (int k = 0; k < values.size() && k < metricHeaders.size(); k++) {
            System.out.println(metricHeaders.get(k).getName() + ": " + values.get(k));
          }
    }
  • 変更後
    for (DateRangeValues metric : metrics) {
        List<String> values = metric.getValues();
        for (int j = 0; j < values.size() && j < metricHeaders.size(); j++) {
            println("Metrics:" + metricHeaders.get(j).getName() + ": " + values.get(j));
        }
    }

本編 URLごとのPageViewを取得する。

以下、URLごとのPageViewの取得メソッドになります。

  • getReportDimensionPagepathsMetrixPageviews_SessionsOrderByPageviewsDesc
    /**
     * getReportDimensionPagepathsMetrixPageviews_SessionsOrderByPageviewsDesc
     *
     * @throws GeneralSecurityException
     * @throws IOException
     */
    public void getReportDimensionPagepathsMetrixPageviews_SessionsOrderByPageviewsDesc() throws GeneralSecurityException, IOException {
        AnalyticsReporting service = initializeAnalyticsReporting();

        // --------------------------------------------------
        // Create the DateRange object.
        // -----------------------------
        DateRange dateRange = new DateRange();
        dateRange.setStartDate("2016-09-01");
        dateRange.setEndDate("2016-09-29");
        List<DateRange> dateRanges = Arrays.asList(dateRange);

        // --------------------------------------------------
        // Create the Metrics object.
        // -----------------------------
        Metric pageviews = new Metric()
                .setExpression("ga:pageviews")
                .setAlias("PageView");

        // Create the Metrics object.
        Metric sessions = new Metric()
                .setExpression("ga:sessions")
                .setAlias("Sessions");
        List<Metric> metrics = Arrays.asList(sessions, pageviews);

        // --------------------------------------------------
        // Create the Dimensions object.
        // -----------------------------
        Dimension pagePath = new Dimension().setName("ga:pagePath");
        List<Dimension> dimensions = Arrays.asList(pagePath);

        // --------------------------------------------------
        // Create OrderBy object
        // ------------------------------
        OrderBy sort = new OrderBy().setFieldName("ga:pageviews").setSortOrder("DESCENDING");
        List<OrderBy> sortOrders = Arrays.asList(sort);

        // --------------------------------------------------
        // Create the ReportRequest object.
        // ------------------------------
        GetReportsResponse response = getReportsResponse(service, dateRanges, metrics, dimensions, sortOrders);

        // print response
        printResponse(response);
    }

ちょっと解説

  • Metrics には、pageviews と、sessions を指定
    横軸には、pageviews と、sessions を指定しています。 以下が該当箇所になります。
        // --------------------------------------------------
        // Create the Metrics object.
        // -----------------------------
        Metric pageviews = new Metric()
                .setExpression("ga:pageviews")
                .setAlias("PageView");

        // Create the Metrics object.
        Metric sessions = new Metric()
                .setExpression("ga:sessions")
                .setAlias("Sessions");
        List<Metric> metrics = Arrays.asList(sessions, pageviews);
  • Dimensions には、pagePath を指定
    pageviews数 と、sessions数 を pagePath(URL) で GroupBy したいので、
    Dimensionsに pagePathを指定します。
    以下が該当箇所の記述になります。
        // --------------------------------------------------
        // Create the Dimensions object.
        // -----------------------------
        Dimension pagePath = new Dimension().setName("ga:pagePath");
        List<Dimension> dimensions = Arrays.asList(pagePath);
  • PageView のランキングを出したいので、 PageView で OrderByDesc pageviews数 の ランキングを出力するので、
    結果をpageviewsで OrderByDescします。
    以下が該当箇所の記述になります。
        // --------------------------------------------------
        // Create OrderBy object
        // ------------------------------
        OrderBy sort = new OrderBy().setFieldName("ga:pageviews").setSortOrder("DESCENDING");
        List<OrderBy> sortOrders = Arrays.asList(sort);

プログラム一式

GithubにUPしました。


発生したエラーとその対処方法

400 Bad Request invalid_grant

複数jsonキーを発行しては消してを繰り返していたのですが、
消したキーを指定してAPIを呼び出したところ、以下のエラーとなりました。
キー指定を間違えているのに気がつかず、長いことはまりました。。

    com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
    {
      "error" : "invalid_grant",
      "error_description" : "Invalid JWT Signature."
    }
        at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
        at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)

400 Bad Request Invalid value at ‘report_requests[0].order_bys[0].sort_order’

SortOrder の指定方法を間違えたところ、以下のエラーが発生しました。
v3 とは指定方法が異なります。 以下3つが指定可能です。

  • SORT_ORDER_UNSPECIFIED

  • ASCENDING

  • DESCENDING

com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
  "code": 400,
  "errors": [
    {
      "domain": "global",
      "message": "Invalid value at 'report_requests[0].order_bys[0].sort_order' (TYPE_ENUM), \"ga:pageviews\"",
      "reason": "badRequest"
    }
  ],
  "message": "Invalid value at 'report_requests[0].order_bys[0].sort_order' (TYPE_ENUM), \"ga:pageviews\"",
  "status": "INVALID_ARGUMENT"
}
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)

400 Bad Request “status”: “INVALID_ARGUMENT”

ga:pageview に文字列を指定したところ、以下のエラーが発生しました。
数値項目には数値を入れないとエラーになるようです。

com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
  "code": 400,
  "errors": [
    {
      "domain": "global",
      "message": "Invalid value 'ga:pageviews=~^/blog.*' for filters parameter.",
      "reason": "badRequest"
    }
  ],
  "message": "Invalid value 'ga:pageviews=~^/blog.*' for filters parameter.",
  "status": "INVALID_ARGUMENT"
}
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)

Metrix、Dimension、Orderby に指定できるクエリについて

Dimensions & Metrics Explorer  |  アナリティクス Reporting API V4  |  Google Developers
に指定できるga:xxxxxが記載されています。
大量にありますが、pageランキング出力したいという場合には、
まず使わないかと。。 分析で色々指定できるのは、楽しいかもしれません。

以上です。

コメント