使用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.
相关产品推荐
相关产品推荐

