Google Drive v3 API:获取共享驱动器 404,但列出驱动器有效

问题描述 投票:0回答:1

因此,我有以下代码可以通过 id 获取特定的 Google 共享云端硬盘:

import os.path

from google.oauth2 import service_account # see: https://stackoverflow.com/a/64509140/497745 and https://developers.google.com/identity/protocols/oauth2/service-account#authorizingrequests
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaFileUpload

SCOPES = ["https://www.googleapis.com/auth/drive"]
SERVICE_ACCOUNT_FILE = "credentials.json"

def main():

  creds = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)        

  try:
        drive_api_service = build("drive", "v3", credentials=creds)

        # see: https://googleapis.github.io/google-api-python-client/docs/dyn/drive_v3.drives.html#get
        folder = (drive_api_service.drives()
          .get(driveId="1AEZqVMFTv9qTVp7QVA", useDomainAdminAccess=True)  
          .execute())

  except Exception as error:
        print(f'An error occurred: {error}')

if __name__ == "__main__":
  main()

注意:出于安全原因,我手动更改了驱动器ID。但我知道 ID 是有效的,因为我是从使用相同服务帐户成功调用

drive_api_service.drives().list().execute()
的结果中获取的。

我的服务帐号与包含共享云端硬盘的 Google Workspace 帐号位于不同的 Google Cloud 帐号中。

但是,我:

  1. 添加了我的域范围委派服务帐户。
  2. 通过电子邮件地址将我的服务帐户作为
    Content Manager
    添加到共享云端硬盘。
  3. 我已开启“允许 XXX 之外的用户访问共享云端硬盘中的文件”

共享云端硬盘没有文件夹。

我的服务帐户能够毫无问题地

list
共享云端硬盘。

{'kind': 'drive#driveList', 'drives': [{'id': '1AEZqVMFTv9qTVp7QVA', 'name': 'dcf_results', 'kind': 'drive#drive'}]}

但是,当我尝试使用上述代码

get
驱动器时,我得到了 404。

An error occurred: <HttpError 404 when requesting https://www.googleapis.com/drive/v3/drives/0ADQqULDEv5pYUk9PVA?useDomainAdminAccess=true&alt=json returned "Shared drive not found: 0ADQqULDEv5pYUk9PVA". Details: "[{'message': 'Shared drive not found: 1AEZqVMFTv9qTVp7QVA', 'domain': 'global', 'reason': 'notFound', 'location': 'driveId', 'locationType': 'parameter'}]">

我注意到我必须跳过大量晦涩的环节才能确保服务帐户已勾选所有设置,并且添加访问权限甚至可以通过我的服务帐户在其中列出共享驱动器外部 Google Workspace 帐户。

所以,我的猜测是:

  1. 我错过了一些晦涩的设置或权限,它允许服务帐号执行的操作不仅仅是在外部 Google Workspace 中列出共享云端硬盘
  2. 我错误地拨打了
    get
    电话。也许我无法直接通过 ID 获取共享驱动器,只能获取该共享驱动器下的文件夹。

有什么想法吗?

google-api google-drive-api google-api-python-client google-client
1个回答
0
投票

根据您的情况,从

useDomainAdminAccess=True
中删除
folder = (drive_api_service.drives().get(driveId="1AEZqVMFTv9qTVp7QVA", useDomainAdminAccess=True).execute())
怎么样?

当我看到“方法:drives.get”

useDomainAdminAccess
的官方文档时,是这样说的。

以域管理员身份发出请求;如果设置为 true,则如果请求者是共享云端硬盘所属域的管理员,则将被授予访问权限。

我猜这可能是您当前问题的原因。那么,按如下方式删除怎么样?

来自:

folder = (drive_api_service.drives()
  .get(driveId="1AEZqVMFTv9qTVp7QVA", useDomainAdminAccess=True)  
  .execute())

致:

folder = (drive_api_service.drives()
  .get(driveId="1AEZqVMFTv9qTVp7QVA")
  .execute())

参考:

© www.soinside.com 2019 - 2024. All rights reserved.