java - Google Drive API 抛出 userRateLimitExceeded 然后 dailyLimitExceededUnreg

标签 java google-drive-api google-api-java-client service-accounts

我正在使用 google drive API 来获取几千个文档。我用于连接的凭据使用的是 setServiceAccount 和 setServiceAccountPrivateKey。

当我开始提出请求时 - 我会在短时间后收到以下信息:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "usageLimits",
    "message" : "User Rate Limit Exceeded. Rate of requests for user exceed configured project quota. You may consider re-evaluating expected per-user traffic to the API and adjust project quota limits accordingly. You may monitor aggregate quota usage and adjust limits in the API Console: https://console.developers.google.com/apis/api/drive.googleapis.com/quotas?project=<projid>",
    "reason" : "userRateLimitExceeded",
    "extendedHelp" : "https://console.developers.google.com/apis/api/drive.googleapis.com/quotas?project=<projid>"
  }

在几千项之后,我最终得到这个错误:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "usageLimits",
    "message" : "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
    "reason" : "dailyLimitExceededUnreg",
    "extendedHelp" : "https://code.google.com/apis/console"
  } ],
  "message" : "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
}

我访问了配额页面,我有以下值(用户界面不允许我请求将这些配额提高到超过这些值 - 它们是允许的最大值):

Queries per day = 1,000,000,000
Queries per 100 seconds per user = 1,000
Queries per 100 seconds = 10,000

1) 是否可以将每个用户的查询配额提高到每秒 10 次以上?我可以请求 10/秒的更高配额吗?怎么办?

2) 为什么我会遇到 dailyLimitExceededUnreg 错误?我该如何避免呢?

一些代码片段:

Credential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(JSON_FACTORY)
                .setServiceAccountId(serviceAccountId)
                .setServiceAccountPrivateKey(gdrivePrivateKey)
                .setServiceAccountScopes(ImmutableSet.of(DriveScopes.DRIVE,
                    DirectoryScopes.ADMIN_DIRECTORY_USER,
                    DirectoryScopes.ADMIN_DIRECTORY_GROUP))
                .setServiceAccountUser(serviceAccount.getServiceAccountUser())
                .build();

有时会检索文件的属性:

File file = drive.files().get(itemid)
            .setFields("id, name, createdTime, modifiedTime, size, webContentLink")
            .execute();

或使用 drive.files.exportdrive.files.get 之一获取文件

谢谢, 呼

最佳答案

好吧,这不是真正的答案,但它很想成为评论。我无法帮助您修复它,但我们或许可以缓解该问题。

userRateLimitExceeded

userRateLimitExceeded 是您要快速进行的防洪。您达到了无法更改的用户配额。因为您使用的是服务帐户,所以所有内容都集中在同一用户下。所有请求都有一个可选的 pramater,称为 quotauser 如果您将其添加到所有请求中说一个随机数,它有时会通过覆盖 ip 地址来提供帮助。

我不是 Java 开发人员,但该库与 .net 库非常接近,可能是这样的。

File file = drive.files().get(itemid)
            .setQuotaUser(randomstring)
            .setFields("id, name, createdTime, modifiedTime, size, webContentLink")
            .execute();

我的问题是,为什么要获取如此多的文件,以至于会达到速度配额。最好的解决办法是放慢速度,确保每 100 秒发出的请求少于 1000 个。如果您确实收到错误,请停止几秒钟,然后再次发送请求。

我不久前用 C# 写了这篇文章,但它可能会有所帮助 google apis flood buster

已超出未经身份验证使用的每日限制。继续使用需要注册。

我不知道为什么会出现此错误。此错误通常仅在您发送未经身份验证的请求时才会出现,但您使用的是服务帐户,因此不应发生这种情况。

关于java - Google Drive API 抛出 userRateLimitExceeded 然后 dailyLimitExceededUnreg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59750818/

相关文章:

java - 错误 : java. lang.NumberFormatException:

java - 如何从 Java 中的 Google Drive API 获取 JSON 中所有文件夹中的所有文件

python - 使用 python 中的 api 将图像从驱动器插入幻灯片

android - 将 Google Drive 集成到 Android 应用程序中, Unresolved 导入

android - 使用 android 访问 picasa

JavaServlet : pass a request back to default processing

java - Java 泛型中没有抛出 ClassCastException

java - 仅将textfield的提示文字居中

javascript - Google Drive SDK JavaScript 文件共享对话框给出 "Refused to display document because display forbidden by X-Frame-Options"

android - 想从 Android 应用程序访问谷歌图书