Google Drive 使用服务帐户验证和下载文件
python 264
原文标题 :Google Drive Authenticate and Download Files with Service Account
我一直在尝试使用服务帐户通过 API 和我在文档中找到的一些示例从 Google Drive 下载文件,并且有一段时间它运行良好。不过几天前,我开始收到此错误:
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "dailyLimitExceededUnreg",
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
"extendedHelp": "https://code.google.com/apis/console"
}
],
"code": 403,
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
}
}
好吧,实际上我在控制台中得到了不同的 403(只能下载具有二进制内容的文件),但是当我单击该错误中的链接时,它会导致上面的 JSON。
这是我正在运行的代码,基本上是从他们的文档中提取的:
def get_drive_service(key_file):
sa_creds = service_account.Credentials.from_service_account_file(key_file)
scoped_creds = sa_creds.with_scopes(SCOPES)
drive_service = build('drive', 'v3', credentials=scoped_creds)
return drive_service
def download_report(drive_service, id):
request = drive_service.files().get_media(fileId=id)
print(request.to_json())
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request, chunksize=1024*1024)
done = False
while done is False:
status, done = downloader.next_chunk()
print("Download %d%%." % int(status.progress() * 100))
return fh
drive_service = get_drive_service(<key_file>)
buffer = download_report(drive_service, <file_id>)
我在 SO 上发现了一些类似的问题,并尝试了所有似乎相关的东西,但没有任何效果。 API已启用,配额不是问题,当我使用时files().list().execute()
我得到了我期望的文件列表,正如我所说的那样,代码可以正常工作。
我很困惑。谁能帮我理解我在这里缺少什么?
回复
我来回复-
Ricardo Jose Velasquez Cruz 评论
当没有身份验证令牌且未提供 API 密钥时会发生此错误(未注册使用)。检查他们是否正在为其应用程序刷新访问令牌。您可以去查看“刷新访问令牌(离线访问)”来自“将 OAuth 2.0 用于 Web 服务器应用程序”:
“访问令牌会定期过期。如果您请求离线访问与令牌关联的范围,您可以在不提示用户许可的情况下刷新访问令牌(包括当用户不存在时)。”
另一个可能的原因是已经授权的令牌已经过期,您需要确保保存刷新令牌以确保应用程序保持身份验证。您还可以通过正在使用的项目的同意屏幕检查请求的范围。
除了这些潜在原因之外,还有一个很棒的线程,其中包含多个场景和其他 API 的问题,而不仅仅是 Drive 和与使用 API 完成的请求有关的其他潜在想法的相同错误。
2年前