几次请求后超出了用户速率限制

Raf*_*ael 5 python google-api google-drive-api google-api-python-client pydrive

我通过pydrive使用Google Drive API 在两个谷歌驱动器帐户之间移动文件.我一直在测试一个包含16个文件的文件夹.我的代码总是在第六个文件中引发错误

"超出用户速率限制">

我知道请求数量有限制(10/s或1000/100s),但我已尝试使用Google Drive API建议的指数退避来处理此错误.即使在248秒之后,它仍然会引发同样的错误.

这是我正在做的一个例子

def MoveToFolder(self,files,folder_id,drive):
    total_files = len(files)
    for cont in range(total_files):
        success = False
        n=0
        while not success:
            try:
                drive.auth.service.files().copy(fileId=files[cont]['id'],
                                                body={"parents": [{"kind": "drive#fileLink", "id": folder_id}]}).execute()
                time.sleep(random.randint(0,1000)/1000)
                success = True
            except:
                wait = (2**n) + (random.randint(0,1000)/1000)
                time.sleep(wait)
                success = False
                n += 1
Run Code Online (Sandbox Code Playgroud)

我尝试使用"批处理请求"来复制文件,但它会为10个文件引发相同的错误.

def MoveToFolderBatch(self,files,folder_id,drive):
    cont=0
    batch = drive.auth.service.new_batch_http_request()
    for file in files:
        cont+=1
        batch.add(drive.auth.service.files().copy(fileId=file['id'],
                                                 body={"parents": [
                                                     {"kind": "drive#fileLink", "id": folder_id}]}))
    batch.execute()
Run Code Online (Sandbox Code Playgroud)

有人有任何提示吗?

编辑:根据谷歌支持:

关于超出用户速率限制错误,与控制台中设置的每用户速率限制完全无关.相反,它来自Drive API依赖的内部Google系统,并且最有可能在单个帐户拥有域中的所有文件时发生.我们不建议单个帐户拥有所有文件,而是让域中的个人用户拥有这些文件.要传输文件,您可以查看此链接.另外,请检查建议上的此链接以避免错误.

DaI*_*mTo 2

403: User Rate Limit Exceeded基本上是防洪。

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "userRateLimitExceeded",
    "message": "User Rate Limit Exceeded"
   }
  ],
  "code": 403,
  "message": "User Rate Limit Exceeded"
 }
}
Run Code Online (Sandbox Code Playgroud)

你需要放慢速度。像您所做的那样实施指数退避是正确的做法。

谷歌在计算请求数方面并不完美,因此您自己计算请求并没有真正的帮助。有时你可以每秒处理 15 个请求,但有时你只能得到 7 个请求。

您还应该记住,您正在与使用该服务器的其他人一起完成,如果服务器上有很多负载,您的一个请求可能需要更长的时间,而另一个则可能不需要。不要在大多数人设置要提取的 cron 作业的时间运行。

注意:如果您进入 Google 开发者控制台,在启用了驱动器 API 的位置下,请进入配额选项卡,然后单击旁边的铅笔图标

每个用户每 100 秒的查询次数

每 100 秒的查询数

您可以同时增加它们。一种是基于用户的,另一种是基于项目的。每个用户可以在 100 秒内发出 X 个请求,而您的项目每 100 秒可以发出 Y 个请求。

在此输入图像描述

注意:不知道你可以设置多高。这是我的开发帐户,因此它可能有一些我不记得的测试版访问权限。