同一Bot应用部署多Facebook页面时Webhooks批量被删问题
我之前也碰到过一模一样的糟心问题!当时我的Bot关联了五六个页面,结果手贱在其中一个页面的设置里卸载应用后,所有页面的Webhook全没了,Bot直接集体罢工,折腾了我大半天。后来终于找到不用给每个页面单独建应用的解决办法,分享给你:
别用页面设置里的手动卸载,改用Graph API精准操作
手动在Facebook页面的「设置-高级-已关联的应用」里卸载应用时,很容易触发Facebook界面的交互bug,连带把应用层面的Webhook订阅给删掉了,这就是为啥其他页面也跟着失效。正确的做法是用Graph API来移除单个页面的应用关联:DELETE /{page-id}/subscribed_apps?app_id={your-app-id}这个接口只会解除指定页面和应用的绑定,完全不会影响其他页面的Webhook订阅,亲测有效。
确保页面订阅是独立配置的
先在应用的Webhook设置里配置好回调端点和验证令牌,然后对每个关联的页面单独订阅所需的事件(比如messages、messaging_postbacks)。你可以通过Graph API批量操作:POST /{page-id}/subscribed_apps { "subscribed_fields": ["messages", "messaging_postbacks", "feed"] }这样每个页面的订阅状态都是独立的,单个页面的变动不会波及全局。
加个自动检测与恢复的机制
为了防患于未然,我给Bot加了个定时任务,每天检查一遍所有关联页面的订阅状态:GET /{page-id}/subscribed_apps如果发现某个页面的订阅丢失了,就自动调用上面的订阅接口重新订阅。这样就算偶尔出问题,Bot也能自动恢复,不用我手动去一个个修复。
检查权限与操作账号的角色
确保操作的账号是应用的管理员和对应页面的管理员,避免因为权限不足导致的异常操作。另外,尽量不要用同一个账号同时操作多个页面的应用卸载,分开操作或者用脚本批量处理更稳妥。
我自从改用Graph API管理页面关联后,就再也没出现过全局Webhook失效的问题了,完全用同一个应用就能搞定所有页面的管理。
内容的提问来源于stack exchange,提问作者Freerider

