469

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

我在网上查了很多资料,终于设法让其中一个下载。我得到了文件的 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的,但这不起作用。

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

4

40 回答 40

526

2021 年 11 月

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


指示

使用以下命令安装它:

pip install gdown

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

gdown https://drive.google.com/uc?id=<file_id>  # for files
gdown --id <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

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

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

应该看起来file_id像. 0Bz8a_Dbh9QhbNU3SGlFaDg您可以通过右键单击感兴趣的文件并选择Get link来找到此 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 将其制成单个文件以解决此限制。
于 2018-06-03T19:11:03.537 回答
213

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

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

从 Google Drive 下载大文件时,单个 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)
于 2016-08-30T10:29:15.510 回答
76

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


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

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

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

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

于 2014-07-30T09:39:55.547 回答
74

您可以使用开源的 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 Drive 文件 ID。为此,请右键单击 Google Drive 网站中的所需文件,然后选择“获取链接...”。它会返回类似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)。

于 2015-09-07T14:36:04.737 回答
65

2021 年 9 月

  • 首先,从谷歌驱动器中提取您想要的文件的 ID:

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

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

      右键获取共享链接

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

      在此处输入图像描述

  • 接下来,gdown使用以下命令安装 PyPI 模块pip

    pip install gdown

  • 最后,使用gdown和预期的 ID 下载文件:

    gdown --id <put-the-ID>


[注意]:

  • google-colab中,您必须使用!beforebash命令。
    (即!gdown --id 1-1wAx7b-USG0eQwIBVwVDUl3K1_1ReCt
  • 您应该将预期文件的权限从“受限”更改为“知道链接的任何人”。
于 2020-09-07T16:25:32.130 回答
62

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

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

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
于 2015-06-11T14:38:09.210 回答
58

更新至 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. 现在,通过在终端中运行此命令来保存文件并使文件可执行sudo chmod +x download-gdrive.sh
  8. 使用“./download-gdrive.sh”运行脚本。

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

于 2018-03-23T07:58:03.337 回答
57
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 
于 2016-08-13T23:08:29.410 回答
47

简单的方法:

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

  1. 转到包含下载链接的 Google Drive 网页
  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 :)

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

于 2017-05-06T03:09:31.570 回答
23

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

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

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

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

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

  1. 在 drive.google.com 打开云端硬盘并选择一个文件。
  2. 单击页面顶部的 共享按钮。
  3. 单击共享框右下角的 高级。
  4. 单击更改...。
  5. 在 web 上选择On-Public,然后单击Save
  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=en

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

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

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

https://www.googledrive.com/host/0B5IRsLTwEO6CVXFURmpQZ1Jxc0U
于 2015-02-25T23:59:11.833 回答
14

根据 Roshan Sethia 的回答

2018 年 5 月

使用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
    
于 2018-05-28T21:11:41.670 回答
11

- 更新 -

要下载文件首先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)

希望能帮助到你

于 2019-01-15T18:52:22.807 回答
9

最简单的方法是:

  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
于 2018-07-05T07:04:50.330 回答
8

以上答案在 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>
于 2020-04-14T05:35:53.270 回答
8

我一直在使用@Amit Chahar的卷曲片段,他在这个线程中发布了一个很好的答案。我发现将它放在 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
}

可以包含在例如 a 中~/.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
于 2019-12-10T12:24:44.833 回答
7

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

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

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

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

于 2016-12-30T01:36:50.097 回答
7

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

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

  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
于 2019-11-22T07:32:15.860 回答
6

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

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

  1. 在您的 PC 上打开浏览器,导航到您在 Google Drive 中的文件。给你的文件一个公共链接。

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

  3. 打开终端。如果您要下载到另一台 PC/服务器/机器,则此时应通过 SSH 连接到它

  4. 安装 Links 2(debian/ubuntu 方法,使用您的发行版或等效操作系统)

    sudo apt-get install links2

  5. 将链接粘贴到您的终端并使用以下链接打开它:

    links2 "paste url here"

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

  7. 选择一个文件名,它会下载你的文件

于 2015-11-17T05:37:16.573 回答
5

使用youtube-dl

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

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

于 2018-10-07T12:40:33.353 回答
4

我无法让 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) 
于 2015-01-02T22:39:25.787 回答
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`
于 2015-06-30T12:31:57.557 回答
4

这适用于 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
于 2017-11-08T21:01:57.583 回答
4

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

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
于 2018-01-13T09:48:07.903 回答
4

从谷歌驱动器下载文件的简单方法,您也可以在 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/

于 2019-09-27T22:14:00.460 回答
3

替代方法,2020

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

解决方案

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

演示 复制

  1. 安装和设置 Rclone,一个开源命令行工具,用于在本地存储和 Google Drive 之间同步文件。这是为 Google Drive 安装和设置 rclone的快速教程。

  2. 使用 Rclone 将您的文件从 Google Drive 复制到您的机器

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

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

于 2020-09-12T18:55:30.067 回答
3

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

  1. 在您的 google 文档选项卡上,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

解决了!

于 2019-04-22T10:01:56.277 回答
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
于 2017-04-18T17:26:48.840 回答
3

有一个更简单的方法。

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

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

于 2018-10-09T05:09:02.660 回答
2

这是我想出将文件从 Google Drive 下载到我的 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. 此命令将在您运行 wget 命令的同一位置下载名称为 [ID] 且没有扩展名且文件大小相同的文件。
  2. 实际上,我在练习中下载了一个压缩文件夹。所以我使用以下命令重命名了那个尴尬的文件:-

mv [ID] 1.zip

  1. 然后使用

解压 1.zip

我们会得到文件。

于 2015-09-24T13:20:18.097 回答
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***********是西班牙语,清除星号并让英文单词定位并调整 THE HEAD 和 CUT 数字以适应方法。

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
于 2018-05-05T20:26:36.443 回答
1

2020 年 7 月 - Windows 用户批处理文件解决方案

我想为 windows 用户添加一个简单的批处理文件解决方案,因为我只找到了 linux 解决方案,而且我花了几天的时间来学习所有这些为 windows 创建解决方案的东西。因此,为了将这项工作从可能需要它的其他人手中拯救出来,就在这里。

您需要的工具

  1. wget for windows(5KB exe小程序,无需安装)从这里下载。 https://eternallybored.org/misc/wget/

  2. jrepl for windows(117KB的小批处理文件程序,无需安装)这个工具类似于linux sed工具。从这里下载: https ://www.dostips.com/forum/viewtopic.php?t=6044

假设

%filename% - 您希望下载文件保存到的文件名。
%fileid% = google 文件 ID(之前已经解释过)

从谷歌驱动器下载小文件的批处理代码

wget -O "%filename%" "https://docs.google.com/uc?export=download&id=%fileid%"        

从谷歌驱动器下载大文件的批处理代码

set cookieFile="cookie.txt"
set confirmFile="confirm.txt"
   
REM downlaod cooky and message with request for confirmation
wget --quiet --save-cookies "%cookieFile%" --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=%fileid%" -O "%confirmFile%"
   
REM extract confirmation key from message saved in confirm file and keep in variable resVar
jrepl ".*confirm=([0-9A-Za-z_]+).*" "$1" /F "%confirmFile%" /A /rtn resVar
   
REM when jrepl writes to variable, it adds carriage return (CR) (0x0D) and a line feed (LF) (0x0A), so remove these two last characters
set confirmKey=%resVar:~0,-2%
   
REM download the file using cookie and confirmation key
wget --load-cookies "%cookieFile%" -O "%filename%" "https://docs.google.com/uc?export=download&id=%fileid%&confirm=%confirmKey%"
   
REM clear temporary files 
del %cookieFile%
del %confirmFile%
于 2020-07-09T17:39:54.197 回答
0

获取文件 ID:

1.在浏览器中转到您的 Google Drive。

2.右键单击要下载的文件,然后单击Get shareable link。链接如下所示:https://drive.google.com/file/d/XXX/view?usp=sharing。记下file ID XXX; 您将在下面需要它。

获取 OAuth 令牌:

1.前往OAuth 2.0 Playground

2.在Select & authorize APIs框中,向下滚动、展开Drive API v3并选择https://www.googleapis.com/auth/drive.readonly

3.单击Authorize APIs,然后Exchange authorization code for tokens。复制Access token YYY; 您将在下面需要它。

从命令行下载文件:

如果使用 OS X 或 Linux,请打开“终端”程序并输入以下命令。

curl -H "Authorization: Bearer YYY" https://www.googleapis.com/drive/v3/files/XXX?alt=media -o ZZZ 

如果使用 Windows,请打开“PowerShell”程序并输入以下命令。

Invoke-RestMethod -Uri https://www.googleapis.com/drive/v3/files/XXX?alt=media -Method Get Headers @{"Authorization"="Bearer YYY"} -OutFile ZZZ

在您的命令中,替换XXX为上面的文件 ID、上面YYY的访问令牌以及ZZZ将保存的文件名(例如,如果您正在下载 zip 文件,则为“myFile.zip”)。

于 2022-01-09T11:28:49.643 回答
0

仅使用 Google Drive API 的解决方案

在运行下面的代码之前,您必须激活 Google Drive API、安装依赖项并使用您的帐户进行身份验证。说明可以在原始的Google Drive API 指南页面上找到

import io
import os
import pickle
import sys, argparse
from googleapiclient.discovery import build
from google.auth.transport.requests import Request
from googleapiclient.http import MediaIoBaseDownload
from google_auth_oauthlib.flow import InstalledAppFlow

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/drive.readonly']


def _main(file_id, output):
    """ Shows basic usage of the Drive v3 API.
        Prints the names and ids of the first 10 files the user has access to.
    """
    if not file_id:
        sys.exit('\nMissing arguments. Correct usage:\ndrive_api_download.py --file_id <file_id> [--output output_name]\n')
    elif not output:
        output = "./" + file_id
    
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('drive', 'v3', credentials=creds)

    # Downloads file
    request = service.files().get_media(fileId=file_id)
    fp = open(output, "wb")
    downloader = MediaIoBaseDownload(fp, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk(num_retries=3)
        print("Download %d%%." % int(status.progress() * 100))

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', '--file_id')
    parser.add_argument('-o', '--output')
    args = parser.parse_args()
    
    _main(args.file_id, args.output)
于 2020-11-30T16:47:46.270 回答
0

我使用 python 脚本和 google drive api 做到了这一点,你可以试试这个片段:

//using chunk download

file_id = 'someid'
request = drive_service.files().get_media(fileId=file_id)
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print "Download %d%%." % int(status.progress() * 100)
于 2019-07-04T13:37:12.037 回答
0

2020 年 11 月

如果您更喜欢使用 bash 脚本,这对我有用:(5Gb 文件,公开可用)

#!/bin/bash
if [ $# != 2 ]; then
echo "Usage: googledown.sh ID save_name"
exit 0
fi
confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id='$1 -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')
echo $confirm
wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$confirm&id=$1" -O $2 && rm -rf /tmp/cookies.txt
于 2020-11-24T13:12:01.757 回答
0

2018 年 5 月

如果您想使用curl从 Google Drive 下载文件,除了驱动器中的文件 id,您还需要access_tokenGoogle Drive API 的 OAuth2。获取令牌涉及使用 Google API 框架的几个步骤。Google 的注册步骤(目前)是免费的。

OAuth2 access_token 可能允许各种活动,所以要小心。此外,令牌会在片刻(1 小时?)后超时,但如果有人捕获它,则不足以防止滥用。

一旦你有了 access_token 和 fileid,这将起作用:

AUTH="Authorization: Bearer the_access_token_goes_here"
FILEID="fileid_goes_here"
URL=https://www.googleapis.com/drive/v3/files/$FILEID?alt=media
curl --header "$AUTH" $URL >myfile.ext

另请参阅:Google Drive APIs -- REST -- 下载文件

于 2018-05-23T06:58:15.517 回答
0

skicka是一个 cli 工具,用于从 google-drive 上传、下载访问文件。

例子 -

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
于 2018-01-14T09:50:23.517 回答
0

获取可共享链接并以隐身方式打开它(非常重要)。它会说它无法扫描。

打开检查器并跟踪网络流量。单击“仍然下载”按钮。

复制最后一次请求的 url。这是你的链接。在 wget 中使用它。

于 2018-12-06T00:17:31.467 回答
0

你只需要使用 wget :

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

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

于 2018-09-11T00:55:20.057 回答
-4

最简单的方法是将您想要下载的内容放在一个文件夹中。共享该文件夹,然后从 URL 栏中获取文件夹 ID。

然后转到https://googledrive.com/host/[ID] (将 ID 替换为您的文件夹 ID)您应该会看到该文件夹​​中所有文件的列表,单击要下载的文件。然后下载应该访问您的下载页面(Chrome 上的 Ctrl+J),然后您要复制下载链接,然后使用 wget“下载链接”

享受 :)

于 2016-09-06T12:41:06.347 回答