对于所有Google文档,我无法从通过文件响应返回的ThumbnailLink属性下载缩略图图像。
我总是会收到一个'403 - Forbidden'错误页面,其中包含类似这样的消息:
您的客户无权从此服务器获取网址/ thumbnailLink 。
(客户端IP地址: clientIP )
未授权用户
我尝试使用Google提供的类 MediaDownloader.cs ,我也尝试使用此代码下载它:
using (Stream stream = service.HttpClient.GetStreamAsync(p_DownloadUrl).Result) {
StreamUtilities.Copy(p_WriteDelegate, stream.Read);
}
其中'service'是正确实例化的DriveService(IClientService)对象。我可以用它来下载文件或提出任何其他请求。我使用'Drive.Readonly'范围。
我没有任何问题下载Word,Excel,PDF等文档的缩略图,因为这些链接是公开的,不需要任何形式的身份验证。
我做错了什么?
是否可以下载Google文档文档的缩略图?
答案 0 :(得分:4)
编辑:此问题现已修复。请参阅answer by Kalyan Reddy。
我也相信这是Google的一个问题。您可以使用OAuth2经过身份验证的请求下载或导出文件,但不下载该文件的缩略图。另一个不一致之处是,这只会影响驱动器原生格式,例如 application/vnd.google-apps.document
。例如,我可以获取document.docx的缩略图,但不能获取从其转换的Drive文档。
我想知道Google是如何在自己的应用中执行此操作的,以及我是否使用了错误的API。原来他们使用a private API for thumbnails:
https://googledrive.com/thumb/{file_id}
https://googledrive.com/thumb/{file_id}?width=500&height=500
https://googledrive.com/thumb/{file_id}?width=500&height=500&crop=false
此API使用与Drive API v2相同的OAuth2令牌。
我并不确切知道Google的政策是使用未记录的API。 Some of them are off limits或您需要获得使用它们的权限。如果你使用它,这可能会使你的应用评论失败,但如果你真的现在需要缩略图,它就在那里。否则,您应该等待他们在公共API上解决问题。
未记录的API也没有弃用策略,因此它可能会在没有警告的情况下消失。也就是说,我希望这个问题能够存在一段时间。
答案 1 :(得分:3)
据我所知,这是Google Drive API的错误。正如您所说,此问题仅适用于Google文档格式文档,而不是上传文件。
我收到my post中描述的完全相同类型的错误消息。
正如你所提到的,我相信这一段时间以来一直在运作。
当我们使用已弃用的文档列表API时,我们现在遇到的问题并没有发生。我们将使用OAuth2切换到Google云端硬盘API,作为更新我们的市场应用程序的一部分,以便在V2市场上市。
如果没有来自Google开发者的任何反馈,那可能是唯一可以回答这是否是Drive API问题的反馈,这是非常令人沮丧的。
答案 2 :(得分:1)
我们最近做了一些修改来解决这个问题。请再次尝试您的代码,看看您是否仍然收到此错误。我能够运行以下代码来成功下载我的Google文档的缩略图。
# Get oauth credentials
...
# Authorize an http object
http = httplib2.Http()
http = credentials.authorize(http)
drive_service = build('drive', 'v2', http=http)
# Google Document type ID
docId = '1ns9x5BMIZAeUR-eXerqgpaHBBGkl_-_KCVpVoV5opn8'
files = drive_service.files().get(fileId=docId).execute()
thumbnailLink = files['thumbnailLink']
print 'Downloading thumbnail at: ', thumbnailLink
response, content = http.request(thumbnailLink)
print response.status
with open('thumbnail.jpg', 'wb') as f:
f.write(content)