openplanning

Liệt kê, thêm và xoá các Sites với Google Search Java API

  1. Các yêu cầu đòi hỏi
  2. Liệt kê các Sites
  3. Xem thông tin một Site cụ thể
  4. Thêm một Site
  5. Xoá một Site
Như bạn biết, trong Google Search Console bạn cần phải khai báo các Sites mà bạn sở hữu, chúng được gọi là các tài sản (properties).
Có 2 loại tài sản:
Property Type
Description
Domain
Kiểu tài sản này là một tên miền mà bạn sở hữu. Sau khi được xác minh nó sẽ được theo dõi (track) bởi Google Search Console. Tất cả các tên miền bao gồm cả các tên miền phụ, với tất cả các giao thức (HTTP hay HTTPS) đều được nó theo dõi.
  • siteId: sc-domain:langlearning.net
  • siteId: sc-domain:foo.com
URL Prefix
Tài sản này là một phần của một website được chỉ định bởi một tiếp đầu ngữ, chẳng hạn:
  • siteId: http://www.bar.com/
  • siteId: https://langlearning.net/app/en/
  • siteId: https://foo.com/article/
Google Search Console chỉ theo dõi (track) các URLs phù hợp với tiếp đầu ngữ của tài sản này.
Trong bài viết này tôi sẽ hướng dẫn bạn sử dụng Google Search Console Java API để liệt kê, thêm và xoá các Sites trên Google Search Console.

1. Các yêu cầu đòi hỏi

Các yêu cầu đòi hỏi để làm việc với Google Search Java API được đề cập trong bài viết dưới đây. Bài viết này cũng đề cập các cách khác nhau để tạo đối tượng HttpRequestInitializer (Với API Key, OAuth Client Id hoặc Service Account).
Một lớp tiện ích để tạo đối tượng HttpRequestInitializer, đối tượng này cung cấp thông tin xác thực (credentials) cho các request mỗi khi chúng được gửi tới Google:
MyUtils.java
package org.o7planning.googleapis.utils;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.FileUtils;

import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.json.JsonObjectParser;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.util.ObjectParser;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.ServiceAccountCredentials;

public class MyUtils {

	public static final String SERVICE_ACCOUNT_FILE_PATH = "/Volumes/New/_gsc/test-google-search-console-key.json";

	private static byte[] serviceAccountBytes;

	public static HttpRequestInitializer createHttpRequestInitializer(String... scopes) throws IOException {
		InputStream serviceAccountInputStream = getServiceAccountInputStream();

		GoogleCredentials credentials = ServiceAccountCredentials //
				.fromStream(serviceAccountInputStream) //
				.createScoped(scopes);

		HttpRequestInitializer requestInitializer = new HttpRequestInitializer() {

			@Override
			public void initialize(HttpRequest request) throws IOException {
				HttpCredentialsAdapter adapter = new HttpCredentialsAdapter(credentials);
				adapter.initialize(request);
				//
				if (request.getParser() == null) {
					ObjectParser parser = new JsonObjectParser(GsonFactory.getDefaultInstance());
					request.setParser(parser);
				}
				//
				request.setConnectTimeout(60000); // 1 minute connect timeout
				request.setReadTimeout(60000); // 1 minute read timeout
			}

		};
		return requestInitializer;
	}

	public static synchronized InputStream getServiceAccountInputStream() throws IOException {
		if (serviceAccountBytes == null) {
			serviceAccountBytes = FileUtils.readFileToByteArray(new File(SERVICE_ACCOUNT_FILE_PATH));
		}
		return new ByteArrayInputStream(serviceAccountBytes);
	}
}
Một lớp tiện ích để tạo đối tượng SearchConsole.Sites, một đối tượng quan trọng có liên quan tới tất cả các ví dụ trong bài viết này.
MySiteUtils.java
package org.o7planning.googleapis.a14299.site;

import java.io.IOException;
import java.security.GeneralSecurityException;

import org.o7planning.googleapis.utils.MyUtils;

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.searchconsole.v1.SearchConsole;
import com.google.api.services.searchconsole.v1.SearchConsoleScopes;

public class MySiteUtils {

	private static final String APPLICATION_NAME = "My-Application";

	public static SearchConsole.Sites getSitesClient(String applicationName) //
			throws IOException, GeneralSecurityException {
		//
		// @scopes: WEBMASTERS or WEBMASTERS_READONLY
		//
		HttpRequestInitializer httpRequestInitializer = MyUtils
				.createHttpRequestInitializer(SearchConsoleScopes.WEBMASTERS);

		//
		HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

		SearchConsole client = new SearchConsole.Builder( //
				httpTransport, GsonFactory.getDefaultInstance(), httpRequestInitializer) //
				.setApplicationName(applicationName) //
				.build();

		SearchConsole.Sites siteClient = client.sites();
		return siteClient;
	}

	public static SearchConsole.Sites getSitesClient() //
			throws IOException, GeneralSecurityException {
		return getSitesClient(APPLICATION_NAME);
	}
}

2. Liệt kê các Sites

Liệt kê tất cả các Sites đã được thêm vào Google Search Console của bạn, chúng bao gồm cả các Sites chưa được xác minh.
ListSiteExample.java
package org.o7planning.googleapis.a14299.site;

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.List;

import com.google.api.services.searchconsole.v1.SearchConsole;
import com.google.api.services.searchconsole.v1.model.SitesListResponse;
import com.google.api.services.searchconsole.v1.model.WmxSite;

public class ListSiteExample {

