使用服务帐户凭据的 GDrive 导出失败并显示 404

2023-12-06

我有一个使用 OAuth 客户端从 GDrive 文件导出文本的脚本,效果非常好 -

import googleapiclient.discovery as google

from apiclient.http import MediaIoBaseDownload

from google_auth_oauthlib.flow import InstalledAppFlow

from google.auth.transport.requests import Request

import datetime, io, os, pickle

Scopes=" ".join(['https://www.googleapis.com/auth/drive.file',
                 'https://www.googleapis.com/auth/drive.metadata',
                 'https://www.googleapis.com/auth/drive.readonly'])

TokenFile="token.pickle"

def init_creds(clientfile,
               scopes,
               tokenfile=TokenFile):            
    token=None
    if os.path.exists(tokenfile):
        with open(tokenfile, 'rb') as f:
            token=pickle.load(f)            
    if (not token or
        not token.valid or
        token.expiry < datetime.datetime.utcnow()):    
        if (token and
            token.expired and
            token.refresh_token):
            token.refresh(Request())
        else:
            flow=InstalledAppFlow.from_client_secrets_file(clientfile, scopes)
            token=flow.run_local_server(port=0)
        with open(tokenfile, 'wb') as f:
            pickle.dump(token, f)
    return token

def export_text(id,
                clientfile,
                scopes=Scopes):
    creds=init_creds(clientfile=clientfile,
                     scopes=scopes)
    service=google.build('drive', 'v3', credentials=creds)
    request=service.files().export_media(fileId=id,
                                         mimeType='text/plain')
    buf=io.BytesIO()
    downloader, done = MediaIoBaseDownload(buf, request), False
    while done is False:
        status, done = downloader.next_chunk()
        destfilename="tmp/%s.txt" % id
    return buf.getvalue().decode("utf-8")

if __name__=='__main__':
    print (export_text(id="#{redacted}"
                       clientfile="/path/to/oath/client.json"))

但每次都必须经历 OAuth 流程是一件痛苦的事情,而且由于只有我使用脚本,我想简化事情并使用服务帐户,从这篇文章开始 -

Google Drive API Python 服务帐户示例

我的新服务帐户脚本执行完全相同的操作,如下所示 -

import googleapiclient.discovery as google

from oauth2client.service_account import ServiceAccountCredentials

from apiclient.http import MediaIoBaseDownload

import io

Scopes=" ".join(['https://www.googleapis.com/auth/drive.file',
                 'https://www.googleapis.com/auth/drive.metadata',
                 'https://www.googleapis.com/auth/drive.readonly'])

def export_text(id,
                clientfile,
                scopes=Scopes):
    creds=ServiceAccountCredentials.from_json_keyfile_name(clientfile,
                                                           scopes)
    service=google.build('drive', 'v3', credentials=creds)
    request=service.files().export_media(fileId=id,
                                         mimeType='text/plain')
    buf=io.BytesIO()
    downloader, done = MediaIoBaseDownload(buf, request), False
    while done is False:
        status, done = downloader.next_chunk()
        destfilename="tmp/%s.txt" % id
    return buf.getvalue().decode("utf-8")

if __name__=='__main__':
    print (export_text(id="#{redacted}",
                       clientfile="path/to/service/account.json"))

但当我以同样的速度运行它时id,我得到以下结果 -

googleapiclient.errors.HttpError: <HttpError 404 when requesting https://www.googleapis.com/drive/v3/files/#{redacted}/export?mimeType=text%2Fplain&alt=media returned "File not found: #{redacted}.">

感觉服务帐户脚本正在通过身份验证步骤(即服务帐户信用没问题),但在尝试获取文件时失败 - 很奇怪,因为我可以使用 OAuth 版本很好地获取它:/

鉴于 OAuth 客户端版本显然适用于相同的情况,对可能导致服务帐户版本中出现此 404 错误的任何想法id?


Answer:

您需要与服务帐户共享您的文件。

更多信息:

与处理任何文件一样,您需要授予用户明确的权限才能查看它。由于服务帐户对您来说是一个单独的实体,因此这也适用于他们。

使用文件共享设置(您可以在云端硬盘用户界面中右键单击文件并点击Share),为服务帐户的电子邮件地址提供正确的权限(读/写)。服务帐户的电子邮件地址的格式为:

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

使用服务帐户凭据的 GDrive 导出失败并显示 404 的相关文章

