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

