ChatGPT解决这个技术问题 Extra ChatGPT

wget/curl 来自谷歌驱动器的大文件

我正在尝试以脚本从谷歌驱动器下载文件,但这样做有点麻烦。我要下载的文件是 here

我在网上查了很多资料,终于设法让其中一个下载。我得到了文件的 UID,较小的文件 (1.6MB) 下载正常,但是较大的文件 (3.7GB) 总是重定向到一个页面,询问我是否要在不进行病毒扫描的情况下继续下载。有人可以帮我通过那个屏幕吗?

以下是我如何让第一个文件工作 -

curl -L "https://docs.google.com/uc?export=download&id=0Bz-w5tutuZIYeDU0VDRFWG9IVUE" > phlat-1.0.tar.gz

当我在另一个文件上运行相同的文件时,

curl -L "https://docs.google.com/uc?export=download&id=0Bz-w5tutuZIYY3h5YlMzTjhnbGM" > index4phlat.tar.gz

https://i.stack.imgur.com/Szcq2.jpg

我注意到在链接的倒数第三行,有一个 &confirm=JwkK,它是一个随机的 4 个字符的字符串,但表明有一种方法可以向我的 URL 添加确认。我访问的链接之一建议 &confirm=no_antivirus 但这不起作用。

我希望这里有人可以帮助解决这个问题!

您能否提供用于从 google drive 下载文件的 curl script,因为我无法从此脚本下载工作文件(图像)curl -u username:pass https://drive.google.com/open?id=0B0QQY4sFRhIDRk1LN3g2TjBIRU0 >image.jpg
查看接受的答案。我使用了 gdown.pl 脚本 gdown.pl https://drive.google.com/uc?export=download&confirm=yAjx&id=0Bz-w5tutuZIYY3h5YlMzTjhnbGM index4phlat.tar.gz
不要害怕滚动! This answer 提供了一个非常好的 Python 脚本,可以一次性下载。
./gdrive download [FILEID] [--recursive if its a folder] 它将要求您访问给定的 url 并复制粘贴令牌代码。
从 2020 年 4 月 17 日开始工作,试试这个:github.com/gdrive-org/gdrive,并按照这个 github.com/gdrive-org/gdrive/issues/533#issuecomment-596336395 创建一个服务帐户,与服务帐户地址共享文件/文件夹,您可以下载,即使是公开共享的文件/文件夹!

p
phi

2022 年 6 月

您可以使用 gdown。还可以考虑访问该页面以获取完整说明;这只是一个摘要,源代码库可能有更多最新的说明。

指示

使用以下命令安装它:

pip install gdown

之后,您可以通过运行以下命令之一从 Google Drive 下载任何文件:

gdown https://drive.google.com/uc?id=<file_id>  # for files
gdown <file_id>                                 # alternative format
gdown --folder https://drive.google.com/drive/folders/<file_id>  # for folders
gdown --folder --id <file_id>                                   # this format works for folders too

示例:从 this directory 下载自述文件

gdown https://drive.google.com/uc?id=0B7EVK8r0v71pOXBhSUdJWU1MYUk

file_id 应类似于 0Bz8a_Dbh9QhbNU3SGlFaDg。您可以通过右键单击感兴趣的文件并选择获取链接来找到此 ID。自 2021 年 11 月起,此链接将采用以下形式:

# Files
https://drive.google.com/file/d/<file_id>/view?usp=sharing
# Folders
https://drive.google.com/drive/folders/<file_id>

注意事项

仅适用于开放访问文件。 (“任何有链接的人都可以查看”)

不能将超过 50 个文件下载到单个文件夹中。如果您有权访问源文件,则可以考虑使用 tar/zip 将其制成单个文件以解决此限制。

如果您有权访问源文件,则可以考虑使用 tar/zip 将其制成单个文件以解决此限制。


只需从 gdown https://drive.google.com/uc?export=download&id=your_file_id 中删除 export=download&,它就会像魅力一样发挥作用
这个在 2018 年 7 月工作!记得分享文件,如果您有 drive.google.com/open?id=FILE_ID 的链接,只需将“open”替换为“uc”,然后只需 gdown drive.google.com/uc?id=FILE_ID
我们如何使用 gdown 从 Gdrive 下载文件夹?
自 2019 年 8 月起不起作用。错误:“权限被拒绝:drive.google.com/uc?id=0B7EVK8r0v71pWEZsZE9oNnFzTm8 也许您需要更改“知道链接的人”的权限?”它是可公开下载的 CelebA 数据集,所以应该没问题。我通过单击“获取可共享链接”获取下载链接,然后显示“链接共享”和“任何知道该链接的人都可以查看”。所以看起来权限已经被授予,但错误说权限被拒绝。如果您想试一试,这里是主机站点:mmlab.ie.cuhk.edu.hk/projects/CelebA.html
这是我尝试过的六种解决方案中唯一可行的解决方案。它需要被投票给第一个。我只需要将“共享链接”从:drive.google.com/open?id=XXXX 更改为 drive.google.com/uc?id=XXXX
C
Community

我写了一个 Python 片段,它可以从 Google Drive 下载一个文件,给定一个可共享的链接。截至 2017 年 8 月,它有效。

截图不使用 gdrive,也不使用 Google Drive API。它使用 requests 模块。

从 Google Drive 下载大文件时,单个 GET 请求是不够的。需要第二个,这个有一个额外的 URL 参数,称为确认,其值应该等于某个 cookie 的值。

import requests

