Google云端硬盘中的wget / curl大文件


304

我正在尝试通过脚本从Google驱动器下载文件,但这样做有点麻烦。我要下载的文件在这里

我已经在网上进行了广泛的搜索,终于设法下载了其中之一。我得到了文件的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

我得到以下输出- 在此处输入图片说明

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

希望这里有人可以帮助您!


您能提供curl script您用来从中下载文件的文件吗,google drive因为我无法从此脚本中下载工作文件(图像)curl -u username:pass https://drive.google.com/open?id=0B0QQY4sFRhIDRk1LN3g2TjBIRU0 >image.jpg
Kasun Siyambalapitiya

查看接受的答案。我使用了gdown.pl脚本gdown.pl https://drive.google.com/uc?export=download&confirm=yAjx&id=0Bz-w5tutuZIYY3h5YlMzTjhnbGM index4phlat.tar.gz
Arjun

2
不要害怕滚动!这个答案提供了一个非常漂亮的python脚本,可以一次下载。
西普里安·托莫阿格(CiprianTomoiagă),2013年

./gdrive下载[文件ID] [-如果是文件夹则为递归文件],它将要求您访问给定的URL并复制粘贴令牌代码。
roj4s

Answers:


60

警告:不建议使用此功能。请参阅以下注释中的警告。


看一下这个问题:使用Google Drive API从Google Drive直接下载

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

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

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


5
另一个好方法是使用Linux命令行工具“ gdrive” github.com/prasmussen/gdrive
Tobi,

1
我能够将Nanolx的perl脚本与在gdurl.com创建的Google驱动器永久链接结合使用- 谢谢
jadik

14
警告:Google云端硬盘中的网络托管支持已弃用。“从2015年8月31日开始,将不再支持用户和开发人员在Google云端硬盘中托管网络。在通过googledrive.com/host提供内容时,Google Apps客户可以继续使用此功能一年,直到2016年8月31日。 / doc id将停止使用。” googleappsupdates.blogspot.com/2015/08/...
chrish

9
不幸的是,从2018
起这将

2
gdown.pl对我来说也很棒。快速查看脚本会发现它没有使用该API,它会创建一个带有参数的新URL,export=download因此,在可预见的将来它应该是好的,除非google更改该URL方案
Ben Baron

228

2020年6月

file_id应该是这个样子0Bz8a_Dbh9QhbNU3SGlFaDg

您可以通过右键单击文件然后获取可共享链接来获取它。 仅适用于开放式访问文件(任何具有链接的人都可以查看)。不适用于目录。在Google Colab上测试。最适合下载文件。使用tar / zip使其成为单个文件。

示例:从此目录下载自述文件

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

9
只需export=download&从中移除gdown https://drive.google.com/uc?export=download&id=your_file_id,它就可以像魅力一样工作
Saravanabalagi Ramachandran

8
这个工作于2018年7月!记住要共享的文件,如果你有链接的drive.google.com/open?id=FILE_ID只需更换“开放”与“UC”,只是gdown drive.google.com/uc?id=FILE_ID
simo23

7
我们如何使用gdown从Gdrive下载文件夹?
user1

7
从2019年8月开始不起作用。错误:“权限被拒绝:drive.google.com/uc?id=0B7EVK8r0v71pWEZsZE9oNnFzTm8?也许您需要更改对“具有链接的任何人”的许可?” 这是可公开下载的CelebA数据集,所以应该没问题。我通过单击“获取可共享的链接”获取下载链接,然后说“链接共享已打开”,并且“知道链接的任何人都可以查看它”。因此,看起来该权限已被授予,但错误显示权限被拒绝。如果您想尝试一下,这里是托管网站:mmlab.ie.cuhk.edu.hk/projects/CelebA.html
克里斯托夫

6
这是我尝试的六种方法中唯一可行的解​​决方案。它需要提高到第一个。我只需要将“共享链接”从:drive.google.com/open?
id=XXXX

194

我编写了一个Python代码段,并提供了一个可共享的链接,该代码段可从Google云端硬盘下载文件。它的工作原理,截至2017年八月

片段不使用gdrive,也不使用Google Drive API。它使用请求模块。

从Google云端硬盘下载大文件时,单个GET请求是不够的。需要第二个,这个有一个额外的URL参数,称为Confirm,其值应等于某个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。这是正确的运行方式吗?如果目标是文件夹,则引发错误。如果我处理一个文件并将其用作目标,则该片段似乎可以正常工作,但是什么也不做。
曼弗雷多

2
@Manfredo,您需要保存文件的文件名,例如,$ python snippet.py your_google_file_id /your/full/path/and/filename.xlsx 对我有用 。如果不起作用,您是否提供任何输出?是否创建任何文件?
杰夫

