API инструментов Google для веб-мастеров — не удается получить разрешения для принадлежащего мне домена

Я использую эту библиотеку: https://github.com/googleapis/google-api-php-client

Я создал простой PHP-скрипт, который получает некоторую информацию из Google Search Console/Инструментов для веб-мастеров о производительности домена, которым я владею.

Он не предназначен для аутентификации от имени пользователя, который посещает страницу и владеет собственным веб-сайтом. Он предназначен для отображения информации о МОЕМ веб-сайте и идентифицируется с помощью фиксированной учетной записи службы. Подробнее ниже.

Вот PHP-код:

<!DOCTYPE html>
<html>
<head>
<title>Google Webmaster Tools test</title>
</head>
<body>
<?php
ini_set('display_errors', true);
error_reporting(E_ALL);

require_once ('./path/to/the/autoload.php');

echo "Instantiating client<br>";

$client = new Google_Client(); 

$credentials = file_get_contents ('./test_search_console_credentials.json', true) ; 

echo "Configuring client<br>";

$client->setAuthConfig(json_decode($credentials,true));

$client->setScopes(['https://www.googleapis.com/auth/webmasters.readonly']);

$client->setAccessType('offline');

echo "Instantiating Webmasters service <br>";

$service = new Google_Service_Webmasters($client); 


$query = new \Google_Service_Webmasters_SearchAnalyticsQueryRequest();
 
$date_now = date('Y-m-d');
$date_past = date('Y-m-d', time()-3600*24*30);


$query->setStartDate($date_past);
$query->setEndDate($date_now);
$query->setDimensions(['page','query']);
$query->setSearchType('web');


$pfilter=new \Google_Service_Webmasters_ApiDimensionFilter();
$pfilter->setDimension('page');
$pfilter->setOperator('equals');
$pfilter->setExpression('https://example.com/');


$fgroup= new Google_Service_Webmasters_ApiDimensionFilterGroup();
$fgroup->setFilters([$pfilter]);

$query->setDimensionFilterGroups([$fgroup]);

try {
    $u = $service->searchanalytics->query('https://example.com', $query); 
    echo '<table border=1>';
    echo '<tr>
        <th>#</th><th>Clicks</th><th>CTR</th><th>Imp</th><th>Page</th><th>KEYword</th><th>Avg. pos</th>';
        for ($i = 0; $i < count($u->rows); $i++) {
        echo "<tr><td>$i</td>";
        echo "<td>{$u->rows[$i]->clicks}</td>";
        echo "<td>{$u->rows[$i]->ctr}</td>";
        echo "<td>{$u->rows[$i]->impressions}</td>";
        echo "<td>{$u->rows[$i]->keys[0]}</td>";
        echo "<td>{$u->rows[$i]->keys[1]}</td>";
        echo "<td>{$u->rows[$i]->position}</td>";
        echo "</tr>";
        }             
    echo '</table>';
    } catch(\Exception $e ) {
    echo $e->getMessage();
    }  
?>


</body>
</html>

Поэтому я сделал следующее:

  • В Google Cloud Console я создал проект и на всякий случай включил API Google Search Console, а также Legacy:

  • Я создал учетную запись службы для проекта:

  • Для служебной учетной записи я создал ключ:

Это сгенерировало файл JSON, который я загружаю из кода PHP выше.

  • В Google Search Console у меня есть свойство домена

чье право собственности я проверил через DNS. Как видите, я вижу данные в веб-интерфейсе.

  • Я предоставил доступ к адресу электронной почты вышеупомянутой учетной записи службы с ПОЛНЫМ доступом

Тем не менее, когда я пробую скрипт выше, я получаю сообщение об ошибке:

{ "error": { "code": 403, "message": "User does not have sufficient permission for site 'https://********.com'. See also: https://support.google.com/webmasters/answer/2451999.", "errors": [ { "message": "User does not have sufficient permission for site 'https://*******.com'. See also: https://support.google.com/webmasters/answer/2451999.", "domain": "global", "reason": "forbidden" } ] } }

Очевидно, что связанная страница Справочного центра не помогает.

Я сделал то же самое с полдюжиной других веб-сайтов, все с той же процедурой, с тем же проектом, учетной записью службы и учетными данными, и это работает с большинством из них.

Единственная разница, которую я вижу между свойствами, с которыми он работает, и теми, с которыми он не работает, заключается в том, что те, которые работают, — это свойства, которые существовали годами, задолго до того, как я даже создал проект Google Cloud Platform; и это были не «доменные» свойства, а свойства, основанные на префиксе URL, то есть свойства, которые либо начинаются с https://, либо с простого http://, либо с www, либо без него, и они работают только с правильный протокол и правильный префикс www или его отсутствие. И в них вы подтверждаете право собственности, загружая файл с заданным путем и именем, которые дает вам Google. Однако я попытался создать подобное свойство для нового домена, который я пытаюсь заставить работать, и это тоже не работает.

Как будто API Google отказался работать со свойствами, созданными после определенной даты.

ПРИМЕЧАНИЕ. Не говорите мне, что мне нужны права владельца, а не полные. Я уже пробовал это (что вы можете сделать только через старый интерфейс, который чертовски трудно найти), и это не имеет никакого значения. Старые веб-сайты работают как с полными разрешениями, так и с правами владельца; новый тоже не работает.

Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout.
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout.
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для...
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
1
0
1 038
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел ответ здесь: Пользователь Webmasters API не имеет достаточных прав для сайта (Ответ MartijnvdB на случай, если глубокая ссылка на конкретный ответ сломается).

Мне нужно было изменить это:

$u = $service->searchanalytics->query('https://example.com', $query);

к этому:

$u = $service->searchanalytics->query('sc-domain:example.com', $query);

Существует два типа свойств Google Search Console: тип домена и тип префикса. Для свойств доменного типа вам необходимо передать имя свойства как https://www.example.com (с http или https, с префиксом www или без него, соответствующим точному префиксу свойства). Для свойств на основе домена вам необходимо передать его как sc-domain:example.com.

Я пробовал просто example.com без префикса, но это не сработало. Я не знаю, почему API не может просто принять это и добавить sc-domain:, когда это необходимо.

Библиотека PHP вообще не имеет документации, и документация самого API тоже невероятно бедна, как обычно для API Google.

Если вы уже знаете ответ, вы можете найти его здесь:

https://developers.google.com/webmaster-tools/search-console-api-original/v3/searchanalytics/query

siteUrl string URL-адрес ресурса, определенный в Search Console. Примеры: http://www.example.com/ (для свойства с префиксом URL) или sc-domain:example.com (для свойства домена).

Обратите внимание, что там написано «как определено в Search Console». При просмотре Search Console в качестве пользователя вы никогда нигде не увидите имя свойства как sc-domain:....

Другие вопросы по теме