使用 python 从公共 Google Drive 下载文件:范围问题?

2024-01-11

使用我的答案我的问题 https://stackoverflow.com/questions/68270332/automatically-download-large-files-in-public-gdrive-folder关于如何从公共 Google 驱动器下载文件,我过去设法使用 Python 脚本中的 ID 下载图像,并使用以下代码块从公共驱动器中下载 Google API v3:

from google_auth_oauthlib.flow import Flow, InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload, MediaIoBaseDownload
from google.auth.transport.requests import Request
import io
import re
SCOPES = ['https://www.googleapis.com/auth/drive']
CLIENT_SECRET_FILE = "myjson.json"
authorized_port = 6006 # authorize URI redirect on the console
flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET_FILE, SCOPES)
cred = flow.run_local_server(port=authorized_port)
drive_service = build("drive", "v3", credentials=cred)
regex = "(?<=https://drive.google.com/file/d/)[a-zA-Z0-9]+"
for i, l in enumerate(links_to_download):
    url = l
    file_id = re.search(regex, url)[0]
    request = drive_service.files().get_media(fileId=file_id)
    fh = io.FileIO(f"file_{i}", mode='wb')
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print("Download %d%%." % int(status.progress() * 100))

与此同时我发现pydrive https://github.com/googlearchive/PyDrive and pydrive2 https://github.com/iterative/PyDrive2,两个围绕 Google API v2 的包装器,允许执行非常有用的操作,例如列出文件夹中的文件,并且基本上允许使用更简单的语法执行相同的操作:

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
import io
import re
CLIENT_SECRET_FILE = "client_secrets.json"

gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
regex = "(?<=https://drive.google.com/file/d/)[a-zA-Z0-9]+"
for i, l in enumerate(links_to_download):
    url = l
    file_id = re.search(regex, url)[0]
    file_handle = drive.CreateFile({'id': file_id})
    file_handle.GetContentFile(f"file_{i}")

但是现在我使用 pydrive 还是原始 API我似乎无法下载相同的文件相反,我遇到了:

googleapiclient.errors.HttpError: <HttpError 404 when requesting https://www.googleapis.com/drive/v3/files/fileID?alt=media returned "File not found: fileID.". Details: "[{'domain': 'global', 'reason': 'notFound', 'message': 'File not found: fileID.', 'locationType': 'parameter', 'location': 'fileId'}]">

