Google Workspace超级管理员如何获取指定账号的resourceName
解决方案
一、正确获取目标账号的resourceName
无需使用people.listDirectoryPeople,直接通过Admin SDK Directory API获取用户ID后拼接即可:
- 新增Scope:
https://www.googleapis.com/auth/admin.directory.user.readonly - 调用Directory API获取用户信息:
from googleapiclient.discovery import build # 初始化Directory API客户端 directory_service = build('admin', 'directory_v1', credentials=creds) # 获取单个用户的resourceName(替换为目标邮箱) user_info = directory_service.users().get(userKey='press@yourdomain.org').execute() resource_name = f'people/{user_info["id"]}' # 批量获取域内所有用户的resourceName users = directory_service.users().list(domain='yourdomain.org', maxResults=1000).execute() for user in users.get('users', []): print(f"邮箱: {user['primaryEmail']}, ResourceName: people/{user['id']}")
二、正确获取目标账号的Google Contacts
作为管理员,直接用自身账号调用connections.list无法访问其他用户的联系人,必须通过域范围授权模拟目标用户调用API:
配置域范围授权:
- 在Google Cloud控制台为你的服务账号启用域范围授权
- 在Google Workspace管理后台,将
https://www.googleapis.com/auth/contacts.readonly权限授予该服务账号
模拟目标用户调用API:
from google.oauth2 import service_account from googleapiclient.discovery import build SCOPES = ['https://www.googleapis.com/auth/contacts.readonly'] SERVICE_ACCOUNT_FILE = 'path/to/your/service-account-key.json' # 模拟目标用户(替换为目标邮箱) delegated_creds = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES, subject='press@yourdomain.org' ) # 初始化People API客户端 people_service = build('people', 'v1', credentials=delegated_creds) # 获取目标用户的联系人(模拟用户时用people/me即可) connections = people_service.people().connections().list( resourceName='people/me', pageSize=1000, personFields='names,emailAddresses,phoneNumbers' ).execute() # 遍历处理联系人数据 for contact in connections.get('connections', []): print(contact.get('names', [{}])[0].get('displayName'))
三、关于你之前的API调用错误
people.listDirectoryPeople用于获取域内用户的公开目录信息(而非个人联系人),即便调整目录共享设置,也无法满足你获取用户私人联系人的需求。另外你之前的参数sources设置为DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE,若仅用于获取目录用户信息,应改为DIRECTORY_SOURCE_TYPE_DOMAIN_CONTACT,但此接口对你的核心需求无帮助。
内容的提问来源于stack exchange,提问作者Vadim Kantorov
相关产品推荐
相关产品推荐

