Google Webmasters API для Java возвращает пустой список сайтов


Я написал простой код запроса списка сайтов, который использует Oauth с учетной записью сервиса на основе документации Google . Файл ключа аутентификации (.p12) используется действителен, как и счет.

Проблема в том, что метод списка сайтов возвращает пустой список.

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

Также, если я явно пытаюсь получить sitemaps проверенного сайта, вызывая

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

Я получил 403 запрещенных - " пользователь не имеет достаточного разрешения на сайт 'sample.site.com см. также: https://support.google.com/webmasters/answer/2451999 ." ошибка из API.

Согласно моей отладке, 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);
        }
    }
}

Что-нибудь не так с этим кодом?

1 8

1 ответ:

После некоторой отладки кода аутентификации Google Oauth, мой коллега обнаружил, что в моем коде нет ничего плохого, но есть определенная процедура, которой следует следовать в консоли Google Webmasters, о которой нигде не упоминается:

  • Вы должны предоставить "полное" разрешение на адрес электронной почты вашей учетной записи службы для каждого из ваших доменов. Если вы дали "право собственности" раньше, вы должны отменить это право собственности (потому что вы не можете изменить разрешение если вы даете право собственности, прежде чем дать разрешение).

  • Вы должны предоставить право собственности на адрес электронной почты вашей учетной записи службы.

Если вы сделаете это в неправильном порядке; ваш сайт не будет указан в списке sitemaps, и даже если вы явно попытаетесь получить sitemap вашего сайта по его адресу, вы получите ошибку аутентификации.

Вы должны предоставить разрешения и права собственности для каждого домена, к которому вы хотели бы получить доступ (даже просто для получения их имена).

Нет единого верхнего уровня контроля доступа для всех ваших сайтов.