def download_file_from_google_drive(id, destination):
    def get_confirm_token(response):
        for key, value in response.cookies.items():
            if key.startswith('download_warning'):
                return value

        return None

    def save_response_content(response, destination):
        CHUNK_SIZE = 32768

        with open(destination, "wb") as f:
            for chunk in response.iter_content(CHUNK_SIZE):
                if chunk: # filter out keep-alive new chunks
                    f.write(chunk)

    URL = "https://docs.google.com/uc?export=download"

    session = requests.Session()

    response = session.get(URL, params = { 'id' : id }, stream = True)
    token = get_confirm_token(response)

    if token:
        params = { 'id' : id, 'confirm' : token }
        response = session.get(URL, params = params, stream = True)

    save_response_content(response, destination)    


if __name__ == "__main__":
    import sys
    if len(sys.argv) is not 3:
        print("Usage: python google_drive.py drive_file_id destination_file_path")
    else:
        # TAKE ID FROM SHAREABLE LINK
        file_id = sys.argv[1]
        # DESTINATION FILE ON YOUR DISK
        destination = sys.argv[2]
        download_file_from_google_drive(file_id, destination)

我正在运行代码段 python snippet.py file_id destination。这是运行它的正确方法吗?因为如果目的地是一个文件夹,我会抛出一个错误。如果我整理了一个文件并将其用作目标,则该片段似乎可以正常工作,但什么也不做。
@Manfredo,您需要保存文件的文件名,例如 $ python snippet.py your_google_file_id /your/full/path/and/filename.xlsx 为我工作。如果这不起作用,您是否提供任何输出?是否创建了任何文件?
@CiprianTomoiaga 我使用 tqdm Python 模块有 90% 的进度条在工作。我做了一个要点: gist.github.com/joshtch/8e51c6d40b1e3205d1bb2eea18fb57ae 。不幸的是,我还没有找到获得总文件大小的可靠方法,您需要它来计算进度百分比和估计完成时间。
另外,请求模块使用什么样的身份验证来访问谷歌驱动器?认证?例如,在上面的代码中,这是在哪里处理的 - requests-oauthlib.readthedocs.io/en/latest/…
这太棒了!以下是 drive_File_ID 的提示:https//drive.google.com/file/d/"drive_File_ID"/view - 位于下载链接的 https~~file/d/ 和 /view 之间。
B
Benyamin Jafari

2022 年 4 月

首先,从 google drive 中提取您想要的文件的 ID:在您的浏览器中,导航到 drive.google.com。右键单击文件,然后单击“获取可共享链接”然后从 URL 中提取文件的 ID:

在您的浏览器中,导航至 drive.google.com。

右键单击该文件,然后单击“获取可共享链接”

然后从 URL 中提取文件的 ID:

接下来,使用 pip 安装 gdown PyPI 模块: pip install gdown

最后,使用 gdown 和预期 ID 下载文件: gdown --id

[笔记]:

在 google-colab 中你必须使用 !在 bash 命令之前。 (即!gdown --id 1-1wAx7b-USG0eQwIBVwVDUl3K1_1ReCt)

您应该将预期文件的权限从“受限”更改为“知道链接的任何人”。


像魅力一样工作
2021 年 8 月,出现 requests.exceptions.MissingSchema: Invalid URL '': No schema supplied. Perhaps you meant http://? 错误。
@Joker00 我再次检查了它。仍然对我有用。您是否在 https://drive.google.com/file/d//view 之前复制了文件的 ID?您是否在文件中添加了正确的权限?
不要忘记 ID gdown --id '1-1wAx7b-USG0eQwIBVwVDUl3K1_1ReCt' 周围的引号
嘿,本。还建议这个: wget "drive.google.com/u/3/…"
a
alper

自 2022 年 3 月起,您可以使用开源跨平台命令行工具 gdrive。与其他解决方案相比,它还可以下载文件夹,还可以处理非公开文件

关于它目前的状态

正如评论中所讨论的那样,该工具之前曾出现过一些问题,谷歌没有对其进行验证,也没有对其进行维护。自 a commit from 2021-05-28 起,这两个问题都已解决。这也意味着不再需要评论中提到的服务帐户的解决方法。在某些情况下,您可能仍然会遇到问题;在这种情况下,您可以尝试 ntechp-fork

要安装它:

下载 2.1.1 二进制文件。选择适合您的操作系统的软件包,例如 gdrive_2.1.1_linux_amd64.tar.gz。将其复制到您的路径。

sudo cp gdrive-linux-x64 /usr/local/bin/gdrive;
sudo chmod a+x /usr/local/bin/gdrive;

要使用它:

确定 Google Drive 文件 ID。为此,请右键单击 Google Drive 网站中的所需文件,然后选择“获取链接...”。它将返回类似 https://drive.google.com/open?id=0B7_OwkDsUIgFWXA1B2FPQfV5S8H 的内容。获取 ?id= 后面的字符串并将其复制到剪贴板。那是文件的ID。下载文件。当然,请在以下命令中使用您的文件 ID。

gdrive download 0B7_OwkDsUIgFWXA1B2FPQfV5S8H

首次使用时,该工具需要获得对 Google Drive API 的访问权限。为此,它将向您显示一个您必须在浏览器中访问的链接,然后您将获得一个验证码以复制并粘贴回该工具。然后自动开始下载。没有进度指示器,但您可以在文件管理器或第二个终端中观察进度。

来源: A comment by Tobi 在这里的另一个答案。

附加技巧:速率限制。 要使用 gdrive 以有限的最大速率下载(以免淹没网络……),您可以使用如下命令(pvPipeViewer):

gdrive download --stdout 0B7_OwkDsUIgFWXA1B2FPQfV5S8H | \
    pv -br -L 90k | cat > file.ext

这将显示下载的数据量 (-b) 和下载速率 (-r),并将该速率限制为 90 kiB/s (-L 90k)。