1
@CiprianTomoiaga使用tqdm Python模块,我有90%的进度条正在工作。我提出了要点:gist.github.com/joshtch/8e51c6d40b1e3205d1bb2eea18fb57ae。不幸的是,我还没有找到一种可靠的方法来获取文件的总大小,这是计算进度百分比和估计完成时间所需的。
joshtch

另外,请求模块使用哪种身份验证来访问Google驱动器?OAuth?例如,在上面的代码这是哪里处理- requests-oauthlib.readthedocs.io/en/latest/...
tauseef_CuriousGuy

7
这太棒了!这是drive_File_ID的提示:https // drive.google.com / file / d /“ drive_File_ID” / view-在https ~~ file / d /和/ view的下载链接之间。
Jaeyoung Lee,

70

您可以使用开源Linux / Unix命令行工具gdrive

要安装它:

  1. 下载二进制文件。例如,选择一个适合您的体系结构的gdrive-linux-x64

  2. 将其复制到您的路径。

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

要使用它:

  1. 确定Google云端硬盘文件ID。为此,请在Google云端硬盘网站上右键单击所需的文件,然后选择“获取链接...”。它将返回类似https://drive.google.com/open?id=0B7_OwkDsUIgFWXA1B2FPQfV5S8H。获取后面的字符串?id=并将其复制到剪贴板。那就是文件的ID。

  2. 下载文件。当然,请在以下命令中使用文件的ID。

    gdrive download 0B7_OwkDsUIgFWXA1B2FPQfV5S8H
    

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

资料来源: Tobi在这里对另一个答案的评论

 

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

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

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


错误消息:“超出了未经身份验证的使用的每日限制。要继续使用需要注册。”,代码:403
Nianliang

@Nianliang还没有遇到这种情况,但这是一个猜测:您使用gdrive下载了可公开访问的文件,因此在初次使用时不会要求您进行身份验证。首先尝试使用非公共文件,确保身份验证成功(如答案中的描述:“初次使用...”)。有帮助吗?
tanius '16

3
无法获取验证码。收到错误消息:“暂时禁用了此应用的Google登录功能。该应用尚未通过Google验证,可以使用Google登录。”
useranon

1
此处出现相同的错误消息:“此应用尚未通过Google验证才能使用Google登录。”
gebbissimo

1
@useranon:尝试以下解决方案:github.com/gdrive-org/gdrive/issues/533#issuecomment-596336395,您需要创建一个Google服务帐户并与该服务帐户地址共享文件/文件夹。我做的。从2020年4月17日开始生效!
whyisyoung

52
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跟随重定向
-O远程名称
-J远程标题名称

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}" 

要从网址提取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以上文件上的病毒警告。

1
太好了 我确实必须将--insecure选项添加到两个curl请求中才能使其工作。
泰勒R

@lapinpt我如何添加简历功能?
steven7mwesigwa

如果我们有指向该文件的公共链接,是否可以以某种方式摆脱Google ID?
oarfish '19

42

截至2018年3月更新。

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

因此,作为其他人的信息,这是我成功完成的方法:

  1. 右键单击要下载的文件,单击共享,在链接共享部分下,选择“具有此链接的任何人都可以编辑”。
  2. 复制链接。应采用以下格式:https://drive.google.com/file/d/FILEIDENTIFIER/view?usp=sharing
  3. 从链接复制FILEIDENTIFIER部分。
  4. 将以下脚本复制到文件中。它使用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}
    
  5. 如上所示,将FILEIDENTIFIER粘贴到脚本中。记住要保留双引号!

  6. 提供文件名代替FILENAME。请记住保留双引号,并在FILENAME中包含扩展名(例如myfile.zip)。
  7. 现在,通过在terminal中运行此命令来保存文件并使文件可执行sudo chmod +x download-gdrive.sh
  8. 使用“ ./download-gdrive.sh”运行脚本。

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


wget的替代-c--save-cookies-b--load-cookies
untore

3
确认对我有用。worked,为清楚起见进行了一些编辑
Jeff Atwood,

1
将于2019年1月开始工作。我需要在最后一行加上"引号${filename}
Jimbo,

>使用./download-gdrive.sh" Do not be like me and try to run the script by typing download-gdrive.sh 运行脚本, the 。/`似乎是必需的。
Ambroise Rabier


29

这是一种快速的方法。

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

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

2
嗨,谢谢回复。如果查看我共享的链接上的文件,将会看到共享文件时,它们在链接中缺少'authuser = 0'标签。您的方法不适用于提供的文件!Arjun
Arjun 2015年

