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)
我一直在尝试使用服务帐户通过 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)