错误消息:“已超过未经身份验证使用的每日限制。继续使用需要注册。”,代码:403
无法获取验证码。收到错误“暂时禁用此应用的 Google 登录此应用尚未经过 Google 验证才能使用 Google 登录”。
此处出现相同的错误消息:“此应用尚未经过 Google 验证,无法使用 Google 登录。”
@useranon:试试这个解决方案:github.com/gdrive-org/gdrive/issues/533#issuecomment-596336395,您需要创建一个 google 服务帐户并与此服务帐户地址共享文件/文件夹。我做的。从 2020 年 4 月 17 日开始工作!
@tanius 警告:github.com/prasmussen/gdrive 不再维护,开发人员还删除了二进制文件
K
Kos

警告:此功能已弃用。请参阅下面的评论中的警告。

看看这个问题:Direct download from Google Drive using Google Drive API

基本上,您必须创建一个公共目录并通过相对引用访问您的文件,例如

wget https://googledrive.com/host/LARGEPUBLICFOLDERID/index4phlat.tar.gz

或者,您可以使用此脚本:https://github.com/circulosmeos/gdown.pl


另一个好方法是使用 linux 命令行工具“gdrive”github.com/prasmussen/gdrive
我能够结合使用 Nanolx 的 perl 脚本和在 gdurl.com 创建的 google 驱动器永久链接——谢谢!
警告:Google Drive 中的网络托管支持已弃用。 “从 2015 年 8 月 31 日开始,用户和开发人员在 Google Drive 中的网络托管将被弃用。Google Apps 客户在通过 googledrive.com/host 提供内容时可以继续使用此功能一年,直到 2016 年 8 月 31 日/doc id 将被停用。” googleappsupdates.blogspot.com/2015/08/…
不幸的是,这在 2018 年不再起作用。
gdown.pl 对我也很有效。快速查看脚本表明它没有使用该 API,它创建了一个带有参数 export=download 的新 URL,因此在可预见的将来它应该是好的,除非谷歌更改该 URL 方案
q
qwertzguy

这是执行此操作的快速方法。

确保链接是共享的,它看起来像这样:

https://drive.google.com/open?id=FILEID&authuser=0

然后,复制该 FILEID 并像这样使用它

wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=FILEID' -O FILENAME

如果文件很大并触发病毒检查页面,您可以这样做(但它会下载两个文件,一个html文件和实际文件):

wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=FILEID' -r -A 'uc*' -e robots=off -nd

您好,感谢您的答复。如果您查看我共享的链接上的文件,您会发现在共享文件时,它们在链接中缺少“authuser=0”标签。您的方法不适用于提供的文件!阿琼
甚至没有尝试公共访问,这对于仅链接共享文件非常有效。像这样使用它:wget 'https://docs.google.com/uc?export=download&id=SECRET_ID' -O 'filename.pdf'
当与 wget-r 标志一起使用时,它会在 2018 年为我绕过防病毒扫描程序。所以它是wget --no-check-certificate -r 'https://docs.google.com/uc?export=download&id=FILE_ID' -O 'filename'
谢谢,于 2020 年 9 月为我工作,文件 ID 也可以从这样的 URL 模式中检索:https://drive.google.com/file/d/FILEID/view?usp=sharing
2021 年也为我工作 :) 谢谢@ArtemPelenitsyn
J
Jeff Atwood

更新至 2018 年 3 月。

我尝试了其他答案中给出的各种技术,将我的文件(6 GB)直接从 Google 驱动器下载到我的 AWS ec2 实例,但它们都不起作用(可能是因为它们太旧了)。

因此,对于其他人的信息,这是我成功的方法:

右键单击要下载的文件,单击共享,在链接共享部分下,选择“知道此链接的任何人都可以编辑”。复制链接。它应该采用以下格式: https://drive.google.com/file/d/FILEIDENTIFIER/view?usp=sharing 从链接中复制 FILEIDENTIFIER 部分。将以下脚本复制到文件中。它使用 curl 并处理 cookie 以自动下载文件。 #!/bin/bash fileid="FILEIDENTIFIER" filename="FILENAME" curl -c ./cookie -s -L "https://drive.google.com/uc?export=download&id=${fileid}" > / dev/null curl -Lb ./cookie "https://drive.google.com/uc?export=download&confirm=`awk '/download/ {print $NF}' ./cookie`&id=${fileid}" - o ${filename} 如上所示,将 FILEIDENTIFIER 粘贴到脚本中。记得保留双引号!为文件提供一个名称来代替 FILENAME。请记住保留双引号并在 FILENAME 中包含扩展名(例如,myfile.zip)。现在,通过在终端 sudo chmod +x download-gdrive.sh 中运行此命令来保存文件并使文件可执行。使用“./download-gdrive.sh”运行脚本。

PS:这是上述脚本的 Github 要点:https://gist.github.com/amit-chahar/db49ce64f46367325293e4cce13d2424


对于 wget 将 -c 替换为 --save-cookies 并将 -b 替换为 --load-cookies
确认这对我有用👍,为清楚起见进行了一些编辑
2019 年 1 月工作。我需要在最后一行的 ${filename} 周围添加 " 引号。
>使用 ./download-gdrive.sh" Do not be like me and try to run the script by typing download-gdrive.sh, the ./` 运行脚本似乎是强制性的。
2019年5月工作
l
lapinpt
ggID='put_googleID_here'  
ggURL='https://drive.google.com/uc?export=download'  
filename="$(curl -sc /tmp/gcokie "${ggURL}&id=${ggID}" | grep -o '="uc-name.*</span>' | sed 's/.*">//;s/<.a> .*//')"  
getcode="$(awk '/_warning_/ {print $NF}' /tmp/gcokie)"  
curl -Lb /tmp/gcokie "${ggURL}&confirm=${getcode}&id=${ggID}" -o "${filename}"  

