Google Webmasters API for Java返回空站点列表

我编写了一个简单的网站列表查询代码,该代码使用Oauth和基于Google 文档的 服务帐户 。 正在使用的身份validation密钥文件(.p12)以及帐户都是有效的。

问题是站点列表方法返回一个空列表。

service.sites().list().execute(); 

此外,如果我明确尝试通过调用获取经过validation的站点的站点地图

 service.sitemaps().list("my.sample.site.com").execute(); 

我收到了403 Forbidden – “用户没有足够的权限访问网站’sample.site.com’。另请参阅: https : //support.google.com/webmasters/answer/2451999 。” 来自API的错误。

根据我的调试,API完美地加载密钥文件(.p12)并管理访问令牌等没有问题。

尽管如此,我的服务帐户身份validation可能存在问题。

依赖关系:

  com.google.apis google-api-services-webmasters v3-rev6-1.20.0  

示例代码:

 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身份validation代码进行一些调试之后,我的一位同事发现我的代码没有任何问题,但是在Google网站管理员控制台上应该遵循某个程序,顺便提一下:

  • 您必须为每个域的服务帐户电子邮件地址授予“完全”权限。 如果您之前提供了“所有权”,则必须撤销该所有权(因为如果您在授予权限之前授予所有权,则无法修改权限)。

  • 您必须为您的服务帐户电子邮件地址授予所有权。

如果你这样做的顺序错误; 您的站点不会列在站点地图列表中,即使您明确尝试通过其地址获取站点的站点地图,您也会收到身份validation错误。

您必须为要访问的每个域授予权限和所有权(即使只是为了获取其名称)。

您的所有网站都没有单一的顶级访问控制。