使用python API获取Google云端硬盘中文件的downloadUrl属性失败

时间:2016-12-21 12:17:34

标签: python google-api-python-client

我想获取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编写我自己的请求或者重现错误的请求,怎么做?

1 个答案:

答案 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)

Check out the official documentation regarding downloading files using the API v3 here for more examples.