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>
所以我做了以下事情:
- 在 Google Cloud Console 中,我创建了一个项目并启用了 Google Search Console 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 云平台项目;它们不是“域”属性,而是基于 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-type 和 prefix-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:...
的名称。
我正在使用这个库: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>
所以我做了以下事情:
- 在 Google Cloud Console 中,我创建了一个项目并启用了 Google Search Console 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 云平台项目;它们不是“域”属性,而是基于 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-type 和 prefix-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:...
的名称。