它是如何工作的?使用 curl 获取 cookie 文件和 html 代码。管道 html 到 grep 和 sed 并搜索文件名。使用 awk 从 cookie 文件中获取确认代码。最后下载启用cookie的文件,确认代码和文件名。

curl -Lb /tmp/gcokie "https://drive.google.com/uc?export=download&confirm=Uq6r&id=0B5IRsLTwEO6CVXFURmpQZ1Jxc0U" -o "SomeBigFile.zip"

如果你不需要文件名变量 curl 可以猜到 -L Follow redirects -O Remote-name -J Remote-header-name

curl -sc /tmp/gcokie "${ggURL}&id=${ggID}" >/dev/null  
getcode="$(awk '/_warning_/ {print $NF}' /tmp/gcokie)"  
curl -LOJb /tmp/gcokie "${ggURL}&confirm=${getcode}&id=${ggID}" 

要从 URL 中提取 google 文件 ID,您可以使用:

echo "gURL" | egrep -o '(\w|-){26,}'  
# match more than 26 word characters  

或者

echo "gURL" | sed 's/[^A-Za-z0-9_-]/\n/g' | sed -rn '/.{26}/p'  
# replace non-word characters with new line,   
# print only line with more than 26 word characters 

做得很好。当所有其他答案都失败时,摆脱了 5GB+ 文件上的病毒警告。
这太棒了。我确实必须在两个 curl 请求中添加 --insecure 选项才能使其正常工作。
@lapinpt 我如何添加恢复功能?
如果我们有文件的公共链接,我们能以某种方式摆脱 google id 吗?
G
Grant G

简单的方法:

(如果您只需要一次性下载)

转到有下载链接的 Google Drive 网页打开浏览器控制台并转到“网络”选项卡单击下载链接等待文件开始下载,并找到相应的请求(应该是列表中的最后一个),然后您可以取消下载右键单击请求并单击“复制为cURL”(或类似)

你应该最终得到类似的东西:

curl 'https://doc-0s-80-docs.googleusercontent.com/docs/securesc/aa51s66fhf9273i....................blah blah blah...............gEIqZ3KAQ==' --compressed

将其粘贴到您的控制台中,将 > my-file-name.extension 添加到末尾(否则它会将文件写入您的控制台),然后按 Enter :)

该链接确实有某种过期,因此在生成第一个请求的几分钟后开始下载将不起作用。


在 Mac 上的 Chrome 中,它是:查看/开发人员/开发人员工具/网络选项卡
2020 年 12 月工作,包括当我右键单击 Google Drive 中的 3GB 文件夹并下载时,等待它压缩,zip 开始下载分成两部分,我为每个部分获取 curl 命令,附加 > file.ext并且都运行良好(并在 10 秒内下载到 AWS 实例)。
这个链接是否可以无限期使用?还是过期了?
2021 年 8 月不再显示链接!
仍然有效。 @AbdelKh 确保您打开足够大的 F12 工具,以便网络选项卡可以显示请求。从列表中的最后一个复制为 cURL。
A
Alex

google drive的默认行为是扫描文件是否有病毒,如果文件太大,它会提示用户并通知他无法扫描文件。

目前我发现的唯一解决方法是与网络共享文件并创建网络资源。

从谷歌驱动器帮助页面引用:

借助云端硬盘,您可以将 Web 资源(例如 HTML、CSS 和 Javascript 文件)作为网站进行查看。

要使用云端硬盘托管网页:

在 drive.google.com 打开云端硬盘并选择一个文件。单击页面顶部的共享按钮。单击共享框右下角的高级。单击更改...。选择打开 - 在网络上公开,然后单击保存。在关闭共享框之前,从“共享链接”下方字段中的 URL 中复制文档 ID。文档 ID 是 URL 中斜线之间的大小写字母和数字字符串。分享类似于“www.googledrive.com/host/[doc id]”的 URL,其中 [doc id] 被您在第 6 步中复制的文档 ID 替换。现在任何人都可以查看您的网页。

在这里找到:https://support.google.com/drive/answer/2881970?hl=en

因此,例如,当您在 google drive 上公开共享文件时,共享链接如下所示:

https://drive.google.com/file/d/0B5IRsLTwEO6CVXFURmpQZ1Jxc0U/view?usp=sharing

然后复制文件 id 并创建一个 googledrive.com 链接,如下所示:

https://www.googledrive.com/host/0B5IRsLTwEO6CVXFURmpQZ1Jxc0U

@FıratKÜÇÜK 你确定你有正确的网址格式吗? (注意 www.googledrive.com 而不是 drive.google.com)我刚刚尝试过,它奏效了。
我的文件超过 50 MB。它要求病毒扫描确认。所以该解决方案不适合我的情况。相反,我使用了“gdrive”控制台应用程序解决方案。
@FıratKÜÇÜK 我刚刚使用这种通常会触发病毒检查的方法下载了一个 200+ Mb 的文件。我通过右键单击>“获取可共享链接”获得了 ID。
此功能已弃用,不再受支持
A
Aatif Khan

根据 Roshan Sethia 的回答

2018 年 5 月

使用 WGET:

创建一个名为 wgetgdrive.sh 的 shell 脚本,如下所示: #!/bin/bash # 从 Google Drive 获取文件 # $1 = 文件 ID # $2 = 文件名 URL="https://docs.google.com/uc?export=下载&id=$1" wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate $URL -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/ p')&id=$1" -O $2 && rm -rf /tmp/cookies.txt 授予执行脚本的正确权限 在终端中,运行:./wgetgdrive.sh 例如:./ wgetgdrive.sh 1lsDPURlTNzS62xEOAIG98gsaW6x2PYd2 图像.zip


