Mezzanine の ページランキング Plugin でも作ってみようかなで、
Google Analytics V4 API
でURLごとのpageview数を取得できるか試してみました。
言語はJavaで。。
参考サイト
-
登録手順の説明
-
JAVA API のサンプル
-
v3、v4 の違い
-
Dimensionsと、Metrics の説明
-
BatchGetのリファレンス
v3, v4 APIの違いについて
こちら に記載があります。
ざっくり以下の3点が大きく変わったところかと思います。
-
v4 のリリース以降に、google analytics に追加された機能に対するapi は v4 側に追加される
-
APIが
Management API
、Metadata 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 になります。
2. サービスキーの種類は使用状況によって異なる。
API の 呼び出す場所を選択する必要があります。
今回は、CLIツールなので、その他のUI (Windows、CLIツール等)
を選択しました。
実装
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ランキング出力したいという場合には、
まず使わないかと。。
分析で色々指定できるのは、楽しいかもしれません。
以上です。
コメント