Google Drive v3 API:列出Shared Drive正常但获取时返回404
问题:调用Google Drive API的drives.get接口返回404(已能正常列出共享驱动器)
问题详情
使用跨域服务账号访问另一Google Workspace下的共享驱动器,已通过drives().list()成功获取到驱动器ID,但调用drives().get()时返回404错误。相关代码如下:
import os.path from google.oauth2 import service_account 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) # 调用drives.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()
已完成的配置
- 服务账号已开启Domain Wide Delegation
- 服务账号邮箱被添加为目标共享驱动器的
Content Manager角色 - 共享驱动器已开启「允许外部用户访问共享驱动器中的文件」设置
- 已通过
drives().list()确认驱动器ID有效,返回结果:
{'kind': 'drive#driveList', 'drives': [{'id': '1AEZqVMFTv9qTVp7QVA', 'name': 'dcf_results', 'kind': 'drive#drive'}]}
错误信息
调用drives.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'}]">
解决方案
1. 移除useDomainAdminAccess=True参数
你的服务账号不属于共享驱动器所在的Workspace域,启用该参数会强制API以域管理员身份尝试访问,反而触发权限验证失败。直接移除该参数,使用服务账号自身的权限调用即可:
folder = (drive_api_service.drives() .get(driveId="1AEZqVMFTv9qTVp7QVA") .execute())
2. 验证服务账号的实际权限
虽然已添加Content Manager角色,但可通过以下代码确认服务账号在目标驱动器上的权限是否生效:
permissions = drive_api_service.permissions().list( fileId="1AEZqVMFTv9qTVp7QVA", supportsAllDrives=True ).execute() print(permissions)
确保返回结果中包含你的服务账号邮箱,且角色为contentManager。
3. 检查参数一致性
注意错误信息中出现了两个不同的驱动器ID(0ADQqULDEv5pYUk9PVA和1AEZqVMFTv9qTVp7QVA),务必确认代码中传入的driveId与drives().list()返回的ID完全一致,避免复制粘贴错误。
内容的提问来源于stack exchange,提问作者Ayo I
相关产品推荐
相关产品推荐

