我正在使用 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.export
或 drive.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/