我正在创建一个脚本,该脚本将使用模拟该用户的服务帐户为特定的 Google Apps 用户下载所有文件(使用此处提供的 Python 模板代码(请参阅下面的代码块)。
def createDriveService(user_email):
"""Build and returns a Drive service object authorized with the service accounts
that act on behalf of the given user.
Args:
user_email: The email of the user.
Returns:
Drive service object.
"""
f = file(SERVICE_ACCOUNT_PKCS12_FILE_PATH, 'rb')
key = f.read()
f.close()
credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key,
scope='https://www.googleapis.com/auth/drive', prn=user_email)
http = httplib2.Http()
http = credentials.authorize(http)
return build('drive', 'v2', http=http)
我已经能够使用此功能成功验证,并且可以执行下载、文件列表请求等。但是,如果我尝试在短时间内执行四个以上的下载,则会收到以下错误:
Traceback (most recent call last):
// snip //
File "C:\***\changeScan2.py", line 48, in createDriveService
return build('drive', 'v2', http=http)
File "build\bdist.win32\egg\oauth2client\util.py", line 120, in positional_wrapper
File "build\bdist.win32\egg\apiclient\discovery.py", line 193, in build
File "build\bdist.win32\egg\oauth2client\util.py", line 120, in positional_wrapper
File "build\bdist.win32\egg\oauth2client\client.py", line 405, in new_request
File "build\bdist.win32\egg\oauth2client\client.py", line 573, in _refresh
File "build\bdist.win32\egg\oauth2client\client.py", line 629, in _do_refresh_request
oauth2client.client.AccessTokenRefreshError: Invalid response 403
该程序成功获取要下载的文件列表(files.list),下载四个文件(每次都进行身份验证),然后在第五次下载时提供上述错误。整个过程需要5-10秒。在使用不同文件的多次运行中,程序在下载第五个文件的过程中返回错误。
我将应用程序精简到最基本的部分,尝试下载不同的文件,并收到相同的错误。我尝试为我的 createDriveService 函数捕获异常并实现指数退避,但错误似乎在 Google API 客户端文件中,所以我无法缓解它。这是查看 oauth2client\client.py 代码的链接,这似乎给我带来了问题。
有任何想法吗?