如何通过FB Webhooks订阅指定用户发帖推送,无需用户重复授权?
核心结论
你的用法没有根本性错误,但Facebook Graph API的Webhook对用户对象的订阅有明确的前置规则,和你是不是移动端应用无关:
所有user类型对象的Webhook订阅,仅对已经完成Facebook登录授权你的应用、且授予了对应权限的用户生效,这里的「安装应用」不是指移动端安装APP,是指用户完成了OAuth授权流程,将你的应用关联到了自己的Facebook账号下。
实现前提
- 你的Facebook应用必须先通过应用审核,申请到
user_posts权限,这是获取用户发帖内容、订阅发帖通知的必要权限 - 目标用户必须主动完成你的应用的Facebook OAuth授权流程,并且授予
user_posts权限,授权一次后只要用户不主动取消授权、权限没有过期,就不需要反复授权 - 你必须先完成Webhook基础配置,回调地址即你可正常运行的Azure函数地址
可运行的实现步骤
1. 配置Webhook基础校验
首先在Facebook开发者后台的应用面板中完成基础配置:
- 进入「产品 > Webhook」,选择用户(User)对象,添加需要订阅的字段
posts - 填写你的Azure函数地址作为回调URL,设置自定义的验证令牌
- 你的Azure函数需要先适配GET请求逻辑:当收到Facebook的校验请求时,直接返回请求参数中的
hub.challenge值即可完成校验
2. 程序化订阅用户对象(也可直接在开发者后台手动配置)
你可以调用以下接口完成全局的User对象订阅,请求需要携带你的应用级访问令牌(App Access Token):
POST /v18.0/{你的应用ID}/subscriptions HTTP/1.1 Host: graph.facebook.com Content-Type: application/x-www-form-urlencoded object=user& callback_url=https%3A%2F%2F{你的Azure函数域名}%2Fapi%2Fcallback& fields=posts& include_values=true& verify_token={你设置的验证令牌}& access_token={你的应用访问令牌}
3. 处理用户授权逻辑
当用户向你的端点提交UserId前,必须先引导用户完成OAuth授权,授权链接核心参数如下:
https://www.facebook.com/v18.0/dialog/oauth?client_id={你的应用ID}&redirect_uri={你的授权回调地址}&scope=user_posts&response_type=code
用户授权完成后,你可以拿到用户的访问令牌,将其与用户ID关联存储到你的数据库即可,无需重复发起授权。
4. 接收Webhook通知
你的Azure函数适配POST请求即可,收到的发帖通知结构示例如下:
{ "object": "user", "entry": [ { "id": "对应用户ID", "time": 1234567890, "changes": [ { "field": "posts", "value": { "post_id": "新发布的帖子ID", "created_time": 1234567890, "message": "帖子内容文本" } } ] } ] }
注意事项
- 如果你想要订阅未授权你应用的用户的发帖通知,是完全无法实现的,Facebook出于隐私保护完全禁止这种行为
- 当前用户访问令牌默认有效期为60天,你可以通过刷新令牌延长有效期,无需用户反复操作授权
内容的提问来源于stack exchange,提问作者Tim Cadieux
相关产品推荐
相关产品推荐

