You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"),仍返回空结果

问题原因及解决办法

  1. 服务账号的"root"指向自身独立云盘
    服务账号拥有独立的Google Drive空间,代码中'root' in parents查询的是服务账号自己的根目录,而非你个人Drive的根目录。你共享的"Persos"文件夹不会出现在服务账号的根目录中,而是归类在"与我共享"列表里。

  2. 修改查询逻辑
    放弃通过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"
    
  1. 添加corpora参数
    针对共享文件/文件夹,需补充corpora参数确保API检索范围覆盖共享内容:
results = drive_service.files().list(
    q=query,
    fields="*",
    supportsAllDrives=True,
    includeItemsFromAllDrives=True,
    corpora='allDrives'  # 新增参数,覆盖个人Drive与共享内容
).execute()
  1. 二次验证权限配置
    登录Google Drive的"Persos"文件夹共享设置,确认服务账号邮箱已被添加,且权限为编辑者。若服务账号支持登录,可登录其Drive空间确认是否能看到目标文件夹。

内容的提问来源于stack exchange,提问作者Fabien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:37:12