google-calendar-api - 错误:未设置访问、刷新令牌或 API 密钥
问题描述
我正在尝试在 Node 中制作一个应用程序来访问我的谷歌日历,所以我按照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。错误可能会被删除。
参考 :
- 如何在 v4 中更新我的谷歌表格?
- 使用 Gmail API nodejs 创建 gmail 过滤器,错误:过滤器没有任何条件
- 尝试通过 API(v3)在 Google Drive 上创建文件夹时权限不足
- Youtube Data API V3 - 使用 google.youtube.videos.list() 获取视频时出错
- Google 驱动器 API - 无法读取未定义的属性“OAuth2”
- 如何使用 Google API 服务库 (Node.js) 运行 Google App 脚本
如果这些要点对您的情况没有用,我很抱歉。
推荐阅读
- javascript - 如何检测 javascript 元素层次结构中的循环
- c++ - 不同参数的多态性
- angular - 这里使用 Angular 映射:隐藏 UI 控件时出错
- apache-spark - Apache Spark (Scala) 与不同组的跨时间聚合
- java - 多次文件上传后应用程序没有响应
- django - 如何在firebase数据库中使用pyrebase获取大于特定键值的数据?
- python - 将关键字参数传递给 scipy 中的四元积分函数
- sql-server - 多部分错误,即使表存在
- elasticsearch - logstash s3输入插件不从s3读取文件
- jquery - 数据库已更新并已发送电子邮件,但 Mozilla Firefox 浏览器警报错误而不是成功消息