当前位置: 首页 > 知识库问答 >
问题:

谷歌网站管理员工具API-无法获得我拥有的域的权限

胡鸿羲
2023-03-14

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

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

它不打算代表访问页面并拥有自己网站的用户进行自动身份验证。它旨在显示关于我的网站的信息,并通过固定的服务号进行标识。下面更详细。

下面是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>

因此,我做了以下工作:

  • 在谷歌云控制台中,我创建了一个项目,并启用了谷歌搜索控制台API和旧版API,以防万一:

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

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

这生成了一个JSON文件,这是我从上面的PHP代码加载的文件。

  • 在谷歌搜索控制台中,我有一个域属性

我通过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" } ] } }

显然,链接的帮助中心页面没有帮助。

我对其他六个网站做了完全相同的事情,都有完全相同的程序,有相同的项目,服务帐户和凭据,它适用于大多数网站。

我所能看到的唯一区别是,在我创建谷歌云平台项目之前,工作的属性已经存在多年;它们不是“域”属性,而是基于url前缀的属性,即以https://或纯http://开头的属性,无论是否带有www,它们都只能使用正确的协议和正确的www前缀。在这种情况下,你可以通过上传一个带有谷歌提供给你的路径和名称的文件来验证所有权。但是,我尝试为我正在尝试使用的新域创建这样的属性,但这也不起作用。

这就好像谷歌的api拒绝处理某个日期后创建的属性一样。

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

共有1个答案

袁何平
2023-03-14

我在这里找到了答案:网站管理员API用户没有足够的网站权限(MartijnvdB的答案,以防特定答案的深层链接中断)。

我需要改变这一点:

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

为此:

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

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

我尝试过只使用example.com而不使用任何前缀,但没有效果。我不知道为什么API不能接受这一点,并在需要时预先设置sc域:

PHP库没有任何文档,API本身的文档也难以置信地糟糕,就像谷歌API的常见情况一样。

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

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

siteUrl字符串在搜索控制台中定义的属性的URL。示例:http://www.example.com/ (对于URL前缀属性)或sc-domain:example.com(对于域属性)

请注意,上面写着“如搜索控制台中定义的那样”。当以用户身份浏览搜索控制台时,您永远不会在任何地方看到属性的名称为sc-域:...

 类似资料:
  • 我正试图从谷歌网站管理员工具中获取我的公司注册的公司列表。我使用PHP和用于PHP的GoogleAPI客户端库来实现这一点(https://developers.google.com/api-client-library/php/). 我已经做了所有的事情,除了结果是它给了我一个空数组。我的代码如下,任何帮助都将不胜感激。 为客户端id、帐户等填写适当的值,并且所有内容都进行了适当的身份验证,因为

  • 有没有人能提供一个例子或链接,说明如何从谷歌网站管理员工具API导出? 存储库中没有示例,似乎任何地方都没有可用的教程/示例 https://github.com/google/google-api-php-client 此代码连接到网站管理员工具。。如何从特定日期间隔下载?

  • 我一直有一个问题与网站管理员工具API。我试图让脚本没有用户交互,并获得我需要的信息。我有谷歌分析与服务帐户,但这是不支持的网站管理员工具。 我目前正在尝试使用API服务器密钥,但当我尝试查询API返回时: 代码403:“用户没有足够的网站权限” 然而,我是我试图查询的网站的所有者。我已经检查了www.google.com/webmasters/tools/home,网站已经验证。 所以我在问我的

  • 我使用以下代码从搜索控制台获取我的网站的统计数据: 我使用google服务帐户来授权api调用,但它给了我一个错误: 呼叫POST时出错https://www.googleapis.com/webmasters/v3/sites/http://www.example.com//searchAnalytics/query: (403)用户没有足够的权限访问站点“http*:///www.exampl

  • 我使用GoogleAPI php客户端库访问网站管理员工具数据。当我想列出网站地图时,它出现了致命错误:未捕获的异常“Google\u Service\u exception”(403)用户没有足够的网站权限。另见:https://support.google.com/webmasters/answer/2451999.'我将服务帐户电子邮件地址添加为我网站的限制用户,但错误仍然存在。 最后我找到

  • 我已经得到了分析工作的代码,以便它能够查询谷歌分析,并带回结果,但是当我试图使用代码查询网站管理员工具时,它会返回权限不足。 支持谷歌的API包括:分析API、谷歌搜索控制台API 我有什么遗漏吗? 谷歌分析代码: 网站管理员工具代码: 网站管理员工具错误消息: