Java:Search Console APIを使う、OAuth2編、その1
これは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);
}
}
}