	public static void main(String[] args) throws IOException, GeneralSecurityException {
		SearchConsole.Sites siteClient = MySiteUtils.getSitesClient();

		SearchConsole.Sites.List listRequest = siteClient.list();

		SitesListResponse listResponse = listRequest.execute();

		System.out.println("Sites.List Response: " + listResponse.toPrettyString());

		List<WmxSite> siteList = listResponse.getSiteEntry();

		for (WmxSite site : siteList) {
			System.out.println("\n- permissionLevel: " + site.getPermissionLevel());
			System.out.println("- siteUrl: " + site.getSiteUrl());
		}
	}
}
Output:
Sites.List Response: {
  "siteEntry": [
    {
      "permissionLevel": "siteOwner",
      "siteUrl": "https://www.langlearning.net/"
    }, 
    {
      "permissionLevel": "siteOwner",
      "siteUrl": "sc-domain:langlearning.net"
    },
    {
      "permissionLevel": "siteOwner",
      "siteUrl": "https://langlearning.net/"
    }
  ]
}

- permissionLevel: siteOwner
- siteUrl: https://www.langlearning.net/ 

- permissionLevel: siteOwner
- siteUrl: sc-domain:langlearning.net

- permissionLevel: siteOwner
- siteUrl: https://langlearning.net/

3. Xem thông tin một Site cụ thể

Ví dụ, lấy thông tin của một Site cụ thể, trong đó bao gồm cả quyền (permission) của bạn đối với Site này.
Các giá trị có thể của permissionLevel:
  • "siteFullUser"
  • "siteOwner"
  • "siteRestrictedUser"
  • "siteUnverifiedUser"
GetSiteExample.java
package org.o7planning.googleapis.a14299.site;

import java.io.IOException;
import java.security.GeneralSecurityException;

import org.o7planning.googleapis.MyTestConstants;

import com.google.api.services.searchconsole.v1.SearchConsole;
import com.google.api.services.searchconsole.v1.model.WmxSite;

public class GetSiteExample {

	private static void getOneSiteInfo(String siteId) throws IOException, GeneralSecurityException {
		SearchConsole.Sites siteClient = MySiteUtils.getSitesClient();

		SearchConsole.Sites.Get getRequest = siteClient.get(siteId);

		WmxSite site = getRequest.execute();

		System.out.println("\nSite: " + site.toPrettyString());

		System.out.println("- permissionLevel: " + site.getPermissionLevel());
		System.out.println("- siteUrl: " + site.getSiteUrl());
	}

	public static void main(String[] args) throws IOException, GeneralSecurityException {
		//
		// @siteUrl:
		// https://langlearning.net/ (Needs suffix "/") (for a URL-prefix property)
		// sc-domain:langlearning.net (for a Domain property)
		//
		getOneSiteInfo(MyTestConstants.siteUrl);
	}
}
Output:
Site: {
  "permissionLevel": "siteOwner",
  "siteUrl": "https://langlearning.net/"
}
- permissionLevel: siteOwner
- siteUrl: https://langlearning.net/

4. Thêm một Site

Tiếp theo, trong phần này chúng ta sẽ sử dụng Google Search API để thêm một Site vào Google Search Console. Trong một số trường hợp chúng sẽ tự động được xác minh, chẳng hạn:
  • langlearning.net (Sc Domain property) Verified!
  • ---> https://langlearning.net/app/en/ (URL Prefix property) verified.
  • ---> http://www.langlearning.net/ (URL Prefix property) verified.
Hoặc:
  • http://www.langlearning.net (URL Prefix property) Verified!
  • ---> http://www.langlearning.net/app/en/ (URL Prefix property) Verified!
Chú ý: Google Search API không hỗ trợ việc xác minh một Site, nếu bạn quan tâm tới điều này hãy sử dụng Google Site Verification API.
  • Java Google Site Verification API
AddSiteExample.java
package org.o7planning.googleapis.a14299.site;

import java.io.IOException;
import java.security.GeneralSecurityException;

import org.o7planning.googleapis.MyTestConstants;

import com.google.api.services.searchconsole.v1.SearchConsole;

public class AddSiteExample {

	//
	// @siteUrl:
	// https://langlearning.net/ (Needs suffix "/") (for a URL-prefix property)
	// https://sub1.bar.com/ (Needs suffix "/") (for a URL-prefix property)
	// sc-domain:foo.com (for a Domain property)
	//
	private static void addSite(String siteUrl) throws IOException, GeneralSecurityException {
		SearchConsole.Sites siteClient = MySiteUtils.getSitesClient();

		SearchConsole.Sites.Add addRequest = siteClient.add(siteUrl);

		addRequest.execute();
		System.out.println("Done!");
	}

	public static void main(String[] args) throws IOException, GeneralSecurityException {
		//
		// @siteUrl: sc-domain:bar.com
		// @siteUrl: http://www.bar.com/
		//
		addSite(MyTestConstants.siteUrlToAdd1);
	}
}

5. Xoá một Site

Ví dụ, xoá một Site:
DeleteSiteExample.java
package org.o7planning.googleapis.a14299.site;

import java.io.IOException;
import java.security.GeneralSecurityException;

import com.google.api.services.searchconsole.v1.SearchConsole;

public class DeleteSiteExample {

	private static void deleteSite(String siteId) throws IOException, GeneralSecurityException {
		SearchConsole.Sites siteClient = MySiteUtils.getSitesClient();

		SearchConsole.Sites.Delete deleteRequest = siteClient.delete(siteId);
		deleteRequest.execute();
		System.out.println("Done!");
	}

	public static void main(String[] args) throws IOException, GeneralSecurityException {
		// @siteUrl:
		// https://langlearning.net/ (Needs suffix "/") (for a URL-prefix property)
		// https://sub1.bar.com/ (Needs suffix "/") (for a URL-prefix property)
		// sc-domain:foo.com (for a Domain property)
		//
		String siteId = "https://www.langlearning.net/";

		deleteSite(siteId);
	}
}