0

我正在使用節點腳本來下載在Google雲端硬盤上與我的帳戶共享的所有圖像。如何評價我的Google Drive API調用限制?

我正在打牆,就像其他人在堆棧溢出時發佈的一樣:Google Drive API file watch rate limits

指數回退對我來說很有意義,我只是不知道如何去實現它。

任何洞察,我可以進入這將是非常有益的。即使只是「開始......」也會很棒!

我已經在下面添加了我正在處理的方法。驗證和一切正常工作,這只是一個接收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)); 
     }); 
    } 
    }); 
} 

編輯:我看着配料,但我想谷歌的API-的NodeJS客戶端不支持批量。我嘗試了一個名爲「Batchelor」的第三方庫。仍然無法讓它爲我的生活工作。 :(

+0

當你越來越率有限,什麼是'gDrive.fkiles。 get()'做什麼?你在'.on('error',...)'事件處理程序中是否可以檢測到特定的錯誤?如果是這樣,那麼具體的錯誤是什麼?基本上,如果您可以幫助我們知道如何檢測何時獲得費率限制,那麼我們可以幫助處理該問題的代碼。 – jfriend00

+0

@ jfriend00 - 它看起來並沒有看到錯誤處理程序。它只會返回一個錯誤對象,說「userRateLimitExceeded」或什麼的。我說它沒有到達錯誤處理程序,因爲如果我做了類似'console.error('error',error)'的東西,我根本看不到我的日誌標籤。 :( – Will

回答

1

這並不簡單,尤其是從JavaScript這樣的異步語言開始。首先,不要做指數回退,正如我在你引用的問題的回答中所解釋的那樣,最終會導致API調用之間的大規模延遲。

你可以有代碼周圍一捅在https://github.com/pinoyyid/ngDrive/blob/master/src/http_s.ts 這是一個角1個服務,處理GDrives特質,包括403它通過將請求到內部隊列doees它,然後我有一個過程,需要項目關閉以可變速率排隊以最大化吞吐量,但最小化403和隨後的重試次數。

批處理使得它更糟,所以d不要走那條路。這不是限制因素的http請求率,而是對GDrive內部系統的請求率。一批請求得到快速連續射進GDrive的,操作系統是更容易引發403

+0

讚賞回覆:我不能得到ngDrive在本地工作的簡單例子,不幸的是,有些關於「401.這是一個錯誤,錯誤:invalid_client沒有註冊的原點」,我認爲這是我放棄的地方這個想法:/ – Will

+0

401只是配置的東西,你需要1 /在API控制檯中創建一個clinet ID,2 /將它配置到你的應用中,3 /從你指定的授權URL之一步驟1 – pinoyyid

0

在此基礎上documentation,將error 403userRateLimitExceeded錯誤,你有指每用戶限額從開發者控制檯已經達到。

Just take Note that the Drive API has a:

  • Courtesy daily quota 1,000,000,000 requests/day
  • Courtesy daily quota per second 100 requests/second
  • Per User Limit 10 requests/second/user

這裏是驅動器API的默認配額的截圖

enter image description here

因此,對於你的錯誤建議的行動是:

欲瞭解更多信息,請檢查這些所謂的問題:

+0

「每用戶限制10個請求/秒/用戶」不正確。速率限制比此更復雜,並且未公開記錄。 – pinoyyid

+0

檢查開發人員控制檯,您會看到User-100s具有默認配額這意味着你的每用戶數限制爲每秒10個請求請查看我提供的截圖 – KENdi

+0

這並不意味着它有很多不同的限制最常見的是人們絆倒的是速率限制,它在未發佈的令牌/桶算法上工作。 – pinoyyid