我正在使用这个库:https ://github.com/googleapis/google-api-php-client
我创建了一个简单的 PHP 脚本,它从 Google Search Console / Webmaster Tools 中获取一些关于我拥有的域的性能的信息。
它无意代表访问该页面并拥有自己网站的用户进行认证。它旨在显示有关我的网站的信息,并通过固定服务帐户进行识别。下面更详细。
这是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 验证了其所有权。如您所见,我可以在 Web 界面中看到数据。
- 我授予对上述服务帐户电子邮件地址的完全访问权限
然而,当我尝试上面的脚本时,我得到了错误:
{ "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 拒绝使用在某个日期之后创建的属性。
注意:不要告诉我我需要所有者权限而不是完整权限。我已经尝试过了(你只能通过一个很难找到的旧界面来做到这一点)并且它没有任何区别。较旧的网站同时具有完全权限和所有者权限;较新的也不适用。