谷歌API。未设置访问权限、刷新令牌、API 密钥或刷新处理程序回调

Álv*_*aro 11 javascript google-api node.js google-search-console

我正在尝试使用连接到谷歌搜索控制台APIOAuth2

const {google} = require('googleapis');

const auth = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

const searchconsole = google.webmasters({ version: 'v3', auth })

console.log(searchconsole.sites.list({}))
Run Code Online (Sandbox Code Playgroud)

但我明白了:

'Error: No access, refresh token, API key or refresh handler callback is set.'
Run Code Online (Sandbox Code Playgroud)

我找不到对此的可靠参考,我读到刷新令牌已被弃用,是否有可能从节点后端获取站点列表而无需与前端交互?

Nik*_*kic 2

这是 google api 的最佳参考站点: https://googleapis.dev/nodejs/googleapis/latest/tasks/index.html#samples

尝试这个 :

const {google} = require('googleapis');

const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// generate a url that asks permissions for webmaster ao any other google api scopes.

const scopes = [
  'https://www.googleapis.com/auth/webmaster'
];

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

Run Code Online (Sandbox Code Playgroud)

或者

尝试使用令牌:


const fs = require('fs');
const readline = require('readline');
const {google} = require('googleapis');

// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/webmasters'];
const TOKEN_PATH = 'token.json';

// Load client secrets from a local file.
fs.readFile('credentials.json', (err, content) => {
  if (err) return console.log('Error loading client secret file:', err);
  // Authorize a client with credentials, then call the Google Tasks API.
  authorize(JSON.parse(content), listConnectionNames);
});

function authorize(credentials, callback) {
  const {client_secret, client_id, redirect_uris} = credentials.installed;
  const oAuth2Client = new google.auth.OAuth2(
      client_id, client_secret, redirect_uris[0]);
  // Check if we have previously stored a token.
  fs.readFile(TOKEN_PATH, (err, token) => {
    if (err) return getNewToken(oAuth2Client, callback);
    oAuth2Client.setCredentials(JSON.parse(token));
    callback(oAuth2Client);
  });
}

function getNewToken(oAuth2Client, callback) {
  const authUrl = oAuth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: SCOPES,
  });
  console.log('Authorize this app by visiting this url:', authUrl);
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });
  rl.question('Enter the code from that page here: ', (code) => {
    rl.close();
    oAuth2Client.getToken(code, (err, token) => {
      if (err) return console.error('Error retrieving access token', err);
      oAuth2Client.setCredentials(token);
      // Store the token to disk for later program executions
      fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
        if (err) return console.error(err);
        console.log('Token stored to', TOKEN_PATH);
      });
      callback(oAuth2Client);
    });
  });
}

function listConnectionNames(auth) {
  const service = google.people({version: 'v1', auth});
  // ....

}

Run Code Online (Sandbox Code Playgroud)