2
甚至没有尝试使用公共访问,这一选项对于仅链接共享文件atow来说效果很好。像这样使用它:wget 'https://docs.google.com/uc?export=download&id=SECRET_ID' -O 'filename.pdf'
Sampo Sarrala-codidact.org

从2018年开始无法使用,我正在获得防病毒扫描网页而不是文件。
Calimo

7
当与-r标记一起使用时,它将在2018年为我绕过防病毒扫描程序wget。就是这样wget --no-check-certificate -r 'https://docs.google.com/uc?export=download&id=FILE_ID' -O 'filename'
Artem Pelenitsyn

1
从10/2019开始为我工作,对于将文件放入正在运行的Docker容器中几乎没有任何实用程序应用程序的我来说,这是一个完美的解决方案。
ammills01

23

谷歌驱动器的默认行为是扫描文件中的病毒,如果文件过大,则会提示用户并通知用户无法扫描该文件。

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

从Google云端硬盘帮助页面引用:

借助云端硬盘,您可以使Web资源(如HTML,CSS和Javascript文件)在网站上可见。

要使用云端硬盘托管网页,请执行以下操作:

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

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

因此,例如,当您在Google驱动器上公开共享文件时,共享链接如下所示:

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

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

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

1
您确定@FıratKÜÇÜK的网址格式正确吗?(请注意www.googledrive.com,而不要注意drive.google.com)。
查尔斯·森林

我的文件超过50 MB。它要求病毒扫描确认。因此,该解决方案不适合我的情况。相反,我使用了“ gdrive”控制台应用程序解决方案。
的Firat KUCUK

@FıratKÜÇÜK我刚刚设法用这种方法下载了200+ Mb文件,该文件通常会触发病毒检查。我从右键单击>“获取共享链接”中获得了ID。
西罗Santilli郝海东冠状病六四事件法轮功


11
此功能已弃用,不再受支持
Daniel G

19

简单的方法:

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

  1. 转到具有下载链接的Google云端硬盘网页
  2. 打开浏览器控制台,然后转到“网络”标签
  3. 点击下载链接
  4. 等待文件开始下载,然后找到相应的请求(应该是列表中的最后一个),然后可以取消下载
  5. 右键单击请求,然后单击“复制为cURL”(或类似名称)

您应该以如下形式结束:

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

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


工作于2019
techkuz19年

作品2020年2月的
Jivan

12

根据Roshan Sethia的回答

2018年五月

使用WGET

  1. 创建一个名为wgetgdrive.sh的shell脚本,如下所示:

    #!/bin/bash
    
    # Get files from Google Drive
    
    # $1 = file ID
    # $2 = file name
    
    URL="https://docs.google.com/uc?export=download&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
    
  2. 授予执行脚本的正确权限

  3. 在终端中,运行:

    ./wgetgdrive.sh <file ID> <filename>
    

    例如:

    ./wgetgdrive.sh 1lsDPURlTNzS62xEOAIG98gsaW6x2PYd2 images.zip
    

1
就像“谢谢”这样,可以缓解问题:chmod 770 wgetgdrive.sh
Mohamed Kawsara

8

- 更新 -

首先下载文件 youtube-dl从此处适用于python:

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

更新:

我刚发现:

  1. 右键单击要从drive.google.com下载的文件

  2. 请点击 Get Sharable link

  3. 开启 Link sharing on

  4. 点击 Sharing settings

  5. 单击顶部下拉列表中的选项

  6. 点击更多

  7. 选择 [x] On - Anyone with a link

  8. 复制链接

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

在以下位置复制ID https://drive.google.com/file/d/

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)

希望能帮助到你


1
嗨,谢谢,我尝试了这个,当我从命令提示符运行时它正在下载,但是有没有办法像在服务器上访问那样获得实际的“直接链接”呢?我正在尝试运行节点{spawn},但是必须将其下载到节点服务器,然后从那里再次下载它,有没有办法简单地从Google驱动器获取直接下载链接?他们使用什么链接?
bluejayke

我现在必须经常使用此方法,因此我将尝试使其完全自动化。只需获取google链接,剩下的将由Python脚本完成。我想我会用硒来做到这一点。在工作时将更新我的解决方案。
jturi

更新了我的答案。现在,只需单击两次即可使用youtube-dl下载任何文件。
jturi

7

截至2016年12月,没有答案提出对我有用的建议(来源):

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

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

尽管我没有检查大文件,但我相信了解它可能会很有用。


嗯......没有为我工作:(刚刚下载的网页内容-而不是文件
kgingeri

1
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)在CONNECT
Steve

