Java Google Drive API抛出UserRateLimitExceededUnreg,然后是dailyLimitExceededUnreg

Java Google Drive API抛出UserRateLimitExceededUnreg,然后是dailyLimitExceededUnreg,java,google-drive-api,google-api-java-client,service-accounts,Java,Google Drive Api,Google Api Java Client,Service Accounts,我正在使用GoogleDriveAPI获取几千个文档。我用于连接的凭据使用setServiceAccount和setServiceAccountPrivateKey 当我开始提出请求时,我会在短时间内收到以下信息: { "code" : 403, "errors" : [ { "domain" : "usageLimits", "message" : "User Rate Limit Exceeded. Rate of requests for user exceed c

我正在使用GoogleDriveAPI获取几千个文档。我用于连接的凭据使用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>"
  }
我访问了配额页面,我有以下值(UI不允许我请求将这些配额提高到这些值之外-它们是允许的最大值):

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.export
drive.files.get

谢谢,

好的,这并不是一个真正的答案,但它很长时间以来都是一个评论。我不能帮你解决这个问题,但我们可能可以缓解这个问题

超过用户速率限制
userratelimited
你的防洪计划快了吗。您的用户达到了无法更改的用户配额。因为您使用的是服务帐户,所以所有内容都集中在同一用户下。所有请求都有一个可选的pramater,称为quotauser,如果您将它添加到所有请求中,比如说一个随机数,它有时会通过覆盖ip地址而有所帮助

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

File file = drive.files().get(itemid)
            .setQuotaUser(randomstring)
            .setFields("id, name, createdTime, modifiedTime, size, webContentLink")
            .execute();
我的问题是,为什么你要对这么多的文件进行访问,以至于你会达到速度配额。最好的解决办法是放慢速度,确保每100秒发出的请求少于1000个。如果您确实收到错误,只需停止几秒钟,然后再次发送请求

我不久前写的这篇文章是C#,但它可能会有所帮助

超出未经验证使用的每日限制。继续使用需要注册。
我不知道你为什么会犯这个错误。此错误通常仅在您发送未经身份验证的请求时出现,但您使用的是服务帐户,因此不应出现此错误。

请将您的代码包含在上面的原始帖子中-感谢您的评论。我们在一个地方使用了setQuotaUser。我把它加在了其他的上面。我有一些UserRate错误(我目前没有限制)。在一段短时间之后-我又回到了dailyLimitExceededUnreg错误,我不知道是什么导致了它。我们发出大量get请求的原因是因为我们的软件去获取每个文档,并对其进行一些分析,所以我们需要处理每个文档。您唯一的选择是降低速度。服务帐户是单用户,您可以重载该用户。库本身是为指数退避而设计的,因此它尽其所能。您只需等待几秒钟,然后再试一次无法真正100%解决此问题。这在很大程度上取决于您的请求运行时所使用的服务器。获取一个快速服务器,它可以在10秒内运行大量请求,然后在剩余的90秒内阻止您。谢谢。我们将放慢请求的速度,看看这是否有帮助。遗憾的是,我似乎被每天返回的LimiteExceedeDunReg电话多少永久地卡住了。昨天下午,在我收到dailyLimitExceededUnreg之前,我成功地打了几个(不到100个)电话,现在我需要再等一天,以较慢的速率尝试。对于dailyLimitExceededUnreg错误。事实证明,我是在创建自己的HttpRequestInitializer对象,以便增加一些调用的超时时间。在initialize方法中,我没有调用凭证;方法-必须使用该方法才能使用正确的凭据设置请求。
File file = drive.files().get(itemid)
            .setFields("id, name, createdTime, modifiedTime, size, webContentLink")
            .execute();
File file = drive.files().get(itemid)
            .setQuotaUser(randomstring)
            .setFields("id, name, createdTime, modifiedTime, size, webContentLink")
            .execute();