随机推荐

  • POST 500(内部服务器错误)ajax,mvc

    我有 ajax 请求将数据发送到我的控制器 它收集我的下拉列表的值 错误是 POST http localhost 65070 form create 500 Internal Server Error 错误的响应是 The require
  • 如何通过phonegap打开iPhone应用程序

    我想从我的phonegap应用程序中打开联系人和日历等iPhone应用程序 我不介意这样做会将我的应用程序置于后台 我可以打开浏览器并使用 window open 但如何打开其他应用程序 eg window open contacts bl
  • 如何在 Android 中避免出现此消息

    我在 android 中收到以下错误消息 完成尚未停用或关闭的游标 数据库 data data com example Recipie databases recipedbase db 表 食谱 查询 从食谱中选择不同的标题 其中标题 My
  • 如何暂停线程执行

    如何暂停某些线程的执行 我有 Thread t 并且有两个按钮 暂停和继续 暂停时 我需要暂停线程执行 然后继续线程从之前停止的位置开始执行 听众中应该放什么 Java 中的线程是协作的 这意味着您不能强制线程停止或暂停 而是向线程发出您想
  • 如何打印格式化为网格的二维列表?

    目前 我已经编写了这段代码 def grid maker h w grid for i in range w for i in range h grid 0 0 o print grid gt gt gt grid maker 3 5 gt
  • 仅通过属性上的类型保护来细化父对象

    我有一个类型Box
  • 使用Java检测互联网连接[重复]

    这个问题在这里已经有答案了 可能的重复 如何检查java中是否存在互联网连接 我想看看是否有人有一种简单的方法来检测使用 Java 时是否有互联网连接 当前的应用程序在 Windows 中使用了 WinInit DLL 中的 Interne
  • 保存用户选择的语言,Android

    如何更改默认 string xml 我可以将我的应用程序更改为五种不同的语言 但每当我关闭应用程序并重新打开它时 它会恢复为默认英语 是否可以以某种方式更改默认文件夹 值 例如 从值 英语 默认为值 pt 葡萄牙语 任何帮助深表感谢 你可以
  • FCM接收消息问题

    我正在将 FCM 集成到我的项目中 但在收到通知时 我在日志中收到以下错误 错误文字颜色为蓝色 W FirebaseMessaging Received message with unknown type text 我的代码是这样的 pub
  • Postgresratio_to_report函数

    有人可以告诉我如何安装分析功能 特别是报告比率Postgres 数据库中的函数 我尝试在 postgres 提供的模块中搜索 但没有看到包含该函数的模块 报告比率 RATIO TO REPORT 是一个分析函数 它计算一个值与一组值之和的比
  • 如何通过pip安装MySQL-python?

    venv bin pip install MySQL python Collecting MySQL python Downloading MySQL python 1 2 5 zip 108kB 100 112kB 1 2MB s Com
  • 绘制误差线(百分位数)

    我对 python 很陌生 我需要一些帮助 我想在绘图上绘制相当于 1sigma 标准差的误差条 作为分布的第 16 个和第 84 个百分位值 我尝试过 使用 matplotlib err np std x 但它只是给了我标准差 谢谢 如果
  • 尝试用 PHP 解析 JSON

    我是 php 新手 这确实难倒了我 我正在尝试解析这个 json 以获取值match id result status 1 num results 1 total results 500 results remaining 499 matc
  • 为什么我不能对一个打开的文件调用 read() 两次?

    对于我正在做的练习 我尝试使用以下命令读取给定文件的内容两次read 方法 奇怪的是 当我第二次调用它时 它似乎没有以字符串形式返回文件内容 这是代码 f f open get the year match re search r Popu
  • Ubuntu 16.04 LTS 上的 PCL(点云库)1.7 构建错误

    我将 Ubuntu 版本从 14 04 lts 更新到 16 04 lts 在构建利用点云库的项目时遇到问题 它曾经在 Ubuntu 14 04 上运行良好 我使用 qtcreator 构建我的项目 我收到的警告消息是 警告 usr lib
  • 从向量中提取时使用 NA 作为索引

    在下面的代码中 x lt 1 8 x NA 我期待着一个TRUE or FALSE回答但我有八个NA反而 我发现了is na提供了TRUE FALSE我正在寻找的 但是 我仍然不确定为什么用向量子集NA结果是NA 有什么解释吗 来自索引中的
  • 在列表中查找具有给定属性值的对象,然后查找字典值

    我有一个对象列表 这些对象中的每一个都有一个Name财产 以及ObservablePairCollection这只是一个自定义字典 其工作方式与字典完全相同 具有键 值对 给定两个字符串 一个用于名称 一个用于键 我想找到第一个与给定名称匹
  • 使用 selenium 运行的无头 Chrome

    System setProperty webdriver chrome driver usr bin google chrome final ChromeOptions chromeOptions new ChromeOptions chr
  • 使 tkinter 窗口出现在所有其他窗口之上

    usr bin env python Display window with toDisplayText and timeOut of the window from Tkinter import def showNotification
  • 使用服务帐户凭据的 GDrive 导出失败并显示 404

    我有一个使用 OAuth 客户端从 GDrive 文件导出文本的脚本 效果非常好 import googleapiclient discovery as google from apiclient http import MediaIoBa