7
仅适用于最大25MB的文件,较大的文件会显示病毒扫描警告页面
cen

6

最简单的方法是:

  1. 创建下载链接并复制fileID
  2. 使用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 FILENAME && rm -rf /tmp/cookies.txt

1
非常感谢!令人难以置信的有用
Nicholas Pipitone

6

由于google驱动器现在使用重定向到文件的实际位置,因此上述答案在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>

1
download-google-2为我工作。我的文件大小为3G。感谢@ danieltan95
Saurabh Kumar

我已将download-google-2的最后一个更新更新为此curl -L -b .tmp/$1cookies -C - "https://drive.google.com/uc?export=download&confirm=$code&id=$1" -o $2;,现在可以恢复下载。
ssi-anik

低速下载似乎出了点问题。我发现了另一种方法。qr.ae/pNrPaJ
ssi-

5

我在Google云端硬盘中遇到了同样的问题。

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

  1. 打开PC上的浏览器,导航到Google云端硬盘中的文件。给您的文件一个公共链接。

  2. 将公共链接复制到剪贴板(例如,右键单击,复制链接地址)

  3. 打开一个终端。如果您要下载到另一台PC /服务器/计算机,则应该使用SSH进行连接

  4. 安装链接2(debian / ubuntu方法,使用您的发行版或等效的OS)

    sudo apt-get install links2

  5. 将链接粘贴到您的终端中,然后使用“链接”将其打开,如下所示:

    links2 "paste url here"

  6. 使用箭头键导航到“链接”中的下载链接,然后按 Enter

  7. 选择一个文件名,它将下载您的文件


Links完全做到了!它比w3m
alvas

1
这是唯一对我有用的东西!2019年2月。早期注释中的gdown应用程序由google docs托管,因此也无法下载。
史蒂芬

5

使用youtube-dl

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

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


1
@Ender仍然对我有用youtube-dl https://drive.google.com/open?id=ABCDEFG1234567890aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [GoogleDrive] ABCDEFG1234567890aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: Downloading webpage。也许您的版本过旧youtube-dl或由于某种原因而无法识别链接格式...尝试使用上述格式,用您原始URL中的文件ID替换ID
Aularon,

5

我一直在使用@ Amit Chahar的curl片段,他在此主题中发布了一个很好的答案。我发现将其放在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 -fr cookie
}

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

   $ curl_gdrive 153bpzybhfqDspyO_gdbcG5CMlI19ASba imagenet.tar

这可能是最好的答案...蟒蛇gdown是这样比较重。我必须说我对gdrive非常不满意……
smaudet

1
rm命令中既不需要-f也不需要-r。如果您教别人总是“ rm -rf”,他们可能最终会删除他们想要保留的东西……
josch

4

