【问题标题】:How to download a big file from google drive via curl in Bash?如何通过 Bash 中的 curl 从谷歌驱动器下载大文件?
【发布时间】:2020-06-21 20:03:23
【问题描述】:

我想制作一个非常简单的 bash 脚本,用于通过 Drive API 从谷歌驱动器下载文件,所以在这种情况下,谷歌驱动器上有一个大文件,我在我的谷歌驱动器帐户上安装了 OAuth 2.0 Playground,然后在 @ 987654324@框,我选择Drive API v3https://www.googleapis.com/auth/drive.readonly做token和link。

点击Authorize APIs,然后点击Exchange authorization code for tokens。我复制了Access token,如下所示。

#! /bin/bash

read -p 'Enter your id : ' id
read -p 'Enter your new token : ' token
read -p 'Enter your file name : ' file

curl -H "Authorization: Bearer $token" "https://www.googleapis.com/drive/v3/files/$id?alt=media" -o "$file"

但它不起作用,你知道吗?

例如,我的文件大小是 12G,当我运行代码时,我会得到它作为输出,一秒钟后它会再次提示!我在两台具有两个不同 ip 地址的计算机上检查了它。(我还在 URL 中添加了alt=media

-bash-3.2# bash mycode.sh

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   166  100   166    0     0     80      0  0:00:02  0:00:02 --:--:--    80

-bash-3.2# 

它创建的文件内容是这样的

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "downloadQuotaExceeded",
    "message": "The download quota for this file has been exceeded."
   }
  ],
  "code": 403,
  "message": "The download quota for this file has been exceeded."
 }
}

【问题讨论】:

  • 超出了问题的范围,但如果它有用 - 我发现使用 rclone在 CLI 上将内容移入/移出 Google Drive 非常容易

标签: bash curl oauth-2.0 google-drive-api


【解决方案1】:

2021 年 3 月更新

只需遵循本指南here。它对我有用。

总结:

小文件下载运行

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

如果你尝试下载一个相当大的文件,你应该尝试运行

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

只需将 FILEIDFILENAME 替换为您的自定义值即可。

FILEID 可以在您的文件共享链接中找到(在 /d/ 之后,如上述文章所示)。

FILENAME 只是您要将下载保存为的名称。请记住包含正确的扩展名。例如 FILENAME = my_file.pdf 如果文件是 pdf。

【讨论】:

    【解决方案2】:

    这是一个已知错误

    已在此问题跟踪器post 中报告。这是因为您可以在文档中阅读:

    (关于下载地址)

    文件的短期下载 URL。此字段仅填充 对于内容存储在 Google Drive 中的文件;它没有被填充 Google 文档或快捷方式文件。

    所以你应该使用另一个字段。


    您可以通过点击问题旁边的星号来关注报告 编号以给予错误更高的优先级并接收更新。


    正如您在报告的 cmets 中看到的,当前的解决方法是:

    • 改用 webContentlink

    • www.googleapis.com 更改为content.googleapis.com

    【讨论】:

    • 谢谢你的回复,但我的文件在谷歌驱动器上,所以我别无选择。
    【解决方案3】:
    • 您想使用带有访问令牌的 curl 命令从 Google Drive 下载文件。

    如果我的理解是正确的,那么这个修改呢?

    修改 curl 命令:

    请添加alt=media的查询参数。

    curl -H "Authorization: Bearer $token" "https://www.googleapis.com/drive/v3/files/$id?alt=media" -o "$file"
    

    注意:

    • 修改后的 curl 命令假设您的访问令牌可用于下载文件。
    • 在本次修改中,可以下载除Google Docs以外的文件。如果您想下载 Google Docs,请使用 Drive API 的 Files: 导出方法。 Ref

    参考:

    如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

    【讨论】:

    • 谢谢你的回答,但不幸的是它也不起作用!
    • @Freeman 感谢您的回复。我带来的不便表示歉意。不幸的是,从您的回复中,我无法理解您当前的问题。这是因为我的技术不好。我对此深表歉意。那么为了正确了解您当前的情况,您能否提供错误消息和/或响应消息?另外,请问您问题的curl命令和修改后的curl命令的区别结果吗?
    • @Freeman 感谢您的回复。您还可以添加 curl 命令来复制当前问题吗?我想在我的环境中测试它。
    • @Freeman 另外,当您的附加信息出现问题时,创建文件时,您可以显示文件内容吗?因为在您的情况下,我认为错误消息可能包含在文件中。但我不确定这是否会导致直接解决方案。我必须为此道歉。
    • @Freeman 感谢您的回复。我不得不为我糟糕的英语水平道歉。 1、请问你问题的curl命令和修改后的curl命令的结果有什么不同吗? 2. 是否也可以添加当前 curl 命令来复制当前问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多