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

使用Service Account访问Google Drive文件无报错但找不到文件求助

服务账号无法读取Google Drive文件的排查方案

问题背景

已完成以下操作,但代码运行无报错却找不到Google Drive中的文件:

  • 在GCP项目中启用了Google Drive API
  • 创建了Service Account,可在API详情页面查看
  • 生成了包含Service Account凭证的JSON文件

使用的代码如下:

from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

service_account_json_key = '****sa-key-jsonfile****.json'
SCOPES = ['https://www.googleapis.com/auth/drive']
creds = service_account.Credentials.from_service_account_file(
    filename=service_account_json_key, scopes=SCOPES)


def search_file():
    """Search file in drive location"""
    try:
        # create drive api client
        service = build("drive", "v3", credentials=creds)
        files = []
        page_token = None
        while True:
            # pylint: disable=maybe-no-member
            response = (
                service.files()
                .list(
                    # q="mimeType='image/jpeg'",
                    spaces="drive",
                    fields="nextPageToken, files(id, name)",
                    pageToken=page_token,
                )
                .execute()
            )
            for file in response.get("files", []):
                # Process change
                print(f'Found file: {file.get("name")}, {file.get("id")}')
            files.extend(response.get("files", []))
            page_token = response.get("nextPageToken", None)
            if page_token is None:
                break

    except HttpError as error:
        print(f"An error occurred: {error}")
        files = None

    return files


if __name__ == "__main__":
    ret = search_file()
    print(ret)

核心原因与解决方法

1. 服务账号的独立存储空间(最常见原因)

服务账号拥有自己独立的Google Drive空间,默认无法访问个人Drive或未共享的文件。必须手动将目标文件/文件夹共享给服务账号:

  • 打开Google Drive中的目标文件/文件夹,点击「共享」
  • 输入服务账号的邮箱(可在JSON凭证的client_email字段找到)
  • 授予至少「查看者」权限,保存设置

2. 调整API调用参数(针对团队盘或特定场景)

如果目标文件在团队盘中,需要在files().list()调用中添加supportsAllDrives=True参数:

response = (
    service.files()
    .list(
        spaces="drive",
        fields="nextPageToken, files(id, name)",
        pageToken=page_token,
        supportsAllDrives=True  # 新增该参数
    )
    .execute()
)

3. 缩小搜索范围(可选)

可以通过q参数精准定位文件,避免返回无关结果,比如按文件名搜索:

response = (
    service.files()
    .list(
        q="name contains '你的目标文件名'",  # 新增搜索条件
        spaces="drive",
        fields="nextPageToken, files(id, name)",
        pageToken=page_token,
    )
    .execute()
)

4. 验证权限有效性

可以调用以下代码检查文件的权限列表,确认服务账号已被授权:

def check_permissions(file_id):
    try:
        response = service.files().get(fileId=file_id, fields="permissions").execute()
        permissions = response.get('permissions', [])
        for perm in permissions:
            print(f"权限账号: {perm.get('emailAddress')}, 权限类型: {perm.get('role')}")
    except HttpError as error:
        print(f"权限检查出错: {error}")

# 调用时传入目标文件ID
check_permissions("你的文件ID")

额外排查点

  • 确认JSON凭证文件路径正确,代码能正常读取该文件
  • 检查Scopes设置,https://www.googleapis.com/auth/drive权限已足够获取文件列表

内容的提问来源于stack exchange,提问作者Stefano G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:58:09