我尝试了所有方法并使用 Google 控制台注册了 3 个不同的应用程序,这似乎可能是(或不是)范围界定问题(例如,参见这个答案 https://stackoverflow.com/a/54492150/4844184,应用程序只能访问我的 Google 驱动器中的文件或由此应用程序创建的文件)。不过我之前(去年)没有遇到过这个问题。

当去的时候谷歌控制台 https://console.cloud.google.com/apis/credentials/consent?authuser=1明确给予https://www.googleapis.com/auth/drive作为 API 的范围,要求使用应用程序的网站/使用条件/保密规则/授权域和解释该应用程序的 YouTube 视频填充大量字段。不过,我将是该脚本的唯一用户。 所以我只能明确给出以下范围:

/auth/drive.appdata
/auth/drive.file
/auth/drive.install

是因为范围界定吗?有没有不需要创建主页和 YouTube 视频的解决方案?

EDIT 1:这是一个例子links_to_download:

links_to_download = ["https://drive.google.com/file/d/fileID/view?usp=drivesdk&resourcekey=0-resourceKeyValue"]

EDIT 2:它非常不稳定,有时可以毫不费力地工作,有时却不能。当我多次重新启动脚本时,我得到不同的结果。重试策略在一定程度上发挥了作用,但有时会在几个小时内多次失败。


嗯,感谢安全更新 https://support.google.com/drive/answer/10729743?hl=en谷歌几个月前发布的。这使得链接共享更加严格,除了访问文件之外,您还需要资源密钥来访问该文件fileId.

根据文档 https://developers.google.com/drive/api/v3/resource-keys#syntax,如果您想在标头中访问它,您还需要为较新的链接提供资源密钥X-Goog-Drive-Resource-Keys as fileId1/resourceKey1.

如果您在代码中应用此更改,它将正常工作。编辑示例如下:

regex = "(?<=https://drive.google.com/file/d/)[a-zA-Z0-9]+"
regex_rkey = "(?<=resourcekey=)[a-zA-Z0-9-]+"
for i, l in enumerate(links_to_download):
    url = l
    file_id = re.search(regex, url)[0]
    resource_key = re.search(regex_rkey, url)[0]
    request = drive_service.files().get_media(fileId=file_id)
    request.headers["X-Goog-Drive-Resource-Keys"] = f"{file_id}/{resource_key}"
    fh = io.FileIO(f"file_{i}", mode='wb')
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print("Download %d%%." % int(status.progress() * 100))

好吧,资源键的正则表达式是我很快制作的,所以不能确定它是否支持所有情况。但这为您提供了解决方案。 现在,您可能必须基于此收听旧链接和新链接并设置更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 python 从公共 Google Drive 下载文件:范围问题? 的相关文章

随机推荐

  • XAMPP - 错误:MySQL 意外关闭

    由于某种原因 我重新安装了 XAMPP 但 MySQL 无法工作 在控制台中出现以下错误 01 56 03 mysql Error MySQL shutdown unexpectedly 01 56 03 mysql This may be
  • 通过 powershell 在 jenkins 中使用 AnsiColor

    关于如何使用 powershell 为 Jenkins 上的输出着色有什么想法吗 我已经在 J enkins 上安装了 AnsiColor 插件 并且已将作业设置为使用 AnsiColor 唯一的问题是如何让我的powershell在Jen
  • 通过 StoredProcedure 每日/每周/每月记录计数搜索

    Using 微软SQL服务器 我做了一个名为SP Get CallsLogged 我有一个名为TRN Call 它有一个名为CallTime这是一个日期时间 我的应用程序中有一个网页 用户在其中输入 开始日期 约会时间 EndDate 约会
  • java 使用线程下载多个文件

    我正在尝试使用线程下载与模式匹配的多个文件 该模式可以匹配 1 5 或 10 个不同大小的文件 为了简单起见 下载文件的实际代码位于 downloadFile 方法中 而 fileNames 是与模式匹配的文件名列表 我如何使用线程来做到这
  • Windows Phone 7 - 加载一个大的 xml 文件

    我正在尝试将 xml 文件加载到我的应用程序中并将其显示在列表框中 问题是该xml文件大约有5MB 在手机上加载大约需要40秒 当手机锁定屏幕并返回时 又需要 40 秒 我尝试使用isolatedstorage来存储数据 但它并没有提高性能
  • 为什么我的静态目录无法与 django 1.3 一起使用?

    这个问题很简单 但我就是想不出来 添加到我的 urlpatterns url r static P
  • 公开 Firebase 存储,以便在 Android 上读写

    我是 firebase 存储的新手 谁能告诉我如何使存储文件公开以供读写 firebase 提供的默认代码如下 我应该做出哪些改变 service firebase storage match b image view b1cf5 apps
  • iOS 8 AutoLayout 滚动视图在 iPhone 6 plus 上水平滚动

    我确实有一个 iOS 应用程序 在调整所有 UI 以自动布局和尺寸类别以支持新的 iPhone 6 和 iPhone 6 plus 时 我遇到了一个奇怪的问题 我的滚动视图在 iPhone 4s 5 5s 中工作正常和 6 在 iPhone
  • Discord 丰富的嵌入按钮

    我制作了一些discord py 机器人 但我遇到了一个令人惊讶的机器人 它被称为 IdleRPG 并使用带有按钮的丰富嵌入消息 这是一张图片 注意菜单底部的按钮 我尝试联系开发商并一直在网上搜索 但似乎找不到他们是如何做到的 有谁知道有关
  • 如何在 bash 中优雅地存储和回显多行? [复制]

    这个问题在这里已经有答案了 我试图将一段文本捕获到一个变量中 并保留换行符 然后回显它 然而 当我捕获文本或显示文本时 换行符似乎没有被维护 关于我如何实现这一目标有什么想法吗 Example bin bash read d my var
  • 即使我注销了,如何才能在后台继续运行unix程序?

    我想在 unix 机器上在后台运行一个带有 while 1 循环的 Perl 脚本 直到我杀死它 这是一台我没有管理权限的远程计算机 因此由于某种原因 我无法使用 Daemon Generic While1 我通过 SSH 登录到它 并且我
  • TypeDoc 抱怨“找不到模块”

    我有一个基于 Typsecript 的反应应用程序 它工作得很好 但我想添加 TypeDoc 想想 Typescript 的 JSDoc 安装后 我从命令行运行它 在测试时仅处理单个文件 typedoc module commonjs js
  • 汇编反转字符串

    读取字符串直到按下 1 并且 1 将位于字符串的最后一个位置 我不知道为什么我的输出关闭 例如输入是 asd1 输出是 1111 无论如何 这是我的代码 data segment msg db 0dh 0ah Your string rev
  • Swift 3 迁移后 UICollectionView 损坏了?

    在我的项目中使用 Swift 3 转换器后 加载 UICollectionViewController 的子类时我不断崩溃 下面是我的代码以及集合视图的相关方法 override func collectionView collection
  • QNetworkAccessManager超时

    目前我正在开发一个从远程服务器发送和接收文件的应用程序 为了进行网络操作 我使用 QNetworkAccessManager 要上传文件 我使用 QNetworkAccessManager put 并下载文件 我使用 QNetworkAcc
  • 在动态加载的内容上使用hammer.js

    我正在使用hammer js 开发一个网络应用程序 我可以让它正常工作 除了使用 ajax 加载的内容 我使用 jquery 的hammer js 特殊事件插件 以下工作正常 menu a on tap function event con
  • NSDatePicker 使用箭头键时行为不当

    我用过NSDatePickers 没有步进器 在列的单元格中NSTableView 日期选择器用于设置以小时 分钟和秒为单位的持续时间 如果我突出显示其中一个控件并使用箭头键设置值 日期选择器会显示一些奇怪的行为 每次按下向上箭头时 秒数都
  • Node 连接到 Postgres 的速度比 .NET Core 快 20 倍

    我有两台服务器连接到PostgresSQL 9 6数据库托管在 Azure 上 服务器正在做一件事 使用 a 访问 Postgres 数据库SELECT 1每5秒查询一次 连接到数据库并获取数据的典型时间 Node 25 MS NET Co
  • 波形符 C 无符号与有符号整数

    例如 unsigned int i 0 Result 我可以分配的最大数量i and signed int y 0 Result 1 为什么我得到 1 我不应该得到可以分配的最大数量吗y Both 4294967295 又名UINT MAX
  • 使用 python 从公共 Google Drive 下载文件:范围问题?

    使用我的答案我的问题 https stackoverflow com questions 68270332 automatically download large files in public gdrive folder关于如何从公共