当前位置: 首页 > 知识库问答 >
问题:

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

谷梁宁
2023-03-14

我的桌面应用程序,写在Java,试图下载公共文件从谷歌驱动器。正如我所发现的,它可以通过使用文件的webcontentlink来实现(这是为了能够在没有用户授权的情况下下载公共文件)。

因此,下面的代码可以处理小文件:

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

但它对大文件不起作用,因为在这种情况下,未经用户确认并带有google病毒扫描警告,文件不能直接通过webcontentlink下载。请参阅示例:web内容链接。

所以我的问题是如何在没有用户授权的情况下从Google Drive获取公共文件的内容?

共有2个答案

韩禄
2023-03-14

如果你面对“这个文件无法检查病毒”的插曲页面,下载就没那么容易了。

您基本上需要首先下载普通的下载链接,但是它会将您重定向到“无论如何下载”页面。您需要存储来自这个第一个请求的cookies,找出“反正下载”按钮指向的链接,然后使用这个链接下载文件,但是重用您从第一个请求得到的cookies。

下面是使用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/\&/\&/g')" > FINAL_DOWNLOADED_FILENAME

备注:

  • 此过程可能会在某些Google更改后停止工作
  • grep命令使用Perl语法(-p)和\k“运算符”,这实质上意味着“不包括匹配结果之前的任何东西。我不知道grep的哪个版本引入了这些选项,但古代或非Ubuntu版本可能没有
  • Java的解决方案大体上也是一样的,只需使用一个可以处理cookie的HTTPS库和一些不错的文本解析
麹渊
2023-03-14

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

googledrive.com/host/ID

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

我刚碰到这个问题。

诀窍是把你的Google Drive文件夹当成一个网络主机。

2015年4月1日更新

谷歌驱动器已经改变,有一个简单的方法直接链接到您的驱动器。我把我以前的答案留在下面作为参考,但这里有一个更新的答案。

  1. 在Google Drive中创建公用文件夹。
  2. 公开共享此驱动器。
  3. 在文件夹中时,从地址栏获取文件夹UUID
  4. 将UUID放入此URLhttps://googledrive.com/host/ /
  5. 将文件名添加到文件所在位置。https://googledrive.com/host/ /

这是谷歌
新的谷歌驱动链接预期的功能。

您所要做的只是简单地获取一个公共共享驱动器文件夹的主机URL。要做到这一点,您可以上传一个纯HTML文件,并在Google Drive中预览它,以找到您的主机URL。

以下是步骤:

  1. 在Google Drive中创建文件夹。
  2. 公开共享此驱动器。
  3. 上载一个简单的HTML文件。添加任何其他文件(子文件夹确定)
  4. 打开并“预览”Google Drive中的HTML文件
  5. 获取此文件夹的URL地址
  6. 从URL文件夹库中创建直接链接URL
  7. 此URL应允许直接下载大型文件。

[编辑]

我忘了加一句。如果使用子文件夹来组织文件,则只需按照URL层次结构中的预期使用文件夹名。

https://googledrive.com/host/ /images/my-image.png

我想做的

我为Vagrant创建了一个带有虚拟框的自定义Debian映像。我想和同事们分享这个“.box”文件,这样他们就可以把直接链接放到他们的VagrantFile中。

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

Google Drive问题

如果您将文件权限设置为公开可用,并通过使用类似gdocs2direct工具或仅手工创建链接来创建/生成直接访问链接:

https://docs.google.com/uc?export=download&id=

您将得到一个基于cookie的验证代码,并提示“Google could not scan this file”提示符,这对于wget或Vagrantfile配置之类的东西是不起作用的。

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

但是如果你使用上面的“网页托管”方法,你就可以绕过那个提示。

我希望这有帮助!

 类似资料:
  • > 假设我有一个导出链接,如下所示:

  • 我正在尝试使用Selenium WebDriver自动执行文件下载功能。我正在使用谷歌浏览器,要下载的文件类型是PDF格式。当 WebDriver 单击下载(或打印)链接时,浏览器将显示 pdf 文件的预览,而不是直接下载。如何使chrome驱动程序直接下载pdf文件?我尝试了下面的代码,但没有运气 我知道这个问题已经在StackOverflow上问过了,包括这个,但这些解决方案都不适合我。 我正

  • 如果考虑到可伸缩性,让所有使用者调用一个负责管理特定队列的节点意味着所有流量都流向一个节点。 Kafka允许使用者从最近的节点获取数据,如果该节点包含leader的副本,那么ActiveMQ上有类似的内容吗?

  • 我试图创建一个nodejs应用程序,可以准备我的GoogleDrive文件。我不想要一个每个人都可以使用的应用程序,它只是特定于我的谷歌驱动。 我在控制台中为GoogleDrive创建了一个api密钥,没有任何限制。 这是我正在做的电话:https://www.googleapis.com/drive/v3/files?pageSize=10 当使用这个键我得到这个错误: 这在谷歌硬盘上可能吗?

  • U使用jsop获取网站。该网站有多个div类,例如: 等等。 如果我使用以下查询选择器: 从div class=“itemcategories”父级直接下行的每个子元素都存储在categories Elements对象的下一个索引中。所以我没有办法确定哪个孩子属于哪个父母。有没有一种方法‘串联’每个div类中的所有子级,并将它们保存在Elements对象的单独索引中?

  • 问题内容: 目的是从Internet下载文件,并从中创建文件对象或类似文件的文件,而无需使其接触硬盘驱动器。这仅是出于我的知识,想知道它是否可能或可行,尤其是因为我想看看是否可以绕过必须编写文件删除行的代码。 通常,这就是我从网络上下载内容并将其映射到内存的方式: 问题答案: 这就是我最终要做的。