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}