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

使用Python调用Google Drive API V3获取文件所有者邮箱地址问题

解决Google Drive API V3获取文件所有者邮箱的问题

你碰到了Drive API V3的典型坑——V3版本为了优化性能,默认只返回最基础的字段,而且你的代码里还不小心误用了V2的API版本,这两个问题叠加导致拿不到emailAddress字段。

问题根源

  • Drive API V2默认会返回文件和权限的完整元数据,包括所有者邮箱;但V3做了精简,必须显式指定需要的字段才能获取额外信息(比如emailAddress)。
  • 你标注的“V3代码”里实际还是调用的V2 API(build('drive', 'v2'),这是笔误,得改成'v3'才能使用V3的特性。

两种解决方案

方案1:直接通过Files.get接口获取所有者信息

这种方式更高效,不用单独调用权限接口,只要在files().get()里指定fields参数包含owners即可:

from oauth2client.service_account import ServiceAccountCredentials
from httplib2 import Http
from apiclient.discovery import build

def build_service(user):
    keyfile = 'C:\Python27\Scripts\Certificates for Transfer owner script\Transfer Ownership on Drive-f240cff252af.json'
    SCOPE = 'https://www.googleapis.com/auth/drive'
    credentials = ServiceAccountCredentials.from_json_keyfile_name(keyfile, scopes=SCOPE).create_delegated(user)
    http_auth = credentials.authorize(Http())
    # 修正API版本为v3
    return build('drive', 'v3', http=http_auth)

service = build_service('lpglobaldrive@lonelyplanet.com.au')
# 指定fields参数,明确获取owners字段
f = service.files().get(fileId='1lASRBuAHRxEC-T0X5SdlF3w7X_168Q2QV9L0V6QaXUk', fields='owners').execute()
currentOwner = f['owners'][0]['emailAddress']

方案2:通过Permissions.get接口获取邮箱

如果你需要走权限查询的流程,要在permissions().get()里显式指定fields参数包含emailAddress:

from oauth2client.service_account import ServiceAccountCredentials
from httplib2 import Http
from apiclient.discovery import build

def build_service(user):
    keyfile = 'C:\Python27\Scripts\Certificates for Transfer owner script\Transfer Ownership on Drive-f240cff252af.json'
    SCOPE = 'https://www.googleapis.com/auth/drive'
    credentials = ServiceAccountCredentials.from_json_keyfile_name(keyfile, scopes=SCOPE).create_delegated(user)
    http_auth = credentials.authorize(Http())
    return build('drive', 'v3', http=http_auth)

service = build_service('lpglobaldrive@lonelyplanet.com.au')
# 1. 获取文件权限列表
permissions = service.permissions().list(fileId='1lASRBuAHRxEC-T0X5SdlF3w7X_168Q2QV9L0V6QaXUk').execute()
# 2. 筛选出owner角色的权限ID
owner_permission_id = None
for perm in permissions['permissions']:
    if perm['role'] == 'owner':
        owner_permission_id = perm['id']
        break
# 3. 获取权限资源时指定需要的字段
p = service.permissions().get(
    fileId='1lASRBuAHRxEC-T0X5SdlF3w7X_168Q2QV9L0V6QaXUk',
    permissionId=owner_permission_id,
    fields='emailAddress,role'  # 明确请求邮箱字段
).execute()
currentOwner = p['emailAddress']

关键提醒

  • 务必确认API版本是v3,不要和V2混淆;
  • V3所有接口的默认返回字段都很有限,只要需要额外信息,都要通过fields参数指定(可以用fields='*'获取所有字段,但推荐只请求需要的字段来提升性能)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:51:24