首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用blogger api nodejs插入帖子

如何使用blogger api nodejs插入帖子
EN

Stack Overflow用户
提问于 2017-04-20 03:39:52
回答 3查看 2.5K关注 0票数 4

根据Docs,我已经在request call上验证了我的应用程序,并尝试插入一个帖子:

代码语言:javascript
复制
var blogger = google.blogger('v3');
app.post('/creatGoogleBloggerPost', function(req, res, next){
    console.log('creatGoogleBloggerPost called');
    var oauth2Client = new google.auth.OAuth2();
    var key = require('./public_html/SoulSeeker2-1bxxxaaa727d.json');
    var jwtClient;

    jwtClient = new google.auth.JWT(key.client_email, null, key.private_key, ['https://www.googleapis.com/auth/blogger'], null);
    jwtClient.authorize(function(err, tokens) {
        console.log('retrieved tokens.access_token from google', tokens.access_token);
        google.options({
            auth: jwtClient
        });
        if (err) {
            console.log(err);
            return;
        } else {
            blogger.posts.insert({
                auth: jwtClient,
                blogId: '4113791741191234135',
                resource: {
                  title: 'Sample rootscope',
                  content: 'Content rootscope'
                }
            }, function(){
                console.log('success');
            });
        }
    });
});

我正在取回令牌,它还会打印回调success message,但是,当我查看博客时,没有插入任何帖子。也没有错误。这里有什么问题吗?

更新:

实际上,google-blogger-api不接受服务帐户令牌。因此,修改我的代码,使其与node-passport一起使用node-passport,但仍然得到login error

代码语言:javascript
复制
blogger.posts.insert({
    Authorization: 'Bearer ' +USERS.accessToken,
    blogId: '4113796741591234135',
    resource: {
      title: 'Sample rootscope',
      content: 'Content rootscope'
    }
    }, function(err, reponse){
    if(err){
        console.log('error ', err);
    } else {
        console.log('blog post success in google blogger' , reponse);
    }
});

我已经通过了auth token,但是现在遇到了这样的错误:

代码语言:javascript
复制
error  { [Error: Login Required]
  code: 401,
  errors:
   [ { domain: 'global',
       reason: 'required',
       message: 'Login Required',
       locationType: 'header',
       location: 'Authorization' } ] }

我正在使用官方的google blogger api。我想我不会在标题中传递标记。如何正确传递令牌以解决此问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-18 11:24:52

使用nodejs方式(不使用passportjs)正确地解决这个问题花费了很多天的时间。希望这能有所帮助。

向blogger API发布的另一种方式如下:

注意:我使用的是带有高速公路的nodejs。

代码语言:javascript
复制
var express = require('express');
var app = express();
var request = require('request');
var rp = require('request-promise');

app.get('/creatGoogleBloggerPost', blogPost);
app.get("/auth/google/Bloggercallback", blogCallBack);

让Auth客户:

代码语言:javascript
复制
function getOAuthClient() {
    return new OAuth2('client id', 'client secret', 'callback url');
}

获取Auth Url:

代码语言:javascript
复制
function getAuthUrl() {
    var oauth2Client = getOAuthClient();
    var url = oauth2Client.generateAuthUrl({
        access_type: 'offline',
        scope: 'https://www.googleapis.com/auth/blogger'
    });
    return url;
}

function blogPost(req, res, next) {
    var params = {
        name: "sample",
        auth: getAuthUrl()
    };
    console.log('');
    console.log('=======================================================================');
    console.log('blogger api auth url: ', params);
    console.log('=======================================================================');
    console.log('');
    res.send(params.auth); //on the front-end view, I am doing window.location.replace to route `params.auth`
}

在回调中向blogger发布:

代码语言:javascript
复制
function blogCallBack(req, res, next) {

    var oauth2Client = getOAuthClient();
    var code = req.query.code;
    oauth2Client.getToken(code, function (err, tokens) {

        if (!err) {
            oauth2Client.setCredentials(tokens);
            console.log('');
            console.log('===============================================================');
            console.log('BloggerAPI Callback....');
            console.log('Success Getting BloggerAPI Token', tokens);
            console.log('===============================================================');
            console.log('');

            var params = {
                title: 'Sample title',
                content: 'Sample Content'
            };

            var options = {
                uri: 'https://www.googleapis.com/blogger/v3/blogs/1939594269984333602/posts/',
                method: 'POST',
                body: params,
                headers: {
                    'User-Agent': 'Request-Promise',
                    "Authorization": 'Bearer ' + tokens.access_token
                },
                json: true // Automatically parses the JSON string in the response
            };

            rp(options)
            .then(function (response) {
                console.log('=================================');
                console.log('=================================');
                console.log("RESPONSE.STATUSCODE: ", res.statusCode);
                console.log('=================================');
                console.log('=================================');
                if (res.statusCode >= 100 && res.statusCode < 600)
                    return res.redirect('/');
                else
                    return res.status(500);
            })
            .catch(function (err) {
                console.log('=================================');
                console.log('=================================');
                console.log('POST error ', err.stack);
                console.log('=================================');
                console.log('=================================');
                return res.status(res.statusCode).send(err);
            });

        } else {
            console.log('Error Getting BloggerAPI Token', err);
        }
    });
}

唯一的问题是,我正在传递硬编码的值,以便在回调中发布博客。如果有人能帮我解决这个问题,那就太好了。谢谢

票数 0
EN

Stack Overflow用户

发布于 2017-04-23 13:42:37

实际的问题是我不能传递原始的access token,我需要这样包装它:

代码语言:javascript
复制
authObj = new  google.auth.OAuth2();
authObj.setCredentials({
    access_token: USERS.accessToken
});   

上面的“包装部分”显然不是为blogger-api记录的。

然后在下面的调用中传递它,就像在auth:authObj中一样

代码语言:javascript
复制
blogger.posts.insert({
    auth: authObj,
    blogId: '4113796741591234135',
    resource: {
      title: 'Sample rootscope',
      content: 'Content rootscope'
    }
    }, function(err, reponse){
    if(err){
        console.log('error ', err);
    } else {
        console.log('blog post success in google blogger' , reponse);
    }
});
票数 4
EN

Stack Overflow用户

发布于 2017-04-23 13:36:45

你的问题是令牌,就像你需要加密它一样。

代码语言:javascript
复制
blogger.posts.insert({
    Authorization: 'Bearer ' + btoa(USERS.accessToken),
    blogId: '4113796741591234135',
    resource: {
      title: 'Sample rootscope',
      content: 'Content rootscope'
    }
    }, function(err, reponse){
    if(err){
        console.log('error ', err);
    } else {
        console.log('blog post success in google blogger' , reponse);
    }
});
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43509803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档