ある日、突然 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 にアクセスします。

ダッシュボードが開きます。

複数のプロジェクトがある場合、ここでプロジェクトを選択しておく必要があるかもしれません。

画面上部、「Google Cloud Platform」の右横のプロジェクト選択リストから利用したいプロジェクトを選択して下さい。

左上のハンバーガーメニューを開き、「IAM と管理」 → 「サービスアカウント」をクリックします。

 

IAM と管理からサービスアカウントを作成

+サービスアカウントを作成」をクリック。

IAMと管理 / サービスアカウントを追加

 

サービスアカウント名に適当な名前を入力します。

サービスアカウント名 を入力すると、「サービスアカウントID」 に、<サービスアカウント名>@<プロジェクト名>.iam.gserviceaccount.com という値が表示されます。これは、後に使用するので覚えるか控えるかしておいて下さい。

その後、「作成」をクリック。

Create Service account

サービスアカウントの作成

 

「サービスアカウントの権限(オプション)」は、そのままにして「続行」をクリック。

Permission of Service account.

サービスアカウントの権限

 

「キーの作成 (オプション)」では、「+キーを作成」 をクリック。

Create key

キーの作成

 

「キーのタイプ」を「JSON」として、「作成

Create json key

キーの作成 / JSON

秘密鍵 が生成されダウンロードされるので、PC内の安全な場所に保存します。

Secret key saved

秘密鍵がパソコンに保存されました

 

Google Analytics での作業

 

Analytics にユーザーを追加して権限を設定

次に、Google Analytics を開きます。

左側のメニューの一覧から、「管理」 をクリックし、「ビュー」 → 「ユーザー管理」 をクリックします。

Analytics / Management

アナリティクスの管理

 

次に「」 のアイコンをクリックし、「ユーザーを追加」 します。

User management

ユーザーを追加

 

「メールアドレス」に先程控えている「サービスアカウントID」 を入力します。

「権限」 は、「表示と分析」 にチェックを入れておいて下さい。

Add principal

ユーザーを追加

 

これで、Google Analytics に GCP のサービスアカウントが紐付けられました。

Result

結果

 

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 API 検索結果

analytics apis

この、Analytics Reporting API を使用したサンプルプログラムも動かしてみたのですが、それはまた次回にでも・・

参考サイト

 


 
記事を共有する

zaturendo

中小企業社内SE。

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。