使用 Google Drive API 从 Google Drive 直接下载

2022-08-31 20:42:44

我的桌面应用程序是用java编写的,它试图从Google云端硬盘下载公共文件。正如我发现的,它可以通过使用file来实现(这是为了在没有用户授权的情况下下载公共文件的能力)。webContentLink

因此,下面的代码适用于小文件:

String webContentLink = aFile.getWebContentLink();
InputStream in = new URL(webContentLink).openStream();

但它不适用于大文件,因为在这种情况下,如果没有用户确认,谷歌病毒扫描警告,就无法直接下载文件。请参阅示例:Web 内容链接webContentLink

所以我的问题是如何在未经用户授权的情况下从Google云端硬盘获取公共文件的内容?


答案 1

更新 2015 年 12 月 8 日根据谷歌支持使用

googledrive.com/host/ID

方法将于2016年8月31日关闭。


我刚刚遇到了这个问题。

诀窍是将您的Google云端硬盘文件夹视为网络主机。

更新 2015 年 4 月 1 日

Google云端硬盘已更改,有一种简单的方法可以直接链接到您的云端硬盘。我在下面留下了我之前的答案以供参考,但这里有一个更新的答案。

  1. 在 Google 云端硬盘中创建一个公共文件夹。

  2. 公开共享此驱动器。

    enter image description here

  3. 当您位于地址栏中时,从该文件夹中获取文件夹 UUID

    enter image description here
  4. 将该 UUID 放在此 URL 中

    https://googledrive.com/host/<folder UUID>/
  5. 将文件名添加到文件所在的位置。

    https://googledrive.com/host/<folder UUID>/<file name>

这是谷歌
新的谷歌云端硬盘链接的预期功能。

您所要做的就是简单地获取公开共享云端硬盘文件夹的主机URL。为此,您可以上传纯 HTML 文件并在 Google 云端硬盘中预览该文件,以查找您的主机网址。

步骤如下:

  1. 在 Google 云端硬盘中创建一个文件夹。

  2. 公开共享此驱动器。

    enter image description here

  3. 上传一个简单的 HTML 文件。添加任何其他文件(子文件夹正常)

    enter image description here

  4. 在 Google 云端硬盘中打开并“预览”HTML 文件

    enter image description here

  5. 获取此文件夹的 URL 地址

    enter image description here

  6. 从 URL 文件夹库创建直接链接 URL

    enter image description here

  7. 此 URL 应允许直接下载大文件。

[编辑]

我忘了添加。如果使用子文件夹来组织文件,则只需像在 URL 层次结构中预期的那样使用文件夹名称即可。

https://googledrive.com/host/<your public folders id string>/images/my-image.png


我想做什么

我用Virtual Box for Vagrant创建了一个自定义的Debian镜像。我想与同事分享这个“.box”文件,这样他们就可以把直接链接放到他们的Vagrant文件中。

最后,我需要一个指向实际文件的直接链接。

谷歌云端硬盘问题

如果您将文件权限设置为公开可用,并使用 gdocs2direct 工具或仅自行制作链接来创建/生成直接访问链接:

https://docs.google.com/uc?export=download&id=<your file id>

您将获得一个基于cookie的验证码,并提示“Google无法扫描此文件”提示,这不适用于wget或Vagrantfile配置之类的东西。

它生成的代码是一个简单的代码,它将 GET 查询变量追加到字符串中,但它是特定于用户的,因此您不能为其他人复制/粘贴该查询变量。...&confirm=###

但是,如果您使用上述“网页托管”方法,则可以绕过该提示。

我希望这有帮助!


答案 2

如果您遇到“无法检查此文件是否存在病毒”的间奏页面,则下载并不容易。

您基本上需要首先下载正常的下载链接,但是它会将您重定向到“仍然下载”页面。您需要存储来自第一个请求的cookie,找出“仍然下载”按钮所指向的链接,然后使用此链接下载文件,但要重复使用从第一个请求中获得的cookie。

以下是使用 CURL 的下载过程的 bash 变体:

curl -c /tmp/cookies "https://drive.google.com/uc?export=download&id=DOCUMENT_ID" > /tmp/intermezzo.html
curl -L -b /tmp/cookies "https://drive.google.com$(cat /tmp/intermezzo.html | grep -Po 'uc-download-link" [^>]* href="\K[^"]*' | sed 's/\&amp;/\&/g')" > FINAL_DOWNLOADED_FILENAME

笔记:

  • 此过程可能会在Google进行某些更改后停止工作
  • grep 命令使用 Perl 语法 () 和 “operator”,这实质上意味着“不要包含匹配结果之前的任何内容。我不知道哪个版本的 grep 引入了这些选项,但古代或非 Ubuntu 版本可能没有-P\K\K
  • Java解决方案或多或少是相同的,只需采用可以处理cookie的HTTPS库和一些不错的文本解析库即可

推荐