无法使用服务帐户查询 Google Search Console API
Unable to query Google Search Console API using a Service Account
我需要使用服务帐户从 Google Search Console(网站站长工具)中检索一些数据。
到目前为止,我已经能够为我需要附加到请求的 url 的服务帐户检索 access_token
。问题是我找不到这样做的方法,这是我正在使用的代码:
function retrieveSearchesByQuery(token)
{
gapi.client.webmasters.searchanalytics.query(
{
'access_token': token,
'siteUrl': 'http://www.WEBSITE.com',
'fields': 'responseAggregationType,rows',
'resource': {
'startDate': formatDate(cSDate),
'endDate': formatDate(cEDate),
'dimensions': [
'date'
]
}
})
.then(function(response) {
console.log(response);
})
.then(null, function(err) {
console.log(err);
});
}
这是函数调用的url:
https://content.googleapis.com/webmasters/v3/sites/http%3A%2F%2Fwww.WEBSITE.com/searchAnalytics/query?fields=responseAggregationType%2Crows&alt=json"
应该是这样的:
https://content.googleapis.com/webmasters/v3/sites/http%3A%2F%2Fwww.WEBSITE.com/searchAnalytics/query?fields=responseAggregationType%2Crows&alt=json&access_token=XXX"
gapi.client.webmasters.searchanalytics.query
无法将 'access_token'
识别为有效密钥,因此它不会将其附加到 url,这就是为什么我得到 401 Unauthorized
作为响应。
如果我使用 'key'
而不是 'access_token'
,参数将附加到 url 但 'key'
用于 OAuth2
身份验证,因此服务帐户我传递的令牌无效。
有人对此有解决方案或解决方法吗?
如果您的应用程序请求私人数据,则该请求必须由有权访问该数据的经过身份验证的用户授权。正如 Search Console API 的 the documentation 中所指定的,您的应用程序必须使用 OAuth 2.0 来授权请求。不支持其他授权协议。
如果您的应用程序是 correctly configured, when using the Google API, an authenticated request looks exactly like an unauthenticated request. As stated in the documentation,如果应用程序已收到 OAuth 2.0 令牌,JavaScript 客户端库会自动将其包含在请求中。
您提到您已检索到一个 access_token
,如果正确接收,API 客户端将自动为您发送此令牌,您不必自己附加它。
一个非常基本的身份验证工作流程,一旦通过身份验证,发送请求将类似于以下代码。 Search Console API 可以使用以下范围:https://www.googleapis.com/auth/webmasters
和 https://www.googleapis.com/auth/webmasters.readonly
。
var clientId = 'YOUR CLIENT ID';
var apiKey = 'YOUR API KEY';
var scopes = 'https://www.googleapis.com/auth/webmasters';
function auth() {
// Set the API key.
gapi.client.setApiKey(apiKey);
// Start the auth process using our client ID & the required scopes.
gapi.auth2.init({
client_id: clientId,
scope: scopes
})
.then(function () {
// We're authenticated, let's go...
// Load the webmasters API, then query the API
gapi.client.load('webmasters', 'v3')
.then(retrieveSearchesByQuery);
});
}
// Load the API client and auth library
gapi.load('client:auth2', auth);
此时,您的 retrieveSearchesByQuery
函数需要修改,因为它不再需要通过参数获取标记来在查询中传递它。 JavaScript 客户端库应自动将其包含在请求中。
您还可以使用 API Explorer 检查特定查询支持的参数并检查关联的请求。
如果您需要使用外部生成的访问令牌(服务帐户应该属于这种情况),您需要自己为应用程序使用gapi.auth.setToken
method to sets the OAuth 2.0 token object:
gapi.auth.setToken(token_Object);
我需要使用服务帐户从 Google Search Console(网站站长工具)中检索一些数据。
到目前为止,我已经能够为我需要附加到请求的 url 的服务帐户检索 access_token
。问题是我找不到这样做的方法,这是我正在使用的代码:
function retrieveSearchesByQuery(token)
{
gapi.client.webmasters.searchanalytics.query(
{
'access_token': token,
'siteUrl': 'http://www.WEBSITE.com',
'fields': 'responseAggregationType,rows',
'resource': {
'startDate': formatDate(cSDate),
'endDate': formatDate(cEDate),
'dimensions': [
'date'
]
}
})
.then(function(response) {
console.log(response);
})
.then(null, function(err) {
console.log(err);
});
}
这是函数调用的url:
https://content.googleapis.com/webmasters/v3/sites/http%3A%2F%2Fwww.WEBSITE.com/searchAnalytics/query?fields=responseAggregationType%2Crows&alt=json"
应该是这样的:
https://content.googleapis.com/webmasters/v3/sites/http%3A%2F%2Fwww.WEBSITE.com/searchAnalytics/query?fields=responseAggregationType%2Crows&alt=json&access_token=XXX"
gapi.client.webmasters.searchanalytics.query
无法将 'access_token'
识别为有效密钥,因此它不会将其附加到 url,这就是为什么我得到 401 Unauthorized
作为响应。
如果我使用 'key'
而不是 'access_token'
,参数将附加到 url 但 'key'
用于 OAuth2
身份验证,因此服务帐户我传递的令牌无效。
有人对此有解决方案或解决方法吗?
如果您的应用程序请求私人数据,则该请求必须由有权访问该数据的经过身份验证的用户授权。正如 Search Console API 的 the documentation 中所指定的,您的应用程序必须使用 OAuth 2.0 来授权请求。不支持其他授权协议。
如果您的应用程序是 correctly configured, when using the Google API, an authenticated request looks exactly like an unauthenticated request. As stated in the documentation,如果应用程序已收到 OAuth 2.0 令牌,JavaScript 客户端库会自动将其包含在请求中。
您提到您已检索到一个 access_token
,如果正确接收,API 客户端将自动为您发送此令牌,您不必自己附加它。
一个非常基本的身份验证工作流程,一旦通过身份验证,发送请求将类似于以下代码。 Search Console API 可以使用以下范围:https://www.googleapis.com/auth/webmasters
和 https://www.googleapis.com/auth/webmasters.readonly
。
var clientId = 'YOUR CLIENT ID';
var apiKey = 'YOUR API KEY';
var scopes = 'https://www.googleapis.com/auth/webmasters';
function auth() {
// Set the API key.
gapi.client.setApiKey(apiKey);
// Start the auth process using our client ID & the required scopes.
gapi.auth2.init({
client_id: clientId,
scope: scopes
})
.then(function () {
// We're authenticated, let's go...
// Load the webmasters API, then query the API
gapi.client.load('webmasters', 'v3')
.then(retrieveSearchesByQuery);
});
}
// Load the API client and auth library
gapi.load('client:auth2', auth);
此时,您的 retrieveSearchesByQuery
函数需要修改,因为它不再需要通过参数获取标记来在查询中传递它。 JavaScript 客户端库应自动将其包含在请求中。
您还可以使用 API Explorer 检查特定查询支持的参数并检查关联的请求。
如果您需要使用外部生成的访问令牌(服务帐户应该属于这种情况),您需要自己为应用程序使用gapi.auth.setToken
method to sets the OAuth 2.0 token object:
gapi.auth.setToken(token_Object);