Search code examples
javascriptnode.jsgoogle-apiblogger

How to insert posts using blogger api nodejs


According to Docs, I have authenticated my app on request call and try to insert a post:

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');
            });
        }
    });
});

I am getting the token back and also it prints the call back success message but however, no post is inserted when I check the blog. There is no error either. What could be wrong here?

Update:

Actually google-blogger-api doesn't accept service account token. So modify my code to use oauth2.0 with node-passport but still getting login error:

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);
    }
});

I have passed the auth token but I get error like this now:

error  { [Error: Login Required]
  code: 401,
  errors:
   [ { domain: 'global',
       reason: 'required',
       message: 'Login Required',
       locationType: 'header',
       location: 'Authorization' } ] }

I am using official google blogger api. I guess I am not passing the token in the header. How do I properly pass the token to fix this issue?


Solution

  • It took so many days to properly figure this out using nodejs way (without using passportjs). Hope this helps.

    One more way posting to blogger API is as follows:

    Note: I am using nodejs with expressjs.

    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);
    

    Get Auth Client:

    function getOAuthClient() {
        return new OAuth2('client id', 'client secret', 'callback url');
    }
    

    Get Auth Url:

    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`
    }
    

    post to blogger inside callback:

    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);
            }
        });
    }
    

    The only problem is I am passing hard-coded values to post the blog in the callback. If anyone can help me out with that it would be great. Thanks