我正在使用节点脚本下载与我在Google云端硬盘上的帐户共享的所有图片。
我正如其他人在Stack Overflow上发布的那样撞墙:Google Drive API file watch rate limits。
指数退避对我来说很有意义,我只是不知道如何实现它。
我能够深入了解这一点会非常有帮助。即使只是一个"开始......"会很棒的!
我已经添加了我正在进行的方法。 Auth和一切工作正常,只是收到userRateLimitExceeded
错误。
任何和所有的帮助都会非常棒,非常感谢。
谢谢!
/**
* Download all of the shared images.
*
* @param {google.auth.OAuth2} auth An authorized OAuth2 client.
*/
function downloadImages(auth) {
const gDrive = google.drive({
version: 'v3',
auth: auth
});
gDrive.files.list({
q: 'sharedWithMe = true and mimeType = "image/jpeg"'
}, (err, resp) => {
if(err) {
console.log('The API returned an error: ' + err);
return;
}
if(!resp.files.length) {
console.error('No files found.');
} else {
// Remove existing images.
// removeImages();
_.each(resp.files, (file) => {
if(fs.existsSync(IMAGE_DIR + file.name)) {
return;
}
gDrive.files.get({
fileId: file.id
})
.on('end', () => {
console.log(chalk.green(file.name + ' successfully downloaded.'));
})
.on('error', (err) => {
console.log(err);
})
.pipe(fs.createWriteStream(IMAGE_DIR + file.name));
});
}
});
}
编辑:我调查了批处理,但我猜google-api-nodejs-client不支持批处理。我尝试了一个名为" Batchelor"的第三方库。仍然无法让它为我的生活而工作。 :(
答案 0 :(得分:1)
这并不简单,尤其是来自像JavaScript这样的异步语言。首先,不要做指数退避,正如我在你引用的问题的答案中解释的那样。您最终会在API调用之间出现大量延迟。
您可以在https://github.com/pinoyyid/ngDrive/blob/master/src/http_s.ts中围绕代码进行搜索 这是一个处理GDrives特性的Angular 1服务,包括403.它通过将请求放入内部队列来实现它,然后我有一个进程以可变速率从队列中取出项目以最大化吞吐量,但最小化403&# 39; s和随之而来的重试。
批处理使情况变得更糟,所以不要走那条路。它不是http请求的速率,这是限制因素,它是GDrive内部系统的请求速率。一批请求快速连续发送到GDrive,os更有可能触发403。
答案 1 :(得分:0)
根据此documentation,您获得的error 403
或userRateLimitExceeded
错误意味着已达到开发者控制台的每用户限制。
请注意,Drive API包含:
- 每日提供1,000,000,000个请求/天
- 每秒提供每日限额100次/秒
- 每用户限制10个请求/秒/用户
以下是Drive API默认配额的屏幕截图
因此,建议的错误操作是:
在Developer Console项目中提升每用户配额。 (使用此link要求更多配额)
如果一个用户代表Google Apps域的许多用户提出了大量请求,请考虑使用权限委派Service Account(设置quotaUser parameter)。
有关更多信息,请查看以下SO问题:
答案 2 :(得分:0)
有了速率限制,您需要注意的是每位用户每秒。
我使用了一个脚本,该脚本每1.3秒发送一批10个请求,该脚本可以正常工作。
在13秒钟内发送100个请求,但是在途中开始出现403错误。
结论是:注意每秒的限制,而不是每100秒的限制。