【问题标题】:Google Webmaster Tools API - can't obtain permissions for a domain I ownGoogle Webmaster Tools API - 无法获得我拥有的域的权限
【发布时间】:2021-03-29 07:56:45
【问题描述】:

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

我创建了一个简单的 PHP 脚本,它从 Google 搜索控制台/网站管理员工具中获取一些关于我拥有的域的性能的信息。

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

这是 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 中,我创建了一个项目,并启用了 Google Search Console API 和旧版 API,以防万一:

  • 我为该项目创建了一个服务帐号

  • 对于服务帐户,我创建了一个密钥:

生成了一个 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 为您提供的给定路径和名称的文件来验证所有权。但是,我尝试为我要开始工作的较新域创建一个类似的属性,但这也不起作用。

就好像 Google 的 api 拒绝使用在某个日期之后创建的属性。

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

【问题讨论】:

    标签: php google-cloud-platform google-search-console google-api-webmasters


    【解决方案1】:

    我在这里找到了答案: Webmasters API User does not have sufficient permission for site (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 本身的文档也非常糟糕,就像 Google API 一样。

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

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

    siteUrl 字符串 Search Console 中定义的属性的 URL。示例:http://www.example.com/(用于 URL 前缀属性)或 sc-domain:example.com(用于域属性)

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

    【讨论】: