Error: No access, refresh token or API key is set
Error: No access, refresh token or API key is set
我正在尝试在 Node 中制作一个应用程序来访问我的 google 日历,所以我按照 https://developers.google.com/calendar/quickstart/nodejs 中的步骤操作,但我得到 Error: Error: No access, refresh token or API key is set.
.
是的,我已经创建了凭据。
是的,我已经下载了 json,重命名为 client_secret.json 并添加到应用程序文件夹。
代码如下:
const fs = require('fs');
const readline = require('readline');
const {google} = require('googleapis');
const OAuth2Client = google.auth.OAuth2;
const SCOPES = ['https://www.googleapis.com/auth/calendar.readonly'];
const TOKEN_PATH = './client_secret.json';
try {
const content = fs.readFileSync('client_secret.json');
authorize(JSON.parse(content), listEvents);
} catch (err) {
return console.log('Error loading client secret file:', err);
}
function authorize(credentials, callback) {
const {client_secret, client_id, redirect_uris} = credentials.installed;
let token = {};
const oAuth2Client = new OAuth2Client(client_id, client_secret, redirect_uris[0]);
// Check if we have previously stored a token.
try {
token = fs.readFileSync(TOKEN_PATH);
} catch (err) {
return getAccessToken(oAuth2Client, callback);
}
oAuth2Client.setCredentials(JSON.parse(token));
callback(oAuth2Client);
}
function getAccessToken(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 callback(err);
oAuth2Client.setCredentials(token);
// Store the token to disk for later program executions
try {
fs.writeFileSync(TOKEN_PATH, JSON.stringify(token));
console.log('Token stored to', TOKEN_PATH);
} catch (err) {
console.error(err);
}
callback(oAuth2Client);
});
});
}
function listEvents(auth) {
const calendar = google.calendar({version: 'v3', auth});
calendar.events.list({
calendarId: 'primary',
timeMin: (new Date()).toISOString(),
maxResults: 10,
singleEvents: true,
orderBy: 'startTime', }, (err, {data}) => {
if (err) return console.log('The API returned an error: ' + err);
const events = data.items;
if (events.length) {
console.log('Upcoming 10 events:');
events.map((event, i) => {
const start = event.start.dateTime || event.start.date;
console.log(`${start} - ${event.summary}`);
});
} else {
console.log('No upcoming events found.');
}
});
}
有什么想法吗?
能否再次确认以下几点?
const TOKEN_PATH = './client_secret.json';
和const content = fs.readFileSync('client_secret.json');
的文件是一样的。
- 请将
const TOKEN_PATH = './client_secret.json';
修改为const TOKEN_PATH = './credentials.json';
,再修改运行。
- 这样,您下载的
client_secret.json
可能已经被覆盖了。所以也请确认一下。
- 如果进行了上述修改仍出现错误,请确认googleapis的版本。因为据报道,googleapis 具有 v25.0.0 - v30.0.0。某些 API 有一些错误。
- 如果您认为错误是bug,请将googleapis的版本修改为v24.0.0。错误可能会被删除。
参考资料:
如果这些要点对您的情况没有帮助,我很抱歉。
我正在尝试在 Node 中制作一个应用程序来访问我的 google 日历,所以我按照 https://developers.google.com/calendar/quickstart/nodejs 中的步骤操作,但我得到 Error: Error: No access, refresh token or API key is set.
.
是的,我已经创建了凭据。
是的,我已经下载了 json,重命名为 client_secret.json 并添加到应用程序文件夹。
代码如下:
const fs = require('fs');
const readline = require('readline');
const {google} = require('googleapis');
const OAuth2Client = google.auth.OAuth2;
const SCOPES = ['https://www.googleapis.com/auth/calendar.readonly'];
const TOKEN_PATH = './client_secret.json';
try {
const content = fs.readFileSync('client_secret.json');
authorize(JSON.parse(content), listEvents);
} catch (err) {
return console.log('Error loading client secret file:', err);
}
function authorize(credentials, callback) {
const {client_secret, client_id, redirect_uris} = credentials.installed;
let token = {};
const oAuth2Client = new OAuth2Client(client_id, client_secret, redirect_uris[0]);
// Check if we have previously stored a token.
try {
token = fs.readFileSync(TOKEN_PATH);
} catch (err) {
return getAccessToken(oAuth2Client, callback);
}
oAuth2Client.setCredentials(JSON.parse(token));
callback(oAuth2Client);
}
function getAccessToken(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 callback(err);
oAuth2Client.setCredentials(token);
// Store the token to disk for later program executions
try {
fs.writeFileSync(TOKEN_PATH, JSON.stringify(token));
console.log('Token stored to', TOKEN_PATH);
} catch (err) {
console.error(err);
}
callback(oAuth2Client);
});
});
}
function listEvents(auth) {
const calendar = google.calendar({version: 'v3', auth});
calendar.events.list({
calendarId: 'primary',
timeMin: (new Date()).toISOString(),
maxResults: 10,
singleEvents: true,
orderBy: 'startTime', }, (err, {data}) => {
if (err) return console.log('The API returned an error: ' + err);
const events = data.items;
if (events.length) {
console.log('Upcoming 10 events:');
events.map((event, i) => {
const start = event.start.dateTime || event.start.date;
console.log(`${start} - ${event.summary}`);
});
} else {
console.log('No upcoming events found.');
}
});
}
有什么想法吗?
能否再次确认以下几点?
const TOKEN_PATH = './client_secret.json';
和const content = fs.readFileSync('client_secret.json');
的文件是一样的。- 请将
const TOKEN_PATH = './client_secret.json';
修改为const TOKEN_PATH = './credentials.json';
,再修改运行。 - 这样,您下载的
client_secret.json
可能已经被覆盖了。所以也请确认一下。
- 请将
- 如果进行了上述修改仍出现错误,请确认googleapis的版本。因为据报道,googleapis 具有 v25.0.0 - v30.0.0。某些 API 有一些错误。
- 如果您认为错误是bug,请将googleapis的版本修改为v24.0.0。错误可能会被删除。
参考资料:
如果这些要点对您的情况没有帮助,我很抱歉。