Google 使用服务帐户驱动验证和下载文件

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(只能下载二进制内容的文件),但是当我点击 link 时报错,导致上面的JSON.

编辑:上面的粗体部分是真正的问题,然后当我点击 link 它是未经授权的。我的错!

这是我 运行 的代码,基本上是从他们的文档中提取的:

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

我很困惑。任何人都可以帮助我了解我在这里缺少什么吗?

Daily Limit for Unauthenticated Use Exceeded.

此错误消息通常是未在您的代码中应用授权凭据的结果。不过,我无法立即发现您的代码有任何问题。我想建议的第一件事是,您仔细检查您的项目中是否添加了服务帐户凭据,而不是错误的类型。但是,如果这是问题所在,我会期待不同的错误消息。

根据官方样本试试这个 manage downloads

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials


SCOPES = ['https://www.googleapis.com/auth/drive']
KEY_FILE_LOCATION = '<REPLACE_WITH_JSON_FILE>'


def initialize_drive():
  """Initializes an drive service object.

  Returns:
    An authorized drive service object.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      KEY_FILE_LOCATION, SCOPES)

  # Build the service object.
  service = build('drive', 'v3', credentials=credentials)

  return service

def download_report(drive_service, id):
  file_id = '0BwwA4oUTeiV1UVNwOHItT0xfa2M'
  request = drive_service.files().get_media(fileId=file_id)
  fh = io.BytesIO()
  downloader = MediaIoBaseDownload(fh, request)
  done = False
while done is False:
  status, done = downloader.next_chunk()
  print "Download %d%%." % int(status.progress() * 100)
 return fh

只能下载二进制内容的文件

记住驱动器上有两种类型的文件。 Google drive mimetype 个需要使用导出方法下载的文件和所有其他二进制类型的文件。使用您现在使用的方法下载二进制文件。

def main():
 service = initialize_drive()

 buffer = download_report(service, <file_id>)

if __name__ == '__main__':
  main()

Export method

file_id = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo'
request = drive_service.files().export_media(fileId=file_id,
                                             mimeType='application/pdf')
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print "Download %d%%." % int(status.progress() * 100)