使用Jabber(XMPP)获取在线朋友

时间:2011-03-27 20:25:26

标签: php facebook xmpp

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

[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>

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

2 个答案:

答案 0 :(得分:2)

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

您发送:

<presence/>

并将从每个在线联系人的每个设备收到一个在线节目:

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

等。您不知道何时收到“全部”状态,因为您的联系人可能会在此过程中改变他们的状态。相反,可以考虑进入状态信息流,尽可能快地获取最新信息,然后通知任何进一步的变化。

答案 1 :(得分:0)

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