ある日、突然 WordPress プラグインの 「人気記事一覧」 が表示されなくなりました。
結局それは、数日すると再度表示されるようになったのですが、ちょっと焦りました。
この「人気記事一覧」は、Simple GA Ranking と呼ばれるプラグインで、Google Analytics のデータと連動させて表示させています (サムネイル表示はプラグインに用意されているフックを利用して独自に追加しています。過去記事参照)。
この、Google Analytics からのランキングデータの取得。なんとかして、自身で取得出来ないものだろうかと思い、ネットの海を色々さまよってみました。
Google Cloud Platform と Google Analytics をサービスアカウントで紐付ける
ここでは、すでに、
- Google アカウントを持っている
- Web サイトに Google Analytics を適用済み (過去記事 参照) = Google Cloud Platform (GCP) にてプロジェクトを作成済み
であることを前提としています。
Google Cloud Platform (GCP) での準備
GCP のダッシュボード
Google Cloud Platform にアクセスします。
ダッシュボードが開きます。
複数のプロジェクトがある場合、ここでプロジェクトを選択しておく必要があるかもしれません。
画面上部、「Google Cloud Platform」の右横のプロジェクト選択リストから利用したいプロジェクトを選択して下さい。
左上のハンバーガーメニューを開き、「IAM と管理」 → 「サービスアカウント」をクリックします。
IAM と管理からサービスアカウントを作成
「+サービスアカウントを作成」をクリック。
サービスアカウント名に適当な名前を入力します。
サービスアカウント名 を入力すると、「サービスアカウントID」 に、<サービスアカウント名>@<プロジェクト名>.iam.gserviceaccount.com
という値が表示されます。これは、後に使用するので覚えるか控えるかしておいて下さい。
その後、「作成」をクリック。
「サービスアカウントの権限(オプション)」は、そのままにして「続行」をクリック。
「キーの作成 (オプション)」では、「+キーを作成」 をクリック。
「キーのタイプ」を「JSON」として、「作成」
秘密鍵 が生成されダウンロードされるので、PC内の安全な場所に保存します。
Google Analytics での作業
Analytics にユーザーを追加して権限を設定
次に、Google Analytics を開きます。
左側のメニューの一覧から、「管理」 をクリックし、「ビュー」 → 「ユーザー管理」 をクリックします。
次に「+」 のアイコンをクリックし、「ユーザーを追加」 します。
「メールアドレス」に先程控えている「サービスアカウントID」 を入力します。
「権限」 は、「表示と分析」 にチェックを入れておいて下さい。
これで、Google Analytics に GCP のサービスアカウントが紐付けられました。
Java から Google Analytics API にアクセスしてみる
さあ、これであとは Java から接続してみるだけなんですが、ここから情報が錯綜してきます。
はじめてのアナリティクス API: サービス アカウント向け Java クイック スタート を見てみますが、なんか色々ややこしいですね。
pom.xml
Maven プロジェクトを作成し、色々ググって、これと思われるパッケージを dependency
に追加してやってみるのですが、どうも com.google.api.services
パッケージを含んでいる アーティファクトIDがわからず右往左往してしまいましたが、結局、
で解決。
上記サイトによると、結局なんやかんやとパッケージを入れるのではなく、次のパッケージだけで良いみたい。
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-analytics</artifactId>
<version>v3-rev161-1.25.0</version>
</dependency>
Java によるサンプルプログラム
そして、次のようなコードを実行すると、API を通してセッション数を取得することが出来ました。
先の developer.google.com のチュートリアルと比べると一部違う部分があります。
import java.io.FileInputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.analytics.Analytics;
import com.google.api.services.analytics.AnalyticsScopes;
import com.google.api.services.analytics.model.Accounts;
import com.google.api.services.analytics.model.GaData;
import com.google.api.services.analytics.model.Profiles;
import com.google.api.services.analytics.model.Webproperties;
/**
* サービスアカウントを使用して Google Analytics API にアクセスするシンプルな例
*/
public class HelloAnalytics {
private static final String APPLICATION_NAME = "Hello Analytics.";
private static final JsonFactory JSON_FACTORY = new JacksonFactory();
private static final String KEY_FILE_LOCATION = "<JSON ファイルへのパス>";
public static void main(String[] args) {
try {
Analytics analytics = initializeAnalytics();
String profile = getFirstProfileId(analytics);
System.out.println("First Profile Id: " + profile);
printResults(getResults(analytics, profile));
} catch (GeneralSecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Analytics サービスオブジェクトの初期化
*
* @return 認証された Analytics サービスオブジェクト
* @throws IOException
* @throws GeneralSecurityException
*/
@SuppressWarnings("resource")
private static Analytics initializeAnalytics()
throws GeneralSecurityException, IOException {
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
GoogleCredential credential = GoogleCredential
.fromStream(new FileInputStream(KEY_FILE_LOCATION))
.createScoped(AnalyticsScopes.all());
// Analytics サービスオブジェクトの構築
return new Analytics
.Builder(httpTransport, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME)
.build();
}
private static String getFirstProfileId(Analytics analytics) throws IOException {
// 認証されたユーザーの First view (profile) ID を取得します
String profileId = null;
// サービスアカウントに関連するすべてのアカウントの一覧を検索
Accounts accounts = analytics.management().accounts().list().execute();
if (accounts.getItems().isEmpty()) {
System.err.println("No accounts found");
} else {
String firstAccountId = accounts.getItems().get(0).getId();
// First Account に関連するプロパティの一覧を検索
Webproperties properties = analytics.management().webproperties()
.list(firstAccountId).execute();
if (properties.getItems().isEmpty()) {
System.err.println("No Webproperties found");
} else {
String firstWebpropertyId = properties.getItems().get(0).getId();
// プロパティに関連するビュー (プロファイル) の一覧を検索
Profiles profiles = analytics.management().profiles()
.list(firstAccountId, firstWebpropertyId).execute();
if (profiles.getItems().isEmpty()) {
System.err.println("No views (profiles) founde");
} else {
// プロパティに関連する最初の (ビュー) プロファイルを返す
profileId = profiles.getItems().get(0).getId();
}
}
}
return profileId;
}
private static GaData getResults(
Analytics analytics,
String profileId
) throws IOException {
// 過去7日間のセッション数の Core Reporting API を検索
return analytics.data().ga()
.get("ga:" + profileId, "7daysAgo", "today", "ga:sessions")
.execute();
}
private static void printResults(GaData results) {
// プロファイル名とセッション数を Core Reporting API からのレスポンスを解析
if (results != null && !results.getRows().isEmpty()) {
System.out.println("View (Profile) Name: "
+ results.getProfileInfo().getProfileName());
System.out.println("Total Sessions: "
+ results.getRows().get(0).get(0));
} else {
System.out.println("No results found");
}
}
}
実行結果
First Profile Id: 186197488
View (Profile) Name: すべてのウェブサイトのデータ
Total Sessions: 3260
ところがしかし・・
ところがしかし・・、どうやら Google Analytics API はすでに過去のバージョンとなっているみたいですね。
現在は、Analytics Reporting API を使用するみたいです。
確かに、API で Analytics を検索した時、従来の Analytics API と合わせて、Google Analytics Reporting API がある上、アイコンまで差し替わっているのはなんとなく嫌な予感がしていたのですが・・
この、Analytics Reporting API を使用したサンプルプログラムも動かしてみたのですが、それはまた次回にでも・・
参考サイト
0件のコメント