Google Drive API查询正确却返回空结果的问题求助
Google Drive API 列出根目录文件夹返回空结果的问题
问题描述
使用Google Drive API列出根目录下的文件夹时,尽管查询语句逻辑正确,但API始终返回空结果集。
当前配置
- Google Drive中存在名为"Persos"的文件夹,内含多个子文件夹
- 通过服务账号(service account)完成身份认证
- 已将"Persos"文件夹及所有关联文件/文件夹共享给服务账号,并授予编辑者权限
代码实现
from googleapiclient.discovery import build from googleapiclient.errors import HttpError from googleapiclient.http import MediaIoBaseDownload from google.oauth2 import service_account import logging # 补充原代码缺失的logging导入 def authenticate_google_drive(): SCOPES = ['https://www.googleapis.com/auth/drive'] SERVICE_ACCOUNT_FILE = 'socials/service_account.json' credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES) service = build('drive', 'v3', credentials=credentials) return service drive_service = authenticate_google_drive() def get_personality_folders(): # Query for all folders at root query = "'root' in parents and mimeType='application/vnd.google-apps.folder'" logging.debug(f"Query for folders at root: {query}") try: results = drive_service.files().list( q=query, fields="*", supportsAllDrives=True, includeItemsFromAllDrives=True ).execute() logging.debug(f"Complete results from Google Drive API: {results}") files = results.get('files', []) logging.debug(f"Files at root: {files}") # Check for 'Persos' folder persos_folder = [f for f in files if f['name'] == 'Persos'] logging.debug(f"'Persos' folder search result: {persos_folder}") if not persos_folder: logging.error("Dossier 'Persos' non trouvé dans Google Drive.") return {} persos_folder_id = persos_folder[0]['id'] query = f"mimeType = 'application/vnd.google-apps.folder' and '{persos_folder_id}' in parents" logging.debug(f"Query for subfolders in 'Persos': {query}") results = drive_service.files().list( q=query, fields="files(id, name)", supportsAllDrives=True, includeItemsFromAllDrives=True ).execute() logging.debug(f"Results from Google Drive API: {results}") folders = {folder['name']: folder['id'] for folder in results.get('files', [])} logging.debug(f"Subfolders in 'Persos': {folders}") return folders
日志输出
Query for folders at root: 'root' in parents and mimeType='application/vnd.google-apps.folder' URL being requested: GET https://www.googleapis.com/drive/v3/files?q=%27root%27+in+parents+and+mimeType%3D%27application%2Fvnd.google-apps.folder%27&fields=%2A&supportsAllDrives=true&includeItemsFromAllDrives=true&alt=json Results from Google Drive API: {'files': []} 'Persos' folder search result: []
已确认事项
- 服务账号拥有"Persos"文件夹及根目录下所有文件/文件夹的编辑者权限
- 服务账号身份认证流程正常
- 尝试过简化查询语句(如
query = "'root' in parents"),仍返回空结果
问题原因及解决办法
服务账号的"root"指向自身独立云盘
服务账号拥有独立的Google Drive空间,代码中'root' in parents查询的是服务账号自己的根目录,而非你个人Drive的根目录。你共享的"Persos"文件夹不会出现在服务账号的根目录中,而是归类在"与我共享"列表里。修改查询逻辑
放弃通过root查询,直接定位目标文件夹:
- 直接搜索"Persos"文件夹:
query = "name='Persos' and mimeType='application/vnd.google-apps.folder'" - 若已知"Persos"的文件夹ID,可直接查询其子文件夹:
persos_folder_id = "替换为你的Persos文件夹ID" query = f"mimeType='application/vnd.google-apps.folder' and '{persos_folder_id}' in parents"
- 添加
corpora参数
针对共享文件/文件夹,需补充corpora参数确保API检索范围覆盖共享内容:
results = drive_service.files().list( q=query, fields="*", supportsAllDrives=True, includeItemsFromAllDrives=True, corpora='allDrives' # 新增参数,覆盖个人Drive与共享内容 ).execute()
- 二次验证权限配置
登录Google Drive的"Persos"文件夹共享设置,确认服务账号邮箱已被添加,且权限为编辑者。若服务账号支持登录,可登录其Drive空间确认是否能看到目标文件夹。
内容的提问来源于stack exchange,提问作者Fabien
相关产品推荐
相关产品推荐

