0

Googleドライブのアカウントで共有されているすべての画像をダウンロードするには、ノードスクリプトを作成しています。GoogleドライブAPIの通話を制限するにはどうすればよいですか?

他の人がStack Overflow: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)); 
     }); 
    } 
    }); 
} 

EDIT:私はバッチ処理に見えたが、私はGoogleの-API-nodejs-クライアントがバッチをサポートしていないと思います。私は "Batchelor"と呼ばれるサードパーティ製のライブラリを試しました。それでも私の人生のために働くことはできません。 :

+0

あなたはレートが制限されてきている、 'gDrive.fkilesを何。 get() 'do?あなたが検出できる '.on( 'error'、...)'イベントハンドラに特定のエラーがありますか?もしそうなら、具体的なエラーは何ですか?基本的に、レート制限が発生したときの検出方法を知る手助けをすることができれば、コードに対応することができます。 – jfriend00

+0

@ jfriend00 - エラーハンドラにさえいるように見えませんでした。それは単に "userRateLimitExceeded"または何かを言っているエラーオブジェクトで返されます。私が 'console.error( 'error'、error)'のようなことをすれば、私は自分のログラベルを全く見ないだろうから、エラーハンドラには手を出せなかったと私は言います。 : – Will

答えて

1

私はあなたが引用した質問に対する私の答えで説明したように、まずは指数バックオフをしないでください。あなたはAPI呼び出しの間に大量の遅延が生じることになります。

あなたはそれを内部キューに要求を置くことによって、それをdoees、と私はその後、オフのアイテムを取るプロセスを持っている403を含め、これはGDrivesの特異性を扱うアンギュラ1サービスであるhttps://github.com/pinoyyid/ngDrive/blob/master/src/http_s.ts にコードつつくを持つことができますスループットを最大化するためにキューを可変レートで実行しますが、403およびアテンダントの再試行は最小限に抑えてください。

バッチ処理はさらに悪化するため、dその道を下りません。 GDriveの内部システムに対する要求の割合は、制限要因であるHTTP要求の割合ではありません。要求のバッチが矢継ぎ早にGDriveにトリガーされます、OSはこのdocumentationに基づいて403

+0

私はngDriveの簡単な例を残念ながら手に入れることができませんでした。 "401.これはエラーです。エラー:invalid_clientには登録された起源がありません"。このアイデア:/ – Will

+0

401はちょうど設定のものです。APIコンソールでクリケットIDを作成する/ 2、アプリに設定する、3 /指定した承認済みURLのいずれかからアプリを配信する必要がありますステップ1 – pinoyyid

0

をトリガーする可能性が高くなり、error 403またはあなたが得たuserRateLimitExceededエラーが開発者コンソールからそのユーザごとの上限を意味しますに達した。ここで

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

あるだからあなたのエラーの推奨アクションは、次のとおりです。

  • はで、ユーザーごとの割り当て量を上げます開発者コンソールプロジェクト。 (quotaUser parameter設定)1人のユーザーがGoogle Appsドメインの多くのユーザーの代わりに要求の多くを作っている場合は、権限委譲とService Accountを検討

  • (より多くのクォータを求めるために、このlinkを使用してください)。

  • exponential backoffを使用してください。

詳細については、これらのSOの質問を確認してください。

+0

「ユーザーあたりの制限10件/秒/ユーザー」が間違っています。速度制限はそれより複雑で公開されていません。 – pinoyyid

+0

デベロッパーコンソールを確認すると、User - 100sに既定のクォータこれはつまり、ユーザーあたり最大10件のリクエスト/秒/ユーザーがあることを意味します。 – KENdi

+0

それはまったく意味するものではなく、さまざまな制限があります。人の移動は、公開されていないトークン/バケットアルゴリズムで動作するレート調整です。 – pinoyyid

関連する問題