我想执行示例中的代码:
require_once 'google-api-php-client/vendor/autoload.php';
$client = new Google_Client();
// service_account_file.json is the private key that you created for your service account.
$client->setAuthConfig('service_account_file.json');
$client->addScope('https://www.googleapis.com/auth/indexing');
// Get a Guzzle HTTP Client
$httpClient = $client->authorize();
$endpoint = 'https://indexing.googleapis.com/v3/urlNotifications:publish';
// Define contents here. The structure of the content is described in the next step.
$content = "{
\"url\": \"http://example.com/jobs/42\", //I used real url from my homepage
\"type\": \"URL_UPDATED\"
}";
$response = $httpClient->post($endpoint, [ 'body' => $content ]);
$status_code = $response->getStatusCode();
Run Code Online (Sandbox Code Playgroud)
但作为回应,我收到一个错误:403“权限被拒绝。无法验证 URL 所有权。”。
我正在致电google indexing API进行职位发布:
private $client;
private $httpClient;
public function initClient($kernel)
{
$this->client = new \Google_Client();
$this->client->setAuthConfig(JSON_KEY_HERE);
$this->client->addScope('https://www.googleapis.com/auth/indexing');
$this->httpClient = $this->client->authorize();
}
public function sendJob()
{
$endpoint = 'https://indexing.googleapis.com/v3/urlNotifications:publish';
$content = "{
\"url\": \"URL_HERE\",
\"type\": \"URL_UPDATED\"
}";
$response = $this->httpClient->post($endpoint, array('body' => $content));
}
Run Code Online (Sandbox Code Playgroud)
调用API时,给出的响应为'403-Forbidden'。
任何想法这个错误实际上意味着什么?我已经正确创建了服务帐户,但是无法从我的开发环境中复制成功。
php google-api symfony google-api-php-client google-indexing-api
我使用Nodejs与GoogleApis v35.0.0连接,告诉Google更新或删除Google索引中的网页.当我通过Google索引批量请求发送请求时,我陷入了multipart/mixed请求,多部分的主体.
我可以通过索引API文档向Google发送单独的页面更新请求.但由于Google每天最多200个请求的配额有限,我需要更新更多的URL.所以,我正在尝试使用谷歌索引批量请求,它可以分组最多100个单独的请求,它计为1个请求.
当我尝试按批次发送请求时,我遇到了正确的多部分正文格式问题.我正在使用GoogleApis的JWT(JSON Web Token),它从oauth2扩展到我的帐户身份验证并使用请求库v2.88.0将请求发送给Google.
由于请求库已经处理了多部分边界,这就是我不将其作为请求选项信息之一发送的原因.我还检查了请求npm库的multipart/mixed中的信息,但我只发现了一个类似但不相同的是multipart/related(https://github.com/request/request#multipartrelated).
根据Google的批量请求正文示例,我需要在主要请求中使用multipart/mixed作为内容类型:
POST /batch HTTP/1.1
Host: indexing.googleapis.com
Content-Length: content_length
Content-Type: multipart/mixed; boundary="===============7330845974216740156=="
Authorization: Bearer oauth2_token
--===============7330845974216740156==
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: <b29c5de2-0db4-490b-b421-6a51b598bd22+2>
POST /v3/urlNotifications:publish [1]
Content-Type: application/json
accept: application/json
content-length: 58
{ "url": "http://example.com/jobs/42", "type": "URL_UPDATED" }
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
return jwtClient.authorize(function(err, tokens) {
if (err) {
console.log(err);
return;
}
let options = {
url: 'https://indexing.googleapis.com/batch',
method: 'POST',
headers: {
'Content-Type': 'multipart/mixed'
},
auth: …Run Code Online (Sandbox Code Playgroud) multipart google-api node.js google-api-nodejs-client google-indexing-api
我尝试通过 Google Indexing API 发送 POST 请求,但不断收到 HTTP 错误 403(禁止)。
我的代码如下:
require_once '../google-api-php-client-2.2.2/vendor/autoload.php';
$client = new Google_Client();
$client->setDeveloperKey('xxxxxxxxxxxxxx');
$client->setAuthConfig('xxxxxxxxxxxxx.json');
$client->addScope('https://www.googleapis.com/auth/indexing');
$httpClient = $client->authorize();
$endpoint = 'https://indexing.googleapis.com/v3/urlNotifications:publish?key=xxxxxxxxxx';
$content = "{
\"url\": \"https://www.example.com/whatever.html\",
\"type\": \"URL_UPDATED\"
}";
$response = $httpClient->post($endpoint, [ 'body' => $content ]);
$status_code = $response->getStatusCode();
die('I am done...: ' . $status_code);
Run Code Online (Sandbox Code Playgroud)
我的完整回复如下:
GuzzleHttp\Psr7\Response Object
(
[reasonPhrase:GuzzleHttp\Psr7\Response:private] => Forbidden
[statusCode:GuzzleHttp\Psr7\Response:private] => 403
[headers:GuzzleHttp\Psr7\Response:private] => Array
(
[Vary] => Array
(
[0] => X-Origin
[1] => Referer
[2] => Origin,Accept-Encoding
)
[Content-Type] …Run Code Online (Sandbox Code Playgroud) 我正是处于这个问题中描述的中小企业的情况。该提问者找到的解决方案是
完全访问权限!== 所有者。我需要更好地阅读文档。
是的。我注意到我只能授予对服务帐户的完全访问权限。我一遍又一遍地阅读该文档,但找不到使我的服务帐户成为所有者的方法。那么可以和我一起阅读吗?(来源):
请按照建议的步骤验证您的财产所有权。
验证您的资源后,打开 Search Console。
单击您已验证的财产。
从已验证属性旁边的“设置”齿轮中选择“验证详细信息”。
在“已验证所有者”下,单击“添加所有者”。
将您的服务帐户电子邮件地址作为所有者添加到该资源。
广告 1:我很久以前就验证了我对相关财产的个人所有权(通过 HTML 文件和 DNS 记录,见下文)。
广告 2/3:在搜索控制台中,我可以从所有已验证属性的列表中“单击”所需的属性。
广告4:这一步很困难。我已验证的财产旁边没有设置装备。<nav>最接近的匹配是左侧垂直栏中的设置齿轮,大约位于属性选择下方的屏幕长度处。不过,没有什么可以从齿轮中“选择”的 - 它只是一个指向设置页面的普通旧链接https://search.google.com/search-console/settings?resource_id=sc-domain%3AXXXXXX
不管怎样,在这个设置页面上,我看到以下信息:“属性设置”部分包含三个项目:
还有一个“删除属性”按钮,接下来是有关索引爬虫的“关于”部分。顺便说一句,在“用户和权限”旁边的链接下,我能够将我的服务帐户添加为具有不受限制访问权限的用户 - 唉,据我们所知,这还不够;我对此用户唯一能做的就是再次撤销其权利。
可以认为与上述文档的步骤 4 远程相关的唯一剩余可能操作是点击“所有权验证”旁边的链接。不幸的是,这是一个死胡同:它列出了我的所有权验证的详细信息(使用的验证方法,可能的其他验证方法)。
广告 5:在我为第 4 点所做的所有尝试中,没有任何选项可以添加新的(委托)所有者,根本没有。
如果我只是授权所有者,而不是经过验证的所有者,那么缺乏添加新所有者的能力可能是可以解释的,对吧?但是,该页面显示我是经过验证的所有者,已通过 HTML 文件和 DNS 记录进行验证。
问:谁可以帮助我更好地阅读文档并为我的服务帐户授予足够的权限以允许其使用索引 API?
我已经浏览了所有其他线程,不幸的是他们仍然没有解决我的问题,所以我希望你能帮忙!我正在尝试通过 Google App Script 使用 Google 的索引 API。到目前为止,我已经:
循序渐进地遵循文档;创建了一个服务帐户,将我的应用程序脚本连接到我的 GC 项目,并将我的客户电子邮件添加为搜索控制台属性的所有者。
我还包含了我的应用程序脚本清单文件以包含以下 oauthScopes:
"oauthScopes": [
"https://www.googleapis.com/auth/indexing",
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/userinfo.email"
]
Run Code Online (Sandbox Code Playgroud)
我读过的大多数 403 错误都是通过将客户端电子邮件添加为 Search Console 属性的所有者来解决的,但就我而言,这并没有解决问题。如果需要,很乐意提供更多详细信息!:)
这是我的 Google App 脚本:
var Json = {
"private_key": "###",
"client_email": "###",
"client_id": "###",
"user_email": "###"
};
/**
* Authorizes and makes a request to the Google+ API.
*/
function run() {
var requestBody = {
"url":"http://testymctestface.com",
"type":"URL_UPDATED"
}
var options = {
'method': 'POST',
'contentType': 'application/json',
'headers': {
'Authorization': 'Bearer ' + …Run Code Online (Sandbox Code Playgroud) google-api google-apps-script google-oauth google-indexing-api