Answers:
好的,我已经找到阻止此状态的解决方案。
基本上,Facebook使用计时器,因此它将每隔X分钟向空闲时间发送心跳消息到其服务器。
这是此类Web请求的示例:
https://1-edge-chat.facebook.com/pull?channel=userid&seq=0&partition=-2&clientid=18ae8ecc&cb=ie3k&idle=117&qp=y&cap=8&msgs_recv=0&uid=userid&viewer_uid=userid&msgr_region=FRC&state=offline
如果您阅读该链接,将会看到&idle = 117是该帐户闲置的总秒数。该状态=离线代表聊天是否处于活动状态或离线
请注意,我已替换了15位数字的用户ID。
因此,要禁用此功能,只需在AdBlock过滤器中添加以下规则:
https://*-edge-chat.facebook.com
此方法的一个缺点是您不会实时接收消息。您必须刷新页面以获取消息。
由于我要提供其他详细信息,因此我将基于原始内容(而不是对其进行编辑)编写自己的答案。
是的,有一种方法可以执行此操作,但是此方法仅适用于基于Web的Facebook和Messenger。您无法对移动应用执行类似操作。
基本上,Facebook在服务器端使用定时请求来检查客户端是否仍然可用。因此,前端(加载的Facebook网页)将定期向其服务器发送HTTP请求(XHR)和空闲时间。
这是此类请求的示例:
https://1-edge-chat.facebook.com/pull?channel=p_<UserID>&seq=0&partition=-2&clientid=18ae8ecc&cb=ie3k&idle=117&qp=y&cap=8&msgs_recv=0&uid=userid&viewer_uid=userid&msgr_region=FRC&state=offline
注意:我已替换了通常为数字的用户ID。
如果您阅读上面的URL,则会看到显示为idle = 117的部分。这表示帐户闲置的总秒数。该状态=离线代表聊天是否开启或关闭。
因此,要禁用此功能,只需将以下规则添加到广告拦截器的自定义过滤器列表中:
||*-edge-chat.facebook.com^$xmlhttprequest
要同时禁用Facebook和Messenger,您可以添加以下两行:
||*-edge-chat.facebook.com^$xmlhttprequest
||*-edge-chat.messenger.com^$xmlhttprequest
或单行,使用regex:
/^https?\:\/\/\d+-edge-chat\.(facebook|messenger)\.com\/?/$xmlhttprequest
这种方法的一些缺点是您无法实时接收消息,即使聊天已打开也不会在线显示。您必须刷新页面才能接收新消息。
为了避免这两个缺点,这是一种解决方法。您可以添加以下行:
/^https?\:\/\/\d+-edge-chat\.facebook\.com\/pull\?.*state=offline/$xmlhttprequest
或者,为Facebook和Messenger添加以下代码:
/^https?\:\/\/\d+-edge-chat\.(facebook|messenger)\.com\/pull\?.*state=offline/$xmlhttprequest
最终的结果如下:
不幸的是,似乎没有其他解决方案,因为只有当客户端定期报告它们处于活动状态时,Facebook的前端才能提取消息,因此,一旦报告了最后一个活动,就完成了提取。通过相同的请求,一个后端脚本(* -edge-chat.facebook.com / pull)可使这两项操作成为可能;因此,你不能没有一个。