这就像 CHARM 一样,谢谢,为了缓解问题:chmod 770 wgetgdrive.sh
不适合我,它下载了一个 3KB 的文件而不是 13GB
效果很好,谢谢
j
jturi

- 更新 -

要下载文件,请先从此处获取 python 的 youtube-dl

youtube-dl:https://rg3.github.io/youtube-dl/download.html

或使用 pip 安装它:

sudo python2.7 -m pip install --upgrade youtube_dl 
# or 
# sudo python3.6 -m pip install --upgrade youtube_dl

更新:

我刚刚发现了这一点:

右键单击要从 drive.google.com 下载的文件 单击获取可共享链接 切换链接共享 单击共享设置 单击顶部下拉列表以获取选项 单击更多 选择 [x] 开 - 任何有链接的人 复制链接

https://drive.google.com/file/d/3PIY9dCoWRs-930HHvY-3-FOOPrIVoBAR/view?usp=sharing       
(This is not a real file address)

复制 https://drive.google.com/file/d/ 后的 id:

3PIY9dCoWRs-930HHvY-3-FOOPrIVoBAR

将此粘贴到命令行中:

youtube-dl https://drive.google.com/open?id=

将 ID 粘贴到 open?id= 后面

youtube-dl https://drive.google.com/open?id=3PIY9dCoWRs-930HHvY-3-FOOPrIVoBAR
[GoogleDrive] 3PIY9dCoWRs-930HHvY-3-FOOPrIVoBAR: Downloading webpage
[GoogleDrive] 3PIY9dCoWRs-930HHvY-3-FOOPrIVoBAR: Requesting source file
[download] Destination: your_requested_filename_here-3PIY9dCoWRs-930HHvY-3-FOOPrIVoBAR
[download] 240.37MiB at  2321.53MiB/s (00:01)

希望能帮助到你


嗨谢谢我试过这个,当我从命令提示符运行时它正在下载,但是有没有办法获得实际的“直接链接”,比如在服务器上访问?我正在尝试使用节点 {spawn} 运行它,但是它必须下载到节点服务器,然后从那里再次下载,有没有办法简单地从谷歌驱动器获取直接下载链接?他们使用什么链接?
我现在必须经常使用这种方法,所以我会尝试完全自动化它。只需获取 google 链接,然后 Python 脚本将完成剩下的工作。我想我会用硒来做到这一点。工作时会更新我的解决方案。
更新了我的答案。现在只需单击 2 次即可使用 youtube-dl 下载任何文件。
m
mher

我一直在使用 @Amit Chahar 的 curl 片段,他在此线程中发布了出色的 answer。我发现将它放在 bash 函数中而不是单独的 .sh 文件中很有用

function curl_gdrive {

    GDRIVE_FILE_ID=$1
    DEST_PATH=$2

    curl -c ./cookie -s -L "https://drive.google.com/uc?export=download&id=${GDRIVE_FILE_ID}" > /dev/null
    curl -Lb ./cookie "https://drive.google.com/uc?export=download&confirm=`awk '/download/ {print $NF}' ./cookie`&id=${GDRIVE_FILE_ID}" -o ${DEST_PATH}
    rm -f cookie
}

可以包含在例如 ~/.bashrc 中(如果不是自动采购,当然是在采购之后)并以下列方式使用

   $ curl_gdrive 153bpzybhfqDspyO_gdbcG5CMlI19ASba imagenet.tar

更新 2022-03-01 - wget 版本也适用于 virus scan is triggered

function wget_gdrive {

    GDRIVE_FILE_ID=$1
    DEST_PATH=$2

    wget --save-cookies cookies.txt 'https://docs.google.com/uc?export=download&id='$GDRIVE_FILE_ID -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1/p' > confirm.txt
    wget --load-cookies cookies.txt -O $DEST_PATH 'https://docs.google.com/uc?export=download&id='$GDRIVE_FILE_ID'&confirm='$(<confirm.txt)
    rm -fr cookies.txt confirm.txt
}

示例用法:

    $ wget_gdrive 1gzp8zIDo888AwMXRTZ4uzKCMiwKynHYP foo.out

这可能是最好的答案……相比之下,python gdown 实在是太重了。我必须说我对 gdrive 很不满意……
您在 rm 命令中既不需要 -f 也不需要 -r。如果你教人们总是“rm -rf”,他们最终可能会删除他们想要保留的东西......
是的,我同意使用 -fr 非常危险
m
maniac

最简单的方法是:

创建下载链接并复制 fileID 使用 WGET 下载: wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=FILEID' -O- | sed -rn 's/。 *confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=FILEID" -O 文件名 && rm -rf /tmp/cookies.txt


太感谢了!难以置信的有用
在 Kaggle 内核上运行它。像魅力一样工作。只需将 FILEID 替换为可共享链接中的 id。它看起来像 1K4R-hrYBPFoDTcM3T677Jx0LchTN15OM。
d
danieltan95

以上答案在 2020 年 4 月已过时,因为谷歌驱动器现在使用重定向到文件的实际位置。

截至 2020 年 4 月,在 macOS 10.15.4 上为公共文档工作:

# this is used for drive directly downloads
function download-google(){
  echo "https://drive.google.com/uc?export=download&id=$1"
  mkdir -p .tmp
  curl -c .tmp/$1cookies "https://drive.google.com/uc?export=download&id=$1" > .tmp/$1intermezzo.html;
  curl -L -b .tmp/$1cookies "$(egrep -o "https.+download" .tmp/$1intermezzo.html)" > $2;
}

