Я использую эту библиотеку: 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>
Поэтому я сделал следующее:
Это сгенерировало файл JSON, который я загружаю из кода PHP выше.
чье право собственности я проверил через 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 отказался работать со свойствами, созданными после определенной даты.
ПРИМЕЧАНИЕ. Не говорите мне, что мне нужны права владельца, а не полные. Я уже пробовал это (что вы можете сделать только через старый интерфейс, который чертовски трудно найти), и это не имеет никакого значения. Старые веб-сайты работают как с полными разрешениями, так и с правами владельца; новый тоже не работает.
Я нашел ответ здесь: Пользователь 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:...
.