gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:38:34 25 4
gpt4 key购买 nike

我有一个脚本可以使用 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 Service Account Example
我的新服务帐户脚本执行完全相同的操作,如下所示 -
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 客户端版本显然适用于相同的 id,任何关于可能导致服务帐户版本中出现此 404 错误的想法的任何想法?
TIA。

最佳答案

回答:
您需要与服务帐户共享您的文件。
更多信息:
与处理任何文件一样,您需要授予用户明确的权限才能查看它。由于服务帐户对您来说是一个单独的实体,因此这也适用于他们。
使用文件共享设置(您可以在 Drive UI 中通过右键单击文件并点击 Share 来执行此操作),为服务帐户的电子邮件地址提供正确的权限(读/写)。服务帐户的电子邮件地址采用以下格式:

service-account-name@project-id.iam.gserviceaccount.com
我希望这对你有帮助!

关于python - 使用服务帐户凭据导出 GDrive 失败并显示 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64677744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com