使用服务账户调用Drive API无法列出共享驱动器文件夹文件
问题解决:服务账户访问Google共享驱动器时files().list无法获取文件内容
针对服务账户可写入Google共享驱动器,但无法通过Drive API的files().list方法查询到该驱动器内文件(包括自身创建的文件)的问题,以下是具体修复方案:
核心修复:补充API调用参数
Drive API v3默认不会返回共享驱动器的内容,即使设置了supportsAllDrives=True,仍需添加两个关键参数才能正确检索共享驱动器内的文件:
includeItemsFromAllDrives=True:强制API返回共享驱动器中的文件条目corpora='allDrives':指定搜索范围覆盖所有可访问的驱动器(包括服务账户自身驱动器和共享驱动器)
修改后的测试代码
from google.oauth2 import service_account from googleapiclient.discovery import build SERVICE_ACCOUNT_KEY_PATH = "你的服务账户密钥路径.json" credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_KEY_PATH, scopes=['https://www.googleapis.com/auth/drive.readonly'] ) drive_service = build('drive', 'v3', credentials=credentials) def list_files(folder_id=None): if folder_id: query = f"'{folder_id}' in parents" # 针对共享驱动器文件夹的查询,指定corpora和包含共享驱动器内容 results = drive_service.files().list( q=query, supportsAllDrives=True, includeItemsFromAllDrives=True, corpora='allDrives', pageSize=100 # 可选:调整返回的文件数量上限 ).execute() else: # 根目录查询保留原有逻辑 results = drive_service.files().list( q="'root' in parents", pageSize=100 ).execute() files = results.get('files', []) if not files: print("未找到文件。") else: print("文件列表:") for file in files: print(f"{file['name']} ({file['id']})") if __name__ == '__main__': folder_id = input("输入文件夹ID(按回车列出根目录):") list_files(folder_id.strip() if folder_id else None)
额外验证项
- 确认服务账户在共享驱动器中的角色为内容管理者或编辑者,仅"内容访问者"权限无法完成文件检索
- 若共享驱动器属于其他Google Workspace域,需确认该驱动器已开启"允许外部成员访问"的设置
内容的提问来源于stack exchange,提问作者Matt Winer
相关产品推荐
相关产品推荐

