如何对Google Drive API调用进行评级?

时间:2016-12-17 20:23:38

标签: javascript node.js google-drive-api rate-limiting google-api-nodejs-client

我正在使用节点脚本下载与我在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"的第三方库。仍然无法让它为我的生活而工作。 :(

3 个答案:

答案 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 403userRateLimitExceeded错误意味着已达到开发者控制台的每用户限制。

  

请注意,Drive API包含:

     
      
  • 每日提供1,000,000,000个请求/天
  •   
  • 每秒提供每日限额100次/秒
  •   
  • 每用户限制10个请求/秒/用户
  •   

以下是Drive API默认配额的屏幕截图

enter image description here

因此,建议的错误操作是:

有关更多信息,请查看以下SO问题:

答案 2 :(得分:0)

有了速率限制,您需要注意的是每位用户每秒。

我使用了一个脚本,该脚本每1.3秒发送一批10个请求,该脚本可以正常工作。

在13秒钟内发送100个请求,但是在途中开始出现403错误。

结论是:注意每秒的限制,而不是每100秒的限制。