# some files are shared using an indirect download
function download-google-2(){
  echo "https://drive.google.com/uc?export=download&id=$1"
  mkdir -p .tmp
  curl -c .tmp/$1cookies "https://drive.google.com/uc?export=download&id=$1" > .tmp/$1intermezzo.html;
  code=$(egrep -o "confirm=(.+)&amp;id=" .tmp/$1intermezzo.html | cut -d"=" -f2 | cut -d"&" -f1)
  curl -L -b .tmp/$1cookies "https://drive.google.com/uc?export=download&confirm=$code&id=$1" > $2;
}

# used like this
download-google <id> <name of item.extension>

download-google-2 适合我。我的文件大小为 3G。谢谢@danieltan95
我将 download-google-2 的最后一个 curl 更新为这个 curl -L -b .tmp/$1cookies -C - "https://drive.google.com/uc?export=download&confirm=$code&id=$1" -o $2;,它现在可以继续下载。
似乎在低速下载时出了点问题。我发现的另一种方法。 qr.ae/pNrPaJ
下载谷歌工作正常。你能解释方法1和2之间的区别吗?
m
mmj

截至 2016 年 12 月 (source),没有任何答案对我有用:

curl -L https://drive.google.com/uc?id={FileID}

前提是 Google 云端硬盘文件已与拥有该链接的人共享,并且 {FileID} 是共享 URL 中 ?id= 后面的字符串。

虽然我没有检查过大文件,但我相信知道它可能很有用。


