我想获取Google云端硬盘上某个文件的直接下载链接,我使用 Google API客户端进行python ,这是我的代码的一部分,基本上是{{{ 3}}:
SCOPES = "https://www.googleapis.com/auth/drive"
FILE_ID = "xxxxxx"
def get_credentials():
...
return credentials
if __name__ == '__main__':
credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
service = discovery.build("drive", "v3", http=http)
web_link = service.files().get(fileId=FILE_ID, fields="webContentLink").execute() # success
download_link = service.files().get(fileId=FILE_ID, fields="downloadUrl").execute() # throw an error
然后我得到400错误:
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://www.googleapis.com/drive/v3/files/xxxxxx?alt=json&fields=downloadUrl returned "Invalid field selection downloadUrl">
我搜索并阅读了有关此问题的所有相关问题。正如人们在quickstart example中所说:
此downloadURL与webContentLink之间的区别在于 webContentLink使用来自用户浏览器cookie的授权, downloadURL需要授权的API请求(使用OAuth 2.0)。
所以我想也许我没有成功授权请求。然而,根据this question:
,主要部分的前三个陈述为我做了使用Credentials类的authorize()函数进行应用 httplib2.Http发出的所有请求的必要凭据标头 实例...一旦httplib2.Http对象被授权,它就是 通常传递给构建函数
那我的程序出了什么问题?如果我想用urllib编写我自己的请求或者重现错误的请求,怎么做?
答案 0 :(得分:1)
downloadURL
是一个可用于Google Drive API 版本2 中的文件资源但不是版本3 的字段,您似乎正在使用该字段。
在Google Drive API v3中,该字段已被替换为files.get
?alt=media
请求直接下载文件,而无需查找特定的URL。 You can read more about the differences and changes between API v2 and v3 here.
以下是如何使用带有Google Drive API v3的python Google API客户端库下载文件的示例:
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)