Java:Search Console APIを使う、サービスアカウント編

2019年5月27日

Java:Search Console APIを使う、OAuth2編、その1Java:Search Console APIを使う、OAuth2編、その2を既に書いたのだが、OAuth2よりもサービスアカウントを使った方が簡単ということに気がついたので書き直すことにする。

準備

まずは、プロジェクトを作成し、サービスアカウントを作成する。これは以下に書いた。

※上では例としてAnalyticsを取り上げているがSearch Consoleもほぼ同じようなものだ。

この時点で、

  • GCPのプロジェクトを作成した。
  • その中にサービスアカウントを作成した。自動でそのメアドが作成された。
  • サービスアカウントキーを作成し、これをJSONファイルの形で取得した。

その上で、以下を行う。

  • GCPプロジェクトにてSearch Console APIを有効化する。
  • Search Consoleに先のメアドを登録する。
  • JavaプログラムでJSONキーファイルを使用する。

GCPプロジェクトでSearch Console APIを有効化する

わざわざ「有効化」しなければならない理由としては、APIによっては課金制のものもあるからと思われる。ともあれ、プロジェクト内で有効化しないと使えない。

Search Consoleにメアドを追加する

このサービスアカウントという仮想個人のメアドを追加し、この個人がデータ閲覧できるようにする。

https://search.google.com/search-consoleに行き、対象とするウェブサイトを選択する。

※当然だが、ウェブサイトごとに閲覧可能とするメアドを登録することになる。

権限としては「フル」と「制限付き」の二種類しか無いのだが、とりあえず「フル」にしたみた。

ヘルプには以下の記述がある。

フルユーザー: すべてのデータに対する表示権限を持ち、一部の操作を実行できます。
制限付きユーザー: ほとんどのデータに対する表示権限を持ちます。

Javaプログラムを作成しJSONキーファイルを使用する

Graldleの場合、以下の依存を入れる。2019/5/25時点での最新だ。

  compile group: 'com.google.apis', name: 'google-api-services-webmasters', version: 'v3-rev35-1.25.0'

プログラムとして以下のようなものだ。ただし、KEY_FILE_LOCATIONにはJSONキーファイルを指定する。

“https://www.gwtcenter.com”の部分は対象とするウェブサイトを指定する。


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 GetInfo2 { private static final String KEY_FILE_LOCATION = "....."; final Webmasters service; GetInfo2() throws IOException { HttpTransport httpTransport = new NetHttpTransport(); JsonFactory jsonFactory = new JacksonFactory(); GoogleCredential credential = GoogleCredential .fromStream(new FileInputStream(KEY_FILE_LOCATION)) .createScoped(WebmastersScopes.all()) ; 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-04-23"); req.setEndDate("2019-04-23"); 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 { GetInfo2 getInfo = new GetInfo2(); getInfo.siteList(); getInfo.searchPerform(); } }

実行すると、サイトリストに続き、指定日の検索クエリデータが表示される。例えば以下のようなものだ。

{"clicks":0.0,"ctr":0.0,"impressions":1.0,"keys":["gradle buildship"],"position":8.0}
{"clicks":0.0,"ctr":0.0,"impressions":1.0,"keys":["gradle buildship 3"],"position":9.0}
{"clicks":0.0,"ctr":0.0,"impressions":3.0,"keys":["gradle classpath"],"position":9.333333333333334}
{"clicks":0.0,"ctr":0.0,"impressions":1.0,"keys":["gradle cleaneclipse"],"position":4.0}
{"clicks":0.0,"ctr":0.0,"impressions":3.0,"keys":["gradle compile"],"position":8.666666666666668}
{"clicks":0.0,"ctr":0.0,"impressions":1.0,"keys":["gradle compile runtime 違い"],"position":1.0}