Java:Search Console APIを使う、OAuth2編、その2



これはOauth2.0を使ったSearch Console APIへのアクセスだが、結局のところOAuth2.0は不要だということがわかった。Java:Search Console APIを使う、サービスアカウント編を参照してほしい。

Java:Search Console APIを使う、その1の続きである。

前回のまとめ

  • Search Consoleのプライベートデータにアクセスするには、OAuth2.0クライアントIDが必要なのでGoogle Cloud Platformにてこれを作成した。
  • GoogleのSearch Console APIサンプルを使用して、サイト一覧を取得できた。
  • サンプルを変更し、アクセストークンを表示させ、それを使い回すようにした。

さて、このアクセストークンを使い、どのようにサイト情報(検索パフォーマンスなど)を取得できるのだろうか?

また、アクセストークンは通常一時間程度しか存続しないのだという。これを存続させるにはどうしたら良いのか?

アクセストークンを使いまわす

アクセストークンの取得とそれを使ってのアクセスを分けてみる。

import java.io.*;
import java.util.*;

import com.google.api.client.googleapis.auth.oauth2.*;
import com.google.api.client.http.*;
import com.google.api.client.http.javanet.*;
import com.google.api.client.json.*;
import com.google.api.client.json.jackson2.*;

public class GetAccessToken {

  private static String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";
  private static String OAUTH_SCOPE = "https://www.googleapis.com/auth/webmasters.readonly";

  public static void main(String[] args) throws Exception {
    String CLIENT_ID = args[0];
    String CLIENT_SECRET = args[1];
    HttpTransport httpTransport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();

    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(OAUTH_SCOPE))
        .setAccessType("online")
        .setApprovalPrompt("auto").build();

    String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build();
    System.out.println("Please open the following URL in your browser then type the authorization code:");
    System.out.println("  " + url);
    System.out.println("Enter authorization code:");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String code = br.readLine();

    GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute();
    String accessToken = response.getAccessToken(); 
    System.out.println("accessToken:" + accessToken);
  }  
}
import java.io.*;
import java.util.*;

import com.google.api.client.googleapis.auth.oauth2.*;
import com.google.api.client.http.*;
import com.google.api.client.http.javanet.*;
import com.google.api.client.json.*;
import com.google.api.client.json.jackson2.*;
import com.google.api.services.webmasters.*;
import com.google.api.services.webmasters.Webmasters.Searchanalytics.*;
import com.google.api.services.webmasters.model.*;


public class GetInfo {

  final Webmasters service;

  GetInfo(String accessToken) {
    HttpTransport httpTransport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();    
    GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);        
    service = new Webmasters.Builder(httpTransport, jsonFactory, credential)
      .setApplicationName("WebmastersCommandLine")
      .build();
  }

  /** サイトのリスト */
  void siteList() throws IOException {
    List<String> verifiedSites = new ArrayList<String>();
    Webmasters.Sites.List request = service.sites().list();
    try {
      SitesListResponse siteList = request.execute();
      for (WmxSite currentSite : siteList.getSiteEntry()) {
        String permissionLevel = currentSite.getPermissionLevel();
        if (permissionLevel.equals("siteOwner")) {
          verifiedSites.add(currentSite.getSiteUrl());
        }
      }
    } catch (IOException e) {
      System.out.println("An error occurred: " + e);
    }
    for (String currentSite : verifiedSites) {
      System.out.println(currentSite);
    }
  }

  void searchPerform() throws IOException {

    // リクエスト内容を作成
    SearchAnalyticsQueryRequest req = new SearchAnalyticsQueryRequest();
    req.setStartDate("2019-05-23");
    req.setEndDate("2019-05-24");
    req.setDimensions(Arrays.asList(new String[] { "query" }));    

    // クエリを作成、実行して応答を得る
    Query query = service.searchanalytics().query("https://www.gwtcenter.com", req);
    SearchAnalyticsQueryResponse response = query.execute();

    response.getRows().forEach(System.out::println);    
  }

  /** コマンドライン第一引数としてアクセストークンを指定する */
  public static void main(String[]args) throws Exception {

    GetInfo getInfo = new GetInfo(args[0]);
    getInfo.siteList();
    Thread.sleep(1000);
    getInfo.searchPerform();
  }
}

以下のような結果が表示される(ごく一部)

{"clicks":2.0,"ctr":0.4,"impressions":5.0,"keys":["dhcp サーバ 確認"],"position":4.8}
{"clicks":2.0,"ctr":0.4,"impressions":5.0,"keys":["dhcp 割り当て 確認"],"position":1.0}
{"clicks":2.0,"ctr":1.0,"impressions":2.0,"keys":["dhcp 範囲 確認"],"position":1.0}
{"clicks":2.0,"ctr":0.6666666666666666,"impressions":3.0,"keys":["dhcp範囲"],"position":1.6666666666666665}
{"clicks":2.0,"ctr":0.021052631578947368,"impressions":95.0,"keys":["eclipse git"],"position":8.705263157894738}
{"clicks":2.0,"ctr":0.6666666666666666,"impressions":3.0,"keys":["eclipse git merge"],"position":4.333333333333334}
{"clicks":2.0,"ctr":0.2,"impressions":10.0,"keys":["eclipse gitlab"],"position":3.7}
{"clicks":2.0,"ctr":0.4,"impressions":5.0,"keys":["eclipse spotbugs"],"position":3.0}