使用 Jabber (XMPP) 结交在线朋友

Posted

技术标签:

【中文标题】使用 Jabber (XMPP) 结交在线朋友【英文标题】:Getting online friends using Jabber (XMPP) 【发布时间】:2011-03-27 20:25:25 【问题描述】:

我在与服务器通信时遇到问题:

[request]    <stream:stream to="chat.facebook.com" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" version="1.0">
[response]    <?xml version="1.0"?><stream:stream id="0D752DF3" from="chat.facebook.com" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" xml:lang="en"><stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-FACEBOOK-PLATFORM</mechanism><mechanism>DIGEST-MD5</mechanism></mechanisms></stream:features>
[request]    <auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="X-FACEBOOK-PLATFORM" />
[response]    <challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">[removed]</challenge>
[request]    <response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">[removed]</response>
[response]    <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
[response]    <?xml version="1.0"?><stream:stream id="4FC996C0" from="chat.facebook.com" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" xml:lang="en"><stream:features><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></stream:features>

[request]    <iq type="set" id="1"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind" /></iq>
[response]    <iq id="1" type="result"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>-[removed]@chat.facebook.com/[removed]</jid></bind></iq>
[request]    <iq type="set" id="2" to="chat.facebook.com"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>
[response]    <iq type="result" from="chat.facebook.com" id="2"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>
[request]    <iq type="get" id="3" from="-[removed]@chat.facebook.com/[removed]"><query xmlns="jabber:iq:roster"/></iq>

问题是最后一个请求:

[request]    <iq type="get" id="3" from="-[removed]@chat.facebook.com/[removed]"><query xmlns="jabber:iq:roster"/></iq>

根据文档 [?],应该只返回在线用户。但是,它会返回所有用户朋友。 如何仅获取/过滤在线用户?

【问题讨论】:

你能告诉我你用哪一个节获取了facebook的所有在线用户吗? 【参考方案1】:

文档在 RFC 3921 或更好的 RFC 3921bis 中,应该很快就会得到一个 RFC 编号。请参阅2.1.3 部分以获取有关您检索名册的详细信息,这是您所有联系人的列表,无论他们的状态如何。要接收您订阅的人的出席信息,请发送自己的出席信息以启动流程。

您发送:

<presence/>

并且将从您的每个在线联系人的每个设备收到一个在线状态节:

<presence from='friend1@example.com/deviceID/>
<presence from='friend2@example.com/deviceID/>

等等。您不知道何时收到“所有”状态,因为您的联系人可能会在发生这种情况时更改他们的状态。相反,请考虑进入状态信息流,您将尽快了解最新信息,然后收到任何进一步更改的通知。

【讨论】:

【参考方案2】:

名册或多或少是您的联系人列表(我不知道确切的定义),但在 Facebook 上,它似乎与您的朋友列表完全一样。在 Facebook 聊天中,服务器按照乔的指示在发送初始状态后非常快速地为您的朋友发送状态信息。其实我根本没有查询过名册,因为我对不在网上的朋友不感兴趣。

【讨论】:

以上是关于使用 Jabber (XMPP) 结交在线朋友的主要内容,如果未能解决你的问题,请参考以下文章

Jabber - xmpp 冲突

jabber协议问题

设置了自定义密码的 XMPP/Jabber 服务器?

Jabber 机器人的在线状态

如何在 XMPP/Jabber 中重新连接匿名用户

如何使用 C# 在 XMPP 服务器中使用 jabber net 创建新用户?