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

2019年5月25日

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

JavaでGoogle Search Console APIを使い、アプリからSearch Consoleの「プライベート」データにアクセスしてみる。GoogleからJava用のライブラリが用意されている。

これを行うには、OAuth2.0クライアントIDが必要になる。この取得方法については、Google APIキーの取得方法を参照してほしい。

ダウンロードできるライブラリは古い

https://developers.google.com/webmaster-tools/search-console-api-original/v3/libraries#java

にJava用のライブラリがあるのだが、これは古くて使いものにならないので無視すること。

サンプルの実行

2019/5時点での「使える例」としては、Quickstart: Run a Search Console App in Javaだ。

この前提としては、Gradleの場合、以下の依存を入れる。

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

そして、サンプルのWebmastersCommandLineを起動すれば良いのだが、ただし、以下のCLIENT_ID,CLIENT_SECRETには、それぞれ適切なものを指定する。

つまり、OAuth2.0クライアントIDのIDとパスワード(シークレット)だ。


public class WebmastersCommandLine { private static String CLIENT_ID = "YOUR_CLIENT_ID"; private static String CLIENT_SECRET = "YOUR_CLIENT_SECRET";

サンプルを実行すると、

Please open the following URL in your browser then type the authorization code:
  https://accounts.google.com/o/oauth2/auth?access_type=on.............
Enter authorization code:

などというメッセージが表示されるので、このURLをブラウザに貼り付ける。すると、Googleでのログインを促され、ログインするアカウントを選択すると以下のようなメッセージが表示される。

ここで表示されるscutilとはGoogle APIキーの取得方法にて「アプリの名前」として指定した文字列だ。

このコードを先の「Enter authorization code:」のところに貼り付けると。

https://......com/
https://......site/
https://......online/
https://.........com/
https://.....tokyo/
http://.....com/
https://.....com/
sc-domain:.....com
sc-domain:.....com
sc-domain:.....com
sc-domain:.....com

などとSearch Consoleに登録されているドメインが表示される。

アクセストークンを取得する

ところで、先のサンプルにてURLをブラウザに貼り付けて取得したコードは、認可コード(Authorization Code)というもので、一度しか使用することはできない。

継続的にAPIを使うには、認可コードを使って取得されたアクセストークン(Access Token)を保持しておかなければならないのだが、なぜかこのサンプルで取得したアクセストークンを表示もせずに捨ててしまっている。

以下ではアクセストークンを使い回すようにサンプルを書き換えてみた。


import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.webmasters.Webmasters; import com.google.api.services.webmasters.model.SitesListResponse; import com.google.api.services.webmasters.model.WmxSite; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.ArrayList; import java.util.List; public class WebmastersCommandLine { private static String CLIENT_ID = "...."; private static String CLIENT_SECRET = "...."; 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 { 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); // アクセストークンを使う show(accessToken); Thread.sleep(1000); // もう一度使う show(accessToken); } private static void show(String accessToken) throws IOException { HttpTransport httpTransport = new NetHttpTransport(); JsonFactory jsonFactory = new JacksonFactory(); GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); // Create a new authorized API client Webmasters service = new Webmasters.Builder(httpTransport, jsonFactory, credential) .setApplicationName("WebmastersCommandLine") .build(); List<String> verifiedSites = new ArrayList<String>(); Webmasters.Sites.List request = service.sites().list(); // Get all sites that are verified 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); } // Print all verified sites for (String currentSite : verifiedSites) { System.out.println(currentSite); } } }