有一个开源的多平台客户端,用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`

4

以上所有答案似乎掩盖了答案的简单性,或者有些细微之处未解释。

如果文件是公开共享的,则只需知道文件ID,即可生成直接下载链接。该网址的格式必须为“ https://drive.google.com/uc?id=[FILEID]&export=download ”,此版本自2019年11月22日起生效。这不要求接收者登录google,但要求文件公开共享。

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

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

右键单击获取共享链接

  1. 打开一个新选项卡,选择地址栏,然后粘贴剪贴板内容(将成为共享链接)。您会看到Google查看器显示的文件。ID是URL的“查看”部分正前方的数字:

在此处输入图片说明

  1. 编辑URL,使其具有以下格式,将“ [FILEID]”替换为共享文件的ID:

    https://drive.google.com/uc?id=[FILEID]&export=download

  2. 这是您的直接下载链接。如果您在浏览器中单击它,则文件现在将被“推送”到浏览器中,打开下载对话框,使您可以保存或打开文件。您也可以在下载脚本中使用此链接。

  3. 因此,等效的curl命令将是:

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

2
这不适用于大文件:收到错误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?
Rekovni

这工作了。谢谢!将链接转换为该格式后,您还可以使用gdown,如其他答案所示
Harry M

3

我无法使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) 

3

这是我写的一个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
M--

3

自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

尽管声明了“源URL”并且进行了一些解析,但我并没有尝试通过直接使用这里称为fileid的文件以及其他答案作为第一个参数来理解它的工作原理。

@jan可能意味着不止一种URL样式。我很高兴它仍然对您有用。
ppetraki

3

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

  1. 在您的google docs标签上,点击Ctr + Shift + J(设置->开发人员工具)
  2. 切换到网络标签
  3. 在您的文档文件中,点击“下载”->以CSV,xlsx等格式下载。
  4. 它将在“网络”控制台中向您显示请求 在此处输入图片说明

  5. 右键单击->复制->复制为卷曲

  6. 您的Curl命令将像这样,并添加-o以创建导出文件。 curl 'https://docs.google.com/spreadsheets/d/1Cjsryejgn29BDiInOrGZWvg/export?format=xlsx&id=1Cjsryejgn29BDiInOrGZWvg' -H 'authority: docs.google.com' -H 'upgrade-insecure-requests: 1' -H 'user-agent: Mozilla/5.0 (X..... -o server.xlsx

解决了!


该链接过期,一次仅用于1个IP地址
bluejayke,

您可以只发出一个无休止的常数请求,以保持会话继续进行。@bluejayke
安德

我正是这样做的,当我来这里写下另一个答案时,偶然发现了您的答案。我确认它可以与其他IP配合使用,因为我需要将36gb文件下载到没有浏览器的服务器上。然后从笔记本电脑中提取了链接。
dmitry502

2

这是我从Google云端硬盘下载文件到Google Cloud Linux shell的解决方法。

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

googledrive.com/host/[ID]

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

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

  1. 此命令将下载名称为[ID]的文件,没有扩展名,但是在运行wget命令的相同位置具有相同的文件大小。
  2. 实际上,我在实践中下载了一个压缩文件夹。所以我使用以下命令重命名了这个笨拙的文件:

mv [ID] 1.zip

  1. 然后使用

解压缩1.zip

我们将获取文件。



Google已从驱动器中删除了托管服务,因此这不再起作用。
kgingeri '17

2

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

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

这样做时,我得到警告:无法验证由/ C = US / O = Google Trust Services / CN = Google Internet Authority G3颁发的docs.google.com的证书:无法在本地验证发行者的授权。HTTP请求已发送,正在等待响应... 404未找到2019-02-08 02:56:30错误404:未找到。任何解决方法?
bluejayke

哇!很好的答案,很合逻辑。感谢您编写它。使用此命令下载了1.3 GB文件...仅通过此命令从linux终端处于全自动模式。还尝试过GCP。在那里也很好。2020年...我相信这是正确的方法...即使他们更改了一些命令,这也应该经受住时间的考验。
阿塔·朱特

2

有一种更简单的方法。

从Firefox / chrome扩展程序安装cliget / CURLWGET。

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


毫无疑问,这是最简单,最简单的方法。
c0degeas

2

从Google驱动器下载文件的简便方法,也可以在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一年前发布的答案有何不同?
umläute,

1

2018年5月工作

嗨,基于此评论...我创建了一个bash,将URL列表从文件URLS.txt导出URLS_DECODED.txt 并在诸如flashget之类的某些加速器中使用(我使用cygwin组合Windows和linux)

引入了命令蜘蛛以避免下载并获得最终链接(直接)

命令GREP HEAD和CUT,处理并获得最终链接,基于西班牙语,也许您可​​以移植到英语

echo -e "$URL_TO_DOWNLOAD\r" 可能\ r只是cywin,必须替换为\ n(换行)

**********user*********** 是用户文件夹

*******Localización*********** 使用西班牙语,请清除星号,并让英语中的单词定位,并调整“头”和“剪切”编号以适合使用。

rm -rf /home/**********user***********/URLS_DECODED.txt
COUNTER=0
while read p; do 
    string=$p
    hash="${string#*id=}"
    hash="${hash%&*}"
    hash="${hash#*file/d/}"
    hash="${hash%/*}"
    let COUNTER=COUNTER+1
    echo "Enlace "$COUNTER" id="$hash
    URL_TO_DOWNLOAD=$(wget --spider --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='$hash -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id="$hash 2>&1 | grep *******Localización***********: | head -c-13 | cut -c16-)
    rm -rf /tmp/cookies.txt
    echo -e "$URL_TO_DOWNLOAD\r" >> /home/**********user***********/URLS_DECODED.txt
    echo "Enlace "$COUNTER" URL="$URL_TO_DOWNLOAD
done < /home/**********user***********/URLS.txt

1

您只需要使用wget与:

 https://drive.google.com/uc?authuser=0&id=[your ID without brackets]&export=download

PD。该文件必须是公共的。


0

skicka是一个cli工具,用于从Google驱动器上载,下载访问文件。

例子-

skicka download /Pictures/2014 ~/Pictures.copy/2014
10 / 10 [=====================================================] 100.00 % 
skicka: preparation time 1s, sync time 6s
skicka: updated 0 Drive files, 10 local files
skicka: 0 B read from disk, 16.18 MiB written to disk
skicka: 0 B uploaded (0 B/s), 16.18 MiB downloaded (2.33 MiB/s)
skicka: 50.23 MiB peak memory used
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.