嗯......对我不起作用:(只是下载网页内容 - 而不是文件
curl -L -o {filename} https://drive.google.com/uc?id={FileID} 为我工作,谢谢!
这对我不起作用。我的链接如下(任何知道链接的人都可以查看):drive.google.com/file/d/0B7Jh6M91b83bdFlWX2RIU2hYSWM/…。我试过:<code>curl -O -J -L drive.google.com/uc?id=0B7Jh6M91b83bdFlWX2RIU2hYSWM</code>我得到了这个结果: curl: (56) Received HTTP code 403 from proxy after CONNECT
仅适用于最大 25MB 的文件,较大的文件会显示病毒扫描警告页面
C
CoderBlue

以上所有回答似乎都掩盖了答案的简单性,或者有一些未解释的细微差别。

如果文件是公开共享的,您只需知道文件 ID 即可生成直接下载链接。 URL 必须采用“https://drive.google.com/uc?id=[FILEID]&export=download”的形式 这适用于 2019 年 11 月 22 日。这不需要接收者登录谷歌,但需要公开共享文件。

在您的浏览器中,导航至 drive.google.com。右键单击该文件,然后单击“获取可共享链接”

https://i.stack.imgur.com/Z03bc.png

打开一个新标签,选择地址栏,然后粘贴剪贴板的内容,这将是可共享的链接。您将看到由 Google 查看器显示的文件。 ID 是 URL 的“查看”部分前面的数字:

https://i.stack.imgur.com/CY7wh.png

编辑 URL,使其采用以下格式,将“[FILEID]”替换为您共享文件的 ID:https://drive.google.com/uc?id=[FILEID]&export=download 这是您的直接下载链接.如果您在浏览器中单击它,文件现在将被“推送”到您的浏览器,打开下载对话框,允许您保存或打开文件。您也可以在下载脚本中使用此链接。所以等效的 curl 命令将是:

curl -L "https://drive.google.com/uc?id=AgOATNfjpovfFrft9QYa-P1IeF9e7GWcH&export=download" > phlat-1.0.tar.gz

这不适用于大文件:得到错误 Google Drive can't scan this file for viruses. <filename> is too large for Google to scan for viruses. Would you still like to download this file?
这行得通。谢谢!将链接转换为该格式后,您还可以使用 gdown ,如其他答案所示
这在 Linux 上对我有用,文件大小为 160MB:wget -r 'https://drive.google.com/uc?id=FILEID&export=download' -O LOCAL_NAME
m
mattbell87

我在使用 Google Drive 时遇到了同样的问题。

以下是我使用 Links 2 解决问题的方法。

在您的 PC 上打开浏览器,导航到您在 Google Drive 中的文件。给你的文件一个公共链接。将公共链接复制到剪贴板(例如右键单击,复制链接地址) 打开终端。如果您要下载到另一台 PC/服务器/机器,您应该 SSH 到它,因为此时安装链接 2(debian/ubuntu 方法,使用您的发行版或等效操作系统) sudo apt-get install links2 将链接粘贴到您的终端并使用这样的链接打开它: links2“在此处粘贴 url” 使用箭头键导航到链接中的下载链接,然后按 Enter 选择一个文件名,它将下载您的文件


Links 完全成功了!它比w3m好得多
这是唯一对我有用的东西! 2019 年 2 月。之前评论中的 gdown 应用程序由 google docs 托管,因此也无法下载。
a
aularon

使用youtube-dl

youtube-dl https://drive.google.com/open?id=ABCDEFG1234567890

您还可以通过 --get-url 来获取直接下载 URL。


@Ender 它仍然对我有用youtube-dl https://drive.google.com/open?id=ABCDEFG1234567890aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [GoogleDrive] ABCDEFG1234567890aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: Downloading webpage。也许您的 youtube-dl 版本过时,或者由于某种原因无法识别链接格式...尝试使用上面的格式将 id 替换为原始 URL 中的文件 id
youtube-dl 存在速率限制问题,偶尔会出现 HTTP Error 429: Too Many Requests 消息失败,尤其是当您使用托管服务提供商的 IP 时。
U
Utgarda

有一个用 Go 编写的开源多平台客户端:drive。它非常漂亮且功能齐全,并且正在积极开发中。

$ drive help pull
Name
        pull - pulls remote changes from Google Drive
Description
        Downloads content from the remote drive or modifies
         local content to match that on your Google Drive

Note: You can skip checksum verification by passing in flag `-ignore-checksum`

* For usage flags: `drive pull -h`

s
slm

我无法让 Nanoix 的 perl 脚本或我见过的其他 curl 示例工作,所以我开始自己在 python 中研究 api。这对于小文件来说效果很好,但是大文件会阻塞可用的内存,所以我发现了一些其他不错的分块代码,它使用了 api 的部分下载能力。要点在这里:https://gist.github.com/csik/c4c90987224150e4a0b2

请注意有关从 API 接口下载 client_secret json 文件到本地目录的信息。

资源

$ cat gdrive_dl.py
from pydrive.auth import GoogleAuth  
from pydrive.drive import GoogleDrive    

"""API calls to download a very large google drive file.  The drive API only allows downloading to ram 
   (unlike, say, the Requests library's streaming option) so the files has to be partially downloaded
   and chunked.  Authentication requires a google api key, and a local download of client_secrets.json
   Thanks to Radek for the key functions: http://stackoverflow.com/questions/27617258/memoryerror-how-to-download-large-file-via-google-drive-sdk-using-python
"""

def partial(total_byte_len, part_size_limit):
    s = []
    for p in range(0, total_byte_len, part_size_limit):
        last = min(total_byte_len - 1, p + part_size_limit - 1)
        s.append([p, last])
    return s

def GD_download_file(service, file_id):
  drive_file = service.files().get(fileId=file_id).execute()
  download_url = drive_file.get('downloadUrl')
  total_size = int(drive_file.get('fileSize'))
  s = partial(total_size, 100000000) # I'm downloading BIG files, so 100M chunk size is fine for me
  title = drive_file.get('title')
  originalFilename = drive_file.get('originalFilename')
  filename = './' + originalFilename
  if download_url:
      with open(filename, 'wb') as file:
        print "Bytes downloaded: "
        for bytes in s:
          headers = {"Range" : 'bytes=%s-%s' % (bytes[0], bytes[1])}
          resp, content = service._http.request(download_url, headers=headers)
          if resp.status == 206 :
                file.write(content)
                file.flush()
          else:
            print 'An error occurred: %s' % resp
            return None
          print str(bytes[1])+"..."
      return title, filename
  else:
    return None          


gauth = GoogleAuth()
gauth.CommandLineAuth() #requires cut and paste from a browser 

FILE_ID = 'SOMEID' #FileID is the simple file hash, like 0B1NzlxZ5RpdKS0NOS0x0Ym9kR0U

drive = GoogleDrive(gauth)
service = gauth.service
#file = drive.CreateFile({'id':FILE_ID})    # Use this to get file metadata
GD_download_file(service, FILE_ID) 

p
ppetraki

这适用于 2017 年 11 月https://gist.github.com/ppetraki/258ea8240041e19ab258a736781f06db

#!/bin/bash

SOURCE="$1"
if [ "${SOURCE}" == "" ]; then
    echo "Must specify a source url"
    exit 1
fi

DEST="$2"
if [ "${DEST}" == "" ]; then
    echo "Must specify a destination filename"
    exit 1
fi

FILEID=$(echo $SOURCE | rev | cut -d= -f1 | rev)
COOKIES=$(mktemp)

CODE=$(wget --save-cookies $COOKIES --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=${FILEID}" -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/Code: \1\n/p')

# cleanup the code, format is 'Code: XXXX'
CODE=$(echo $CODE | rev | cut -d: -f1 | rev | xargs)

wget --load-cookies $COOKIES "https://docs.google.com/uc?export=download&confirm=${CODE}&id=${FILEID}" -O $DEST

rm -f $COOKIES

尽管声明了“源网址”并且进行了一些解析,但我并没有尝试通过简单地直接使用此处称为 fileid 的内容以及在其他答案中作为第一个参数来理解它的工作原理。
@jan 这可能意味着有不止一种 url 样式。我很高兴它仍然对你有用。
R
Roshan Sethia

我找到了一个可行的解决方案......只需使用以下

wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1HlzTR1-YVoBPlXo0gMFJ_xY4ogMnfzDi' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1HlzTR1-YVoBPlXo0gMFJ_xY4ogMnfzDi" -O besteyewear.zip && rm -rf /tmp/cookies.txt

执行此操作时,我收到警告:无法验证 docs.google.com 的证书,由`/C=US/O=Google Trust Services/CN=Google Internet Authority G3' 颁发:无法在本地验证颁发者的权限。已发送 HTTP 请求,等待响应... 404 Not Found 2019-02-08 02:56:30 错误 404:未找到。任何解决方法?
哇!很好的答案,非常合乎逻辑。谢谢你写下来。使用此命令下载了 1.3 GB 文件...仅通过此命令从 linux 终端进行全自动模式。也在 GCP 上试过。在那里也很好用。 2020 年......我相信这是正确的方式......即使他们改变了一些命令,这也应该经得起时间的考验。
J
Jadli

从谷歌驱动器下载文件的简单方法,您也可以在 colab 上下载文件

pip install gdown

import gdown

然后

url = 'https://drive.google.com/uc?id=0B9P1L--7Wd2vU3VUVlFnbTgtS2c'
output = 'spam.txt'
gdown.download(url, output, quiet=False)

或者

fileid='0B9P1L7Wd2vU3VUVlFnbTgtS2c'

gdown https://drive.google.com/uc?id=+fileid

文档 https://pypi.org/project/gdown/


凉爽的。但它与您一年前发布的 phi's answer 有何不同?
G
Grey Christoforo

这是我今天编写的一个小 bash 脚本,它可以完成这项工作。它适用于大文件,也可以恢复部分获取的文件。它有两个参数,第一个是 file_id,第二个是输出文件的名称。与以前的答案相比,这里的主要改进是它适用于大文件并且只需要常用的工具:bash、curl、tr、grep、du、cut 和 mv。

#!/usr/bin/env bash
fileid="$1"
destination="$2"

# try to download the file
curl -c /tmp/cookie -L -o /tmp/probe.bin "https://drive.google.com/uc?export=download&id=${fileid}"
probeSize=`du -b /tmp/probe.bin | cut -f1`

# did we get a virus message?
# this will be the first line we get when trying to retrive a large file
bigFileSig='<!DOCTYPE html><html><head><title>Google Drive - Virus scan warning</title><meta http-equiv="content-type" content="text/html; charset=utf-8"/>'
sigSize=${#bigFileSig}

if (( probeSize <= sigSize )); then
  virusMessage=false
else
  firstBytes=$(head -c $sigSize /tmp/probe.bin)
  if [ "$firstBytes" = "$bigFileSig" ]; then
    virusMessage=true
  else
    virusMessage=false
  fi
fi

if [ "$virusMessage" = true ] ; then
  confirm=$(tr ';' '\n' </tmp/probe.bin | grep confirm)
  confirm=${confirm:8:4}
  curl -C - -b /tmp/cookie -L -o "$destination" "https://drive.google.com/uc?export=download&id=${fileid}&confirm=${confirm}"
else
  mv /tmp/probe.bin "$destination"
fi

欢迎来到 SO。如果您为此目的使用了任何参考资料,请将它们包含在您的答案中。无论如何,干得好+1
Y
Yesh

有一个更简单的方法。

从 firefox/chrome 扩展安装 cliget/CURLWGET。

从浏览器下载文件。这将创建一个 curl/wget 链接,该链接会记住下载文件时使用的 cookie 和标头。从任何 shell 使用此命令进行下载


这无疑是最简单和最简单的方法。
整洁,没有大惊小怪的方法。
E
Ender

在搞砸了这些垃圾之后。我找到了一种使用 chrome - 开发人员工具下载我的甜蜜文件的方法。

在您的 google 文档选项卡中,Ctr+Shift+J(设置 --> 开发人员工具)切换到网络选项卡在您的文档文件中,单击“下载”--> 下载为 CSV、xlsx、...。它会向您显示在“网络”控制台中请求右键单击-> 复制-> 复制为Curl 你的Curl 命令将是这样的,并添加-o 以创建导出的文件。 curl 'https://docs.google.com/spreadsheets/d/1Cjsryejgn29BDiInOrGZWvg/export?format=xlsx&id=1Cjsryejgn29BDiInOrGZWvg' -H '权威:docs.google.com' -H '升级不安全请求:1' -H '用户代理:Mozilla/5.0 (X..... -o server.xlsx

解决了!


该链接过期,一次只能用于 1 个 IP 地址
您可以发出一个无声的持续请求以保持会话处于活动状态。 @bluejayke
我正是这样做的,当来到这里写另一个答案时,偶然发现了你的答案。我确认它适用于不同的 IP,因为我需要将 36gb 文件下载到没有浏览器的服务器。我从笔记本电脑中提取了链接。
S
S V Praveen

替代方法,2020

适用于无头服务器。我试图下载一个 ~200GB 的私人文件,但无法让该线程中提到的任何其他方法起作用。

解决方案

(如果文件已经在您自己的 Google Drive 中,请跳过此步骤)将您要从公共/共享文件夹下载的文件复制到您的 Google Drive 帐户中。选择文件->右键单击->复制

https://i.stack.imgur.com/ORYfI.png

安装和设置 Rclone,一个开源命令行工具,用于在本地存储和 Google Drive 之间同步文件。这是为 Google Drive 安装和设置 rclone 的快速教程。使用 Rclone 将您的文件从 Google Drive 复制到您的机器

rclone copy mygoogledrive:path/to/file /path/to/file/on/local/machine -P

-P 参数有助于跟踪下载进度并让您知道下载何时完成。


V
Vikas Gautam

这是我想出将文件从 Google Drive 下载到我的 Google Cloud Linux shell 的解决方法。

使用高级共享将文件共享到 PUBLIC 并具有编辑权限。您将获得一个带有 ID 的共享链接。请参阅链接:- drive.google.com/file/d/[ID]/view?usp=sharing 复制该 ID 并将其粘贴到以下链接中:-

googledrive.com/host/[ID]

上面的链接将是我们的下载链接。使用 wget 下载文件:-

wget https://googledrive.com/host/[ID]

此命令将在您运行 wget 命令的同一位置下载名称为 [ID] 且没有扩展名且文件大小相同的文件。实际上,我在练习中下载了一个压缩文件夹。所以我使用以下命令重命名了那个尴尬的文件:-

mv [ID] 1.zip

然后使用

解压 1.zip

我们会得到文件。


谷歌已从驱动器中移除托管,因此这不再有效。
c
castaway2000

对于偶然发现此线程的任何人,自 2022 年 5 月起,以下工作可绕过对大文件的防病毒检查:

#!/bin/bash
fileid="FILEIDENTIFIER"
filename="FILENAME"
html=`curl -c ./cookie -s -L "https://drive.google.com/uc?export=download&id=${fileid}"`
curl -Lb ./cookie "https://drive.google.com/uc?export=download&`echo ${html}|grep -Po '(confirm=[a-zA-Z0-9\-_]+)'`&id=${fileid}" -o ${filename}

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