获取 Facebook Chat 的在线状态

Posted

技术标签:

【中文标题】获取 Facebook Chat 的在线状态【英文标题】:Getting online presences for Facebook Chat 【发布时间】:2012-11-15 14:24:06 【问题描述】:

我正在使用 libpurple 连接到 FB 聊天。问题是我没有从通过移动 Facebook 应用程序在线的朋友那里获得在线状态。

但如果这样的朋友给我发消息,我会同时为他收到消息和在线状态。

看起来像这样:

(14:23:08) jabber: Recv (ssl)(191): <message from="-mybyddyid@chat.facebook.com"     to="myownid@chat.facebook.com/b94353f3_4CE87B53BB319" type="chat"><composing  xmlns="http://jabber.org/protocol/chatstates"/></message>

(14:23:10) jabber: Recv (ssl)(188): <message from="-mybyddyid@chat.facebook.com"   to="myownid@chat.facebook.com/b94353f3_4CE87B53BB319" type="chat"><active   xmlns="http://jabber.org/protocol/chatstates"/></message>

(14:23:11) jabber: Recv (ssl)(166): <presence from="-mybyddyid@chat.facebook.com" to="myownid@chat.facebook.com/b94353f3_4CE87B53BB319"><x xmlns="vcard-temp:x:update"><photo/></x></presence>

所以我想知道这是我的错还是 Facebook Chat 实施的限制。

【问题讨论】:

【参考方案1】:

我认为状态更新会有延迟。也许您可以检查一下,要求您的朋友不要发送消息并等待状态发生变化。从 facebook 聊天开发者页面 [1] 看来,当您更改它时,状态会在此之后更新。

此外,在同一页面中,限制之一是 facebook 聊天服务器不支持存在探测。如果 XMPP 服务器在用户登录并发送初始状态后还没有联系人的状态信息,则向联系人发送状态探测(参见 RFC 3921 [2] 的 5.1.1 节和 RFC 3921 [2] 的第 4.3.1 节RFC 6121 [3])。

如果服务器无法发送在线探测,它可能没有联系人的在线信息。我不知道 facebook 聊天服务器是如何实现的,但我猜测当联系人执行某些操作(如发送消息/更新状态)时,服务器会假定联系人在线并发送状态。 (我这里可能错了,如果我错了,请纠正我!)

参考资料:

[1]http://developers.facebook.com/docs/chat/

[2]http://xmpp.org/rfcs/rfc3921.html

[3]http://xmpp.org/rfcs/rfc6121.html

【讨论】:

以上是关于获取 Facebook Chat 的在线状态的主要内容,如果未能解决你的问题,请参考以下文章

photon chat unity plugin - 如何知道朋友是不是在线

云原生之Docker实战使用Docker部署Web在线聊天室Rocket.Chat

在 Facebook Chat 中识别 Chat 客户端应用

Facebook API 实时好友在线状态更新

朋友在线状态 - Facebook SDK 3

如何根据在线状态和 Facebook 的“上次活动”功能预测哪些 Facebook 朋友相互聊天