2

I am going to use the Nodejs google api client(google-api-nodejs-client) to post a photo to my google+. (I have listed all my code at end of this post.)

Let me introduce a little bit background:

  • I have created a project on: console.developers.google.com

  • I have enabled google+ domain API for this project.

  • I have created credentials for this project as well. (it is a OAuth 2.0 client ID)

  • I have a little bit experience of using the client (google-api-nodejs-client) and I can post images and files to my google drive by it.

However, posting to google+ photo is different, the auth is the key different. I have tried several different ways, but none of them works.

The api always return me this:

{ [Error: Forbidden]
  code: 403,
  errors: [ { domain: 'global', reason: 'forbidden', message: 'Forbidden' } ]     }

I also found this:

Warning: The Google+ Sign-In button and the plus.login scope used by Google+ Sign-In, are not currently supported for use with the Google+ Domains API. Requests that are made to the Google+ Domains API using an authentication token granted for the www.googleapis.com/auth/plus.login scope, or generated by the Google+ Sign-In button, will fail.

If it doesn't support the sign-button, what does it support?

This page tell me to add a domain delegation (https://developers.google.com/+/domains/authentication/delegation), but i haven't push my program into any server, i just try to run it locally.

I was wondering if it is possible to use this client to post photo to google+ by run a nodejs program locally?

var CLIENT_ID = "xxxxxxx.apps.googleusercontent.com";
var CLIENT_SECRET = "xxxxxxxx";
var REDIRECT_URL = "https://xxxxxxx";

var readline = require('readline');
var async = require('async');
var google = require('googleapis');
var request = require('request');

var OAuth2 = google.auth.OAuth2;
var oauth2Client = new OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL);

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

function getAccessToken (oauth2Client, callback) {
  // generate consent page url
    var scopes = [
    'https://www.googleapis.com/auth/plus.me',
    'https://www.googleapis.com/auth/plus.stream.read',
    'https://www.googleapis.com/auth/plus.stream.write',
    'https://www.googleapis.com/auth/plus.circles.read',
    'https://www.googleapis.com/auth/plus.circles.write',
    'https://www.googleapis.com/auth/plus.media.upload'
    ];

    var url = oauth2Client.generateAuthUrl({
      access_type: 'offline', // 'online' (default) or 'offline' (gets refresh_token)
      scope: scopes, // If you only need one scope you can pass it as string,
      key: 'p7UALH460Deqodhvb2zESYya'
    });

  console.log('Visit the url: ', url);
  rl.question('Enter the code here:', function (code) {
    // request access token
    oauth2Client.getToken(code, function (err, tokens) {
      if (err) {
        return callback(err);
      }
      // set tokens to the client
      // TODO: tokens should be set by OAuth2 client.
      oauth2Client.setCredentials(tokens);
      console.dir(tokens);

      callback();
    });
  });
}

getAccessToken(oauth2Client, function () {

    var plusDomains = google.plusDomains({ version: 'v1', auth: oauth2Client });

    var requestObj = request({url:'http://asset1.cxnmarksandspencer.com/is/image/mands/2643f540b32fe8c6cccdec95b3a2c5239166232f?$editorial_430x430$'});
    const Readable = require('stream').Readable;
    var iamgeStream = new Readable().wrap(requestObj);

    plusDomains.media.insert({
      userId: 'me',
      collection: 'cloud',
      resource: {
        name: 'testimage.png',
        mimeType: 'image/png'
      },
      media: {
        mimeType: 'image/png',
        body: iamgeStream 
      },
      access:{domainRestricted :"true"}
    }, callbackFn);

    function callbackFn(argument) {
        console.dir(argument);
    }

});

Thanks you very much! Peter

peter
  • 21
  • 4

0 Answers0