Google云端硬盘 - 无法通过经过身份验证的(OAuth2)请求下载缩略图

时间:2014-04-22 15:08:28

标签: .net google-drive-api

对于所有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文档文档的缩略图?

3 个答案:

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