Google 网站站长工具 API - 无法获得我拥有的域的权限

Google Webmaster Tools API - can't obtain permissions for a domain I own

我正在使用这个库:https://github.com/googleapis/google-api-php-client

我创建了一个简单的 PHP 脚本,它从 Google Search Console/网站站长工具中获取一些关于我拥有的域的性能的信息。

它无意代表访问该页面并拥有自己网站的用户进行身份验证。它旨在显示有关 MY 网站的信息,并通过固定服务帐户进行识别。下面有更多详细信息。

这是 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 云平台项目;它们不是“域”属性,而是基于 url 前缀的属性,即以 https:// 或纯 http:// 开头的属性,有或没有 www.,并且它们仅使用正确的协议和正确的 www 前缀或缺少前缀。在这些文件中,您可以通过上传具有 Google 给定路径和名称的文件来验证所有权。但是,我尝试为我要开始工作的较新域创建一个类似的 属性,但这也不起作用。

这几乎就像 Google 的 api 拒绝使用在特定日期之后创建的属性。

注意:不要告诉我我需要所有者权限而不是完整权限。我已经尝试过了(你只能通过一个很难找到的旧界面来做)并且它没有任何区别。较旧的网站同时具有完全权限和所有者权限;较新的两者都不适用。

我在这里找到了答案: Webmasters API User does not have sufficient permission for site (MartijnvdB 的回答,以防特定答案的深度 link 中断)。

我需要改变这个:

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

对此:

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

有两种类型的 Google Search Console 属性:domain-typeprefix-type。对于域类型属性,您需要将 属性 的名称作为 https://www.example.com 传递(使用 http 或 https,有或没有与 属性 的确切前缀匹配的 www)。对于基于域的属性,您需要将其作为 sc-domain:example.com.

传递

我试过只使用 example.com,没有任何前缀,但没有用。我不知道为什么 API 不能只接受它并在需要时添加 sc-domain:

PHP 库 没有任何文档,并且 API 本身的文档也非常糟糕,就像 [=49] 一样=] APIs.

一旦您已经知道答案,您可以在此处找到它的记录:

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

siteUrl string The URL of the property as defined in Search Console. Examples: http://www.example.com/ (for a URL-prefix property) or sc-domain:example.com (for a Domain property)

请注意,它说 “如 Search Console 中所定义”。以用户身份浏览 Search Console 时,您永远不会在任何地方看到 属性 作为 sc-domain:... 的名称。