从谷歌驱动器wget / curl大文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从谷歌驱动器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

我得到以下输出 - enter image description here

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

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

提前致谢。

答案

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

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

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

警告:不推荐使用此功能。请参阅评论中的以下警告。

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

另一答案

根据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 /p')&id=$1" -O $2 && rm -rf /tmp/cookies.txt
  2. 授予执行脚本的权限
  3. 在终端中,运行: ./wgetgdrive.sh <file ID> <filename> 例如: ./wgetgdrive.sh 1lsDPURlTNzS62xEOAIG98gsaW6x2PYd2 images.zip
另一答案

截至2016年12月(source),没有答案提出对我有用的内容:

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

如果Google Drive文件已与拥有链接的人共享,{FileID}是共享网址中?id=背后的字符串。

虽然我没有查看大文件,但我相信它可能有用。

另一答案

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

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

  1. 在PC上打开浏览器,在Google云端硬盘中导航到您的文件。为您的文件提供公共链接。
  2. 将公共链接复制到剪贴板(例如右键单击,复制链接地址)
  3. 打开一个终端。如果你要下载到另一台PC /服务器/机器,你应该在这一点上SSH
  4. 安装链接2(debian / ubuntu方法,使用你的发行版或操作系统等效) sudo apt-get install links2
  5. 将链接粘贴到您的终端并使用链接打开它,如下所示: links2 "paste url here"
  6. 使用箭头键导航到链接中的下载链接,然后按Enter键
  7. 选择文件名,它将下载您的文件
另一答案

- 更新 -

要首先下载文件,请从此处获取youtube-dl包:

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

或者用pip安装:

sudo python2.7 -m pip install --upgrade youtube_dl /// 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)

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)

希望能帮助到你

另一答案

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

最简单的方法是:

  1. 创建download link并复制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 /p')&id=FILEID" -O FILENAME && rm -rf /tmp/cookies.txt
另一答案

使用youtube-dl

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

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

另一答案

我无法让Nanoix的perl脚本工作,或者我见过的其他curl示例,所以我开始在python中查看api。这适用于小文件,但是大文件在可用内存中被阻塞,所以我发现了一些其他很好的分块代码,它们使用了api的部分下载功能。要点:https://gist.github.com/csik/c4c90987224150e4a0b2

请注意将client_secret json文件从API接口下载到本地目录。

Source
$ 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) 
另一答案

这是我写的一个小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/p

以上是关于从谷歌驱动器wget / curl大文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用谷歌应用脚​​本将视频从谷歌驱动器上传到 YouTube?

使用命令行从谷歌驱动器下载共享文件的最快方法是啥? [关闭]

是否可以使用 reactjs 从谷歌驱动器获取文件?

javascript:从谷歌驱动器播放文件

如何在android中从谷歌驱动器中选择文件?

R如何使用R从谷歌驱动器读取文件