如何通过Graph API获取Facebook主页会话消息收发双方的邮箱与头像
Facebook Graph API 获取会话收发双方头像及邮箱最优方案
前置权限检查
- 你使用的主页访问令牌必须已授权
pages_messaging、pages_show_list权限 - 普通用户的邮箱字段不会默认返回,仅当该用户主动给你的Facebook应用授权了
email权限后才可拿到,否则邮箱字段会为空 - 头像字段无需额外用户授权,只要能拿到用户/主页ID即可拉取
最优实现逻辑
你原有代码的问题是在循环中多次发起API请求,资源损耗大、效率低。最优方案是利用Graph API的字段展开能力,单次请求直接拉取所有需要的关联字段,大幅减少API调用次数。
优化后代码示例
import facebook # 初始化Graph API实例 api = facebook.GraphAPI(pageAccess) # 一次性定义所有需要的字段,直接展开发送方、收件方的头像、邮箱信息 request_fields = [ 'message', 'id', 'from{id,name,email,picture{url}}', # 展开发送方字段,直接拉取头像、邮箱 'to{data{id,name,email,picture{url}}}' # 展开收件方字段,拉取对应信息 ] args = {'fields': ','.join(request_fields)} # 拉取会话列表时直接预拉取关联消息的所有字段,无需后续单独请求 conv = api.get_object('me/conversations', fields='id,messages{'+','.join(request_fields)+'}') for conversation in conv['data']: print(f"会话ID:{conversation['id']}") # 直接读取预拉取的消息数据 for msg in conversation['messages']['data']: # 提取发送方信息 sender = msg.get('from', {}) sender_avatar = sender.get('picture', {}).get('data', {}).get('url') sender_email = sender.get('email') # 提取收件方信息(通常为你的主页) recipients = msg.get('to', {}).get('data', []) for recipient in recipients: rec_avatar = recipient.get('picture', {}).get('data', {}).get('url') rec_email = recipient.get('email') # 输出所有信息 print(f"消息ID:{msg['id']}") print(f"消息内容:{msg.get('message')}") print(f"发送方头像:{sender_avatar} | 发送方邮箱:{sender_email}") print(f"收件方头像:{rec_avatar} | 收件方邮箱:{rec_email}")
补充说明
注意:普通Messenger用户和主页发起对话时默认不会授权邮箱权限,绝大多数场景下你无法拿到普通用户的邮箱,仅当用户通过你的应用登录并主动授权
- 如果需要指定头像尺寸,可以修改picture字段的请求格式,比如
picture.width(200).height(200){url}即可拿到固定尺寸的头像链接 - 如果需要拉取全量历史会话,可配合
limit分页参数控制单次拉取数量,避免请求超时 - 该方案相比原有实现可减少90%以上的API调用次数,请求效率提升非常明显
内容的提问来源于stack exchange,提问作者Rakib Ahmed
相关产品推荐
相关产品推荐

