Google 网站管理员 API 用于 Java returns 空站点列表
Google Webmasters API for Java returns empty site list
我写了一个简单的站点列表查询代码,它使用 Oauth 和基于 Google 的 documentation 的 服务帐户 。正在使用的身份验证密钥文件 (.p12) 与帐户一样有效。
问题是站点列表方法 returns 是一个空列表。
service.sites().list().execute();
此外,如果我明确尝试通过调用
获取经过验证的站点的站点地图
service.sitemaps().list("my.sample.site.com").execute();
我从 API.
收到了 403 Forbidden - "User does not have sufficient permission for site 'sample.site.com'. See also: https://support.google.com/webmasters/answer/2451999." 错误
根据我的调试,API 完美加载密钥文件 (.p12) 并管理访问令牌等,没有任何问题。
然而我的服务帐户身份验证可能有问题。
依赖关系:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-webmasters</artifactId>
<version>v3-rev6-1.20.0</version>
</dependency>
示例代码:
package webmastertools;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
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.WebmastersScopes;
import com.google.api.services.webmasters.model.SitesListResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.File;
import java.util.Collections;
public class GoogleWebmastersClient {
static Log logger = LogFactory.getLog(GoogleWebmastersClient.class);
public static void main(String args[]) {
try {
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
String emailAddress = "012345789@developer.gserviceaccount.com";
String applicationName = "Sitemap Generator";
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(emailAddress)
.setServiceAccountPrivateKeyFromP12File(new File("/path/to/auth.p12"))
.setServiceAccountScopes(Collections.singletonList(WebmastersScopes.WEBMASTERS))
.build();
Webmasters service = new Webmasters.Builder(httpTransport, jsonFactory, credential)
.setApplicationName(applicationName)
.build();
SitesListResponse siteList = service.sites().list().execute();
if (siteList.isEmpty()) {
logger.info("Site list is empty!");
}
} catch (Exception e) {
logger.error("Exception: ", e);
}
}
}
这段代码有什么问题吗?
在对 Google 的 Oauth 身份验证代码进行一些调试后,我的一位同事发现我的代码没有任何问题,但在 Google Webmasters 应该遵循一定的程序顺便提一下的控制台:
您必须向您的每个域的服务帐户电子邮件地址授予 "full" 权限。如果你之前给了"ownership",你必须撤销那个所有权(因为在给权限之前给了所有权,你不能修改权限)。
您必须将所有权授予您的服务帐户电子邮件地址。
如果顺序错误;您的站点不会列在站点地图列表中,即使您明确尝试通过站点地址获取站点地图,您也会收到身份验证错误。
您必须为要访问的每个域提供权限和所有权(即使只是为了获取它们的名称)。
您的所有网站都没有单一的顶级访问控制。
我写了一个简单的站点列表查询代码,它使用 Oauth 和基于 Google 的 documentation 的 服务帐户 。正在使用的身份验证密钥文件 (.p12) 与帐户一样有效。
问题是站点列表方法 returns 是一个空列表。
service.sites().list().execute();
此外,如果我明确尝试通过调用
获取经过验证的站点的站点地图service.sitemaps().list("my.sample.site.com").execute();
我从 API.
收到了 403 Forbidden - "User does not have sufficient permission for site 'sample.site.com'. See also: https://support.google.com/webmasters/answer/2451999." 错误根据我的调试,API 完美加载密钥文件 (.p12) 并管理访问令牌等,没有任何问题。
然而我的服务帐户身份验证可能有问题。
依赖关系:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-webmasters</artifactId>
<version>v3-rev6-1.20.0</version>
</dependency>
示例代码:
package webmastertools;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
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.WebmastersScopes;
import com.google.api.services.webmasters.model.SitesListResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.File;
import java.util.Collections;
public class GoogleWebmastersClient {
static Log logger = LogFactory.getLog(GoogleWebmastersClient.class);
public static void main(String args[]) {
try {
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
String emailAddress = "012345789@developer.gserviceaccount.com";
String applicationName = "Sitemap Generator";
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(emailAddress)
.setServiceAccountPrivateKeyFromP12File(new File("/path/to/auth.p12"))
.setServiceAccountScopes(Collections.singletonList(WebmastersScopes.WEBMASTERS))
.build();
Webmasters service = new Webmasters.Builder(httpTransport, jsonFactory, credential)
.setApplicationName(applicationName)
.build();
SitesListResponse siteList = service.sites().list().execute();
if (siteList.isEmpty()) {
logger.info("Site list is empty!");
}
} catch (Exception e) {
logger.error("Exception: ", e);
}
}
}
这段代码有什么问题吗?
在对 Google 的 Oauth 身份验证代码进行一些调试后,我的一位同事发现我的代码没有任何问题,但在 Google Webmasters 应该遵循一定的程序顺便提一下的控制台:
您必须向您的每个域的服务帐户电子邮件地址授予 "full" 权限。如果你之前给了"ownership",你必须撤销那个所有权(因为在给权限之前给了所有权,你不能修改权限)。
您必须将所有权授予您的服务帐户电子邮件地址。
如果顺序错误;您的站点不会列在站点地图列表中,即使您明确尝试通过站点地址获取站点地图,您也会收到身份验证错误。
您必须为要访问的每个域提供权限和所有权(即使只是为了获取它们的名称)。
您的所有网站都没有单一的顶级访问控制。