我正在尝试以脚本从谷歌驱动器下载文件,但这样做有点麻烦。我要下载的文件是 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 https://drive.google.com/uc?export=download&confirm=yAjx&id=0Bz-w5tutuZIYY3h5YlMzTjhnbGM index4phlat.tar.gz
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 将其制成单个文件以解决此限制。
我写了一个 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
。这是运行它的正确方法吗?因为如果目的地是一个文件夹,我会抛出一个错误。如果我整理了一个文件并将其用作目标,则该片段似乎可以正常工作,但什么也不做。
$ python snippet.py your_google_file_id /your/full/path/and/filename.xlsx
为我工作。如果这不起作用,您是否提供任何输出?是否创建了任何文件?
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)
您应该将预期文件的权限从“受限”更改为“知道链接的任何人”。
requests.exceptions.MissingSchema: Invalid URL '': No schema supplied. Perhaps you meant http://?
错误。
https://drive.google.com/file/d/
和 /view
之前复制了文件的 ID?您是否在文件中添加了正确的权限?
自 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
以有限的最大速率下载(以免淹没网络……),您可以使用如下命令(pv
是 PipeViewer):
gdrive download --stdout 0B7_OwkDsUIgFWXA1B2FPQfV5S8H | \
pv -br -L 90k | cat > file.ext
这将显示下载的数据量 (-b
) 和下载速率 (-r
),并将该速率限制为 90 kiB/s (-L 90k
)。
警告:此功能已弃用。请参阅下面的评论中的警告。
看看这个问题:Direct download from Google Drive using Google Drive API
基本上,您必须创建一个公共目录并通过相对引用访问您的文件,例如
wget https://googledrive.com/host/LARGEPUBLICFOLDERID/index4phlat.tar.gz
或者,您可以使用此脚本:https://github.com/circulosmeos/gdown.pl
export=download
的新 URL,因此在可预见的将来它应该是好的,除非谷歌更改该 URL 方案
这是执行此操作的快速方法。
确保链接是共享的,它看起来像这样:
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
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'
https://drive.google.com/file/d/FILEID/view?usp=sharing
。
更新至 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
-c
替换为 --save-cookies
并将 -b
替换为 --load-cookies
${filename}
周围添加 "
引号。
./download-gdrive.sh" Do not be like me and try to run the script by typing
download-gdrive.sh, the
./` 运行脚本似乎是强制性的。
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
--insecure
选项才能使其正常工作。
简单的方法:
(如果您只需要一次性下载)
转到有下载链接的 Google Drive 网页打开浏览器控制台并转到“网络”选项卡单击下载链接等待文件开始下载,并找到相应的请求(应该是列表中的最后一个),然后您可以取消下载右键单击请求并单击“复制为cURL”(或类似)
你应该最终得到类似的东西:
curl 'https://doc-0s-80-docs.googleusercontent.com/docs/securesc/aa51s66fhf9273i....................blah blah blah...............gEIqZ3KAQ==' --compressed
将其粘贴到您的控制台中,将 > my-file-name.extension
添加到末尾(否则它会将文件写入您的控制台),然后按 Enter :)
该链接确实有某种过期,因此在生成第一个请求的几分钟后开始下载将不起作用。
curl
命令,附加 > file.ext
并且都运行良好(并在 10 秒内下载到 AWS 实例)。
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
根据 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
chmod 770 wgetgdrive.sh
- 更新 -
要下载文件,请先从此处获取 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)
希望能帮助到你
我一直在使用 @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
-fr
非常危险
最简单的方法是:
创建下载链接并复制 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
以上答案在 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=(.+)&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;
,它现在可以继续下载。
截至 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}
为我工作,谢谢!
以上所有回答似乎都掩盖了答案的简单性,或者有一些未解释的细微差别。
如果文件是公开共享的,您只需知道文件 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?
wget -r 'https://drive.google.com/uc?id=FILEID&export=download' -O LOCAL_NAME
我在使用 Google Drive 时遇到了同样的问题。
以下是我使用 Links 2 解决问题的方法。
在您的 PC 上打开浏览器,导航到您在 Google Drive 中的文件。给你的文件一个公共链接。将公共链接复制到剪贴板(例如右键单击,复制链接地址) 打开终端。如果您要下载到另一台 PC/服务器/机器,您应该 SSH 到它,因为此时安装链接 2(debian/ubuntu 方法,使用您的发行版或等效操作系统) sudo apt-get install links2 将链接粘贴到您的终端并使用这样的链接打开它: links2“在此处粘贴 url” 使用箭头键导航到链接中的下载链接,然后按 Enter 选择一个文件名,它将下载您的文件
Links
完全成功了!它比w3m
好得多
使用youtube-dl!
youtube-dl https://drive.google.com/open?id=ABCDEFG1234567890
您还可以通过 --get-url
来获取直接下载 URL。
youtube-dl https://drive.google.com/open?id=ABCDEFG1234567890aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [GoogleDrive] ABCDEFG1234567890aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: Downloading webpage
。也许您的 youtube-dl
版本过时,或者由于某种原因无法识别链接格式...尝试使用上面的格式将 id 替换为原始 URL 中的文件 id
HTTP Error 429: Too Many Requests
消息失败,尤其是当您使用托管服务提供商的 IP 时。
有一个用 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`
我无法让 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)
这适用于 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
我找到了一个可行的解决方案......只需使用以下
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
从谷歌驱动器下载文件的简单方法,您也可以在 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/
这是我今天编写的一个小 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
有一个更简单的方法。
从 firefox/chrome 扩展安装 cliget/CURLWGET。
从浏览器下载文件。这将创建一个 curl/wget 链接,该链接会记住下载文件时使用的 cookie 和标头。从任何 shell 使用此命令进行下载
在搞砸了这些垃圾之后。我找到了一种使用 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
解决了!
替代方法,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
参数有助于跟踪下载进度并让您知道下载何时完成。
这是我想出将文件从 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
我们会得到文件。
对于偶然发现此线程的任何人,自 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}
gdown https://drive.google.com/uc?export=download&id=your_file_id
中删除export=download&
,它就会像魅力一样发挥作用