如何通过Google Contacts API获取所有联系人的真实头像?
Google Contacts API提供了几个获取联系人信息的端点:
people.connections.listotherContacts.listpeople.listDirectoryPeople
其中otherContacts.list最为实用,它包含从各类来源自动添加的联系人。
我当前的API调用如下:
peopleService.otherContacts.list({ readMask: 'metadata,names,emailAddresses,photos', pageToken: nextPageToken, sources: ['READ_SOURCE_TYPE_CONTACT', 'READ_SOURCE_TYPE_PROFILE'] })
我能成功获取公司内部联系人(如user@mycompany.com)的真实头像,但无法获取公司外部联系人(如user@gmail.com)的真实头像,仅能得到默认头像。这些外部联系人是我通过Gmail或Google Calendar有过往来的对象,在Gmail、Google Calendar以及Contacts GUI(contacts.google.com)中能正常看到他们的真实头像。
问题
- 如何获取Google已持有但未在API响应中返回的所有联系人的头像?
- 是否无法/不支持获取所有联系人的头像?若是,请提供相关依据。
解答
针对问题1:获取外部联系人真实头像的可行方案
切换至
people.get接口查询单个联系人
放弃批量查询的otherContacts.list,针对单个外部联系人的邮箱,调用people.get接口,资源名使用people/email:{邮箱地址}格式,同时确保readMask包含photos。示例调用:peopleService.people.get({ resourceName: 'people/email:user@gmail.com', readMask: 'photos' })该接口直接查询对应用户的公开资料,相比批量接口更可能返回完整的头像信息。
检查并确认权限范围
确保你的OAuth 2.0权限范围包含https://www.googleapis.com/auth/contacts.readonly(或更具体的https://www.googleapis.com/auth/contacts.other.readonly),权限不足会导致部分隐私相关字段被屏蔽。移除
sources参数尝试
在otherContacts.list调用中,sources参数可能限制了资料来源,尝试移除该参数,让API返回所有可用来源的信息,部分外部联系人的头像可能来自非指定的来源。
针对问题2:是否支持获取所有联系人头像?
并非完全无法获取,但存在明确限制:
隐私设置限制
Google会根据用户的隐私设置决定是否对外暴露头像。如果外部联系人设置头像仅对“已添加的联系人”可见,而你的账号未主动添加对方为联系人(仅通过邮件/日历往来),API可能无法获取真实头像——但GUI中能看到是因为Google内部机制会基于你的交互记录给前端界面开放部分权限,API的权限模型和GUI存在差异。API端点设计差异
otherContacts.list是针对批量自动添加联系人的接口,返回字段经过简化,部分隐私相关信息(如非内部联系人的头像)会被默认隐藏;而people.get是单个用户资料查询接口,能获取更多符合隐私规则的公开信息。官方文档明确说明
Google Contacts API文档提到,自动创建的“其他联系人”(即otherContacts.list返回的条目)仅包含有限核心字段,如需获取更完整的用户资料,需单独调用people.get接口,且最终返回信息受限于目标用户的隐私设置。
内容的提问来源于stack exchange,提问作者venki

