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()我得到了我期望的文件列表,正如我所说的那样,代码可以正常工作。

我很困惑。谁能帮我理解我在这里缺少什么?

原文链接:https://stackoverflow.com//questions/71476202/google-drive-authenticate-and-download-files-with-service-account

回复

我来回复
  • Ricardo Jose Velasquez Cruz的头像
    Ricardo Jose Velasquez Cruz 评论

    当没有身份验证令牌且未提供 API 密钥时会发生此错误(未注册使用)。检查他们是否正在为其应用程序刷新访问令牌。您可以去查看“刷新访问令牌(离线访问)”来自“将 OAuth 2.0 用于 Web 服务器应用程序”:

    “访问令牌会定期过期。如果您请求离线访问与令牌关联的范围,您可以在不提示用户许可的情况下刷新访问令牌(包括当用户不存在时)。”

    另一个可能的原因是已经授权的令牌已经过期,您需要确保保存刷新令牌以确保应用程序保持身份验证。您还可以通过正在使用的项目的同意屏幕检查请求的范围。

    除了这些潜在原因之外,还有一个很棒的线程,其中包含多个场景和其他 API 的问题,而不仅仅是 Drive 和与使用 API 完成的请求有关的其他潜在想法的相同错误。

    2年前 0条评论