我正在尝试通过JavaScript V3 API访问Blogger。如果我尝试访问我的(公共)测试博客,那么一切都按预期工作。
如果我使用相同的代码但尝试访问我的(私人)测试博客,则会收到错误。
以下是我的代码
var client_id = ['WWWW', 'XXXX'];
var api_key = ['YYYY','ZZZZ'];
var discoveryDocs = ['https://www.googleapis.com/discovery/v1/apis/blogger/v3/rest'];
var scope = 'https://www.googleapis.com/auth/blogger.readonly';
var blog_id = ['BLOG0', 'BLOG1'];
var appendResults = function(results) {
$('#results').append(JSON.stringify(results, undefined, 2) + '<hr/>');
};
getBlogs = function(client, key, blog) {
gapi.client.init({
'apiKey': key,
'clientId': client,
'discoveryDocs': discoveryDocs,
'scope': scope
}).then(function() {
return gapi.client.blogger.posts.list({
'blogId': blog
});
}).then(function(d) {
return d;
}).then(function(response) {
appendResults(response);
}, function(reason) {
appendResults(reason);
});
};
gapi.load('client', function() {
for(i=0; i<api_key.length; i++) {
getBlogs(client_id[i], api_key[i], blog_id[i]);
}
});
api_key和blog_id中的第二个元素是我的私人博客。
以下是我的回复
{
"result": {
"kind": "blogger#postList",
"items": [
{
"kind": "blogger#post",
"id": "XXXX",
"blog": {
"id": "XXXX"
},
"published": "XXXX",
"updated": "XXXX",
"etag": "\"XXXX\"",
"url": "http://XXXX/2017/03/blog-post.html",
"selfLink": "https://www.googleapis.com/blogger/v3/blogs/XXXX/posts/XXXX",
"title": "",
"content": "XXXX",
"author": {
"id": "XXXX",
"displayName": "XXXX",
"url": "https://www.blogger.com/profile/XXXX",
"image": {
"url": "XXXX"
}
},
"replies": {
"totalItems": "0",
"selfLink": "XXXX"
}
}
],
"etag": "\"XXXX\""
},
"body": "{\n \"kind\": \"blogger#postList\",\n \"items\": [\n {\n \"kind\": \"blogger#post\",\n \"id\": \"XXXX\",\n \"blog\": {\n \"id\": \"639440130428294175\"\n },\n \"published\": \"XXXX\",\n \"updated\": \"XXXX\",\n \"etag\": \"\\\"XXXX\\\"\",\n \"url\": \"http://XXXX/2017/03/blog-post.html\",\n \"selfLink\": \"https://www.googleapis.com/blogger/v3/blogs/XXXX/posts/XXXX\",\n \"title\": \"\",\n \"content\": \"XXXX\",\n \"author\": {\n \"id\": \"XXXX\",\n \"displayName\": \"XXXX\",\n \"url\": \"https://www.blogger.com/profile/XXXX\",\n \"image\": {\n \"url\": \"XXXX\"\n }\n },\n \"replies\": {\n \"totalItems\": \"0\",\n \"selfLink\": \"https://www.googleapis.com/blogger/v3/blogs/XXXX/posts/XXXX/comments\"\n }\n }\n ],\n \"etag\": \"\\\"XXXX\\\"\"\n}\n",
"headers": {
"date": "XXXX",
"content-encoding": "gzip",
"vary": "Origin, X-Origin",
"content-length": "576",
"pragma": "no-cache",
"server": "GSE",
"etag": "\"XXXX\"",
"content-type": "application/json; charset=UTF-8",
"cache-control": "no-cache, no-store, max-age=0, must-revalidate",
"expires": "XXXX"
},
"status": 200,
"statusText": null
}
和
{
"result": {
"error": {
"errors": [
{
"domain": "global",
"reason": "invalid",
"message": "We're sorry, but the requested resource could not be found."
}
],
"code": 400,
"message": "We're sorry, but the requested resource could not be found."
}
},
"body": "{\n \"error\": {\n \"errors\": [\n {\n \"domain\": \"global\",\n \"reason\": \"invalid\",\n \"message\": \"We're sorry, but the requested resource could not be found.\"\n }\n ],\n \"code\": 400,\n \"message\": \"We're sorry, but the requested resource could not be found.\"\n }\n}\n",
"headers": {
"date": "XXXX",
"content-encoding": "gzip",
"vary": "Origin, X-Origin",
"content-length": "160",
"server": "GSE",
"content-type": "application/json; charset=UTF-8",
"cache-control": "private, max-age=0",
"expires": "XXXX"
},
"status": 400,
"statusText": null
}
我在开发者控制台中设置了凭据。我通过localhost:5000访问它,我在开发人员控制台中将localhost设置为有效域。
我能想到的唯一可能是线索的是
"result": {
"error": {
"errors": [
{
"domain": "global",
"reason": "invalid",
"message": "We're sorry, but the requested resource could not be found."
}
],
"code": 400,
"message": "We're sorry, but the requested resource could not be found."
}
这可能告诉我,我的请求来源无效,但我不能肯定地说。
如果我将同一个(私人)博客公开并重新执行,则此代码适用于两个博客ID。
我哪里错了?
答案 0 :(得分:0)
Blogger API要求您的应用在访问私人博客上的信息时具有OAuth 2.0令牌(请参阅documentation here)。仅使用API密钥不会使请求有效。
如果帖子位于私有博客上,则需要Authorization。如果帖子位于公开的博客上,则可以在未经授权的情况下调用此方法。
此外,使用OAuth令牌时范围也不同 -
测试此API以下是Blogger API的OAuth 2.0范围信息:
https://www.googleapis.com/auth/blogger
要使用OAuth 2.0请求访问权限,您的应用程序需要范围信息以及Google在申请注册期间提供的信息(例如 作为客户端ID和/或客户端秘密)。