简体   繁体   English

Google网站管理员NodeJs API了解响应

[英]Google Webmasters NodeJs API Understanding Response

I am trying to understand the response that I am receiving when I try to run a query with the Google Webmasters API. 我试图了解当我尝试使用Google网站站点API运行查询时收到的响应。 I am not getting an error as the console.log is returning null , but I receive Not Found for the res parameter, which makes it seem like something is off with the params object that I am passing to the query method. 我没有收到错误,因为console.log返回null ,但是我收到了res参数的Not Found ,这使得看起来像我正在传递给查询方法的params对象。 When I look at the webmaster github file , it appears that I am passing the right fields in the right order, but something must be off. 当我查看webmaster github文件时 ,似乎我按正确的顺序传递了正确的字段,但必须关闭一些东西。 Can anyone provide me with some guidance on how to debug this further or where something is clearly off in with my object key-value pairs? 任何人都可以向我提供一些关于如何进一步调试或者使用我的对象键值对明显关闭的指导吗?

Here is my console: 这是我的控制台:

This is the error: null
This is the response: Not Found

Here is code for the question: 这是问题的代码:

/**
 * Lists the search query results
 *
 * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
 */
function keywordQuery(auth) {
    console.log("This is the auth token" + auth);
    var webmasters = google.webmasters('v3');
    var params = {
        auth: auth,
        siteUrl: 'http://www.test-site.com/',
        resource: {
            'startDate': '2016-11-01',
            'endDate': '2016-11-30',
            'dimensions': ['query']
        }
    };
    var metrics = {};

    var query = webmasters.searchanalytics.query(params, function(err, res){
            console.log('This is the error: ' + err);
            console.log('This is the response: ' + res);
    });
}

Here is my full code: 这是我的完整代码:

var fs = require('fs');
var readline = require('readline');
var google = require('googleapis');
var googleAuth = require('google-auth-library');

// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/drive-nodejs-quickstart.json
var SCOPES = ['https://www.googleapis.com/auth/webmasters.readonly'];
var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH ||
    process.env.USERPROFILE) + '/.credentials/';
var TOKEN_PATH = TOKEN_DIR + 'webmasters-nodejs-creds.json';

// Load client secrets from a local file.
fs.readFile('client_secret.json', function processClientSecrets(err, content) {
  if (err) {
    console.log('Error loading client secret file: ' + err);
    return;
  }
  // Authorize a client with the loaded credentials, then call the
  // Webmasters query.
  authorize(JSON.parse(content), keywordQuery);
});

/**
 * Create an OAuth2 client with the given credentials, and then execute the
 * given callback function.
 *
 * @param {Object} credentials The authorization client credentials.
 * @param {function} callback The callback to call with the authorized client.
 */
function authorize(credentials, callback) {
  var clientSecret = credentials.installed.client_secret;
  var clientId = credentials.installed.client_id;
  var redirectUrl = credentials.installed.redirect_uris[0];
  var auth = new googleAuth();
  var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);

  // Check if we have previously stored a token.
  fs.readFile(TOKEN_PATH, function(err, token) {
    if (err) {
      getNewToken(oauth2Client, callback);
    } else {
      oauth2Client.credentials = JSON.parse(token);
      callback(oauth2Client);
    }
  });
}

/**
 * Get and store new token after prompting for user authorization, and then
 * execute the given callback with the authorized OAuth2 client.
 *
 * @param {google.auth.OAuth2} oauth2Client The OAuth2 client to get token for.
 * @param {getEventsCallback} callback The callback to call with the authorized
 *     client.
 */
function getNewToken(oauth2Client, callback) {
  var authUrl = oauth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: SCOPES
  });
  console.log('Authorize this app by visiting this url: ', authUrl);
  var rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
  rl.question('Enter the code from that page here: ', function(code) {
    rl.close();
    oauth2Client.getToken(code, function(err, token) {
      if (err) {
        console.log('Error while trying to retrieve access token', err);
        return;
      }
      oauth2Client.credentials = token;
      storeToken(token);
      callback(oauth2Client);
    });
  });
}

/**
 * Store token to disk be used in later program executions.
 *
 * @param {Object} token The token to store to disk.
 */
function storeToken(token) {
  try {
    fs.mkdirSync(TOKEN_DIR);
  } catch (err) {
    if (err.code != 'EEXIST') {
      throw err;
    }
  }
  fs.writeFile(TOKEN_PATH, JSON.stringify(token));
  console.log('Token stored to ' + TOKEN_PATH);
}


/**
 * Lists the search query results
 *
 * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
 */
function keywordQuery(auth) {
    console.log("This is the auth token" + auth);
    var webmasters = google.webmasters('v3');
    var params = {
        auth: auth,
        siteUrl: 'http://www.test-site.com/',
        resource: {
            'startDate': '2016-11-01',
            'endDate': '2016-11-30',
            'dimensions': ['query']
        }
    };
    var metrics = {};

    var query = webmasters.searchanalytics.query(params, function(err, res){
            console.log('This is the error: ' + err);
            console.log('This is the response: ' + res);
    });
}

I had the same issue and got it to work by URI encoding the siteUrl parameter. 我遇到了同样的问题,并通过编码siteUrl参数的URI来使用它。

    siteUrl: encodeURIComponent('http://www.test-site.com')

instead of 代替

    siteUrl: 'http://www.test-site.com/'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM