在XMPP中查询是否存在

4

默认情况下,XMPP的presence状态会向所有订阅该用户的人发布。是否有可能发送像IQ调用之类的东西来获取不在我的花名册中的ID的Presence标签?

4个回答

7
如果您想知道XMPP实体是否已连接,可以使用XMPP Ping(XEP-0199)。以下是两个XMPP用户“user1”和“user2”的示例。他们不在彼此的联系人列表中。我在下面的示例中使用ejabberd和PSI。
  • “user2”向“user1”发送ping请求(user1在线)

IQ:

<iq from='user2@pdevdv3os18f.corp.intuit.net' 
to='user1@pdevdv3os18f.corp.intuit.net/BANL07R9AME9X' type='get' id='e2e1'>
<ping xmlns='urn:xmpp:ping'/>
</iq>

响应:

<iq from="user1@pdevdv3os18f.corp.intuit.net/BANL07R9AME9X" type="result" xml:lang="en" to="user2@pdevdv3os18f.corp.intuit.net/BANL07R9AME9X" id="e2e1" />

  • “user2”向“user1”发送ping消息(user1不在线)。ping的响应结果为type=error。

IQ:

<iq from='user2@pdevdv3os18f.corp.intuit.net' 
to='user1@pdevdv3os18f.corp.intuit.net/BANL07R9AME9X' type='get' id='e2e1'>
<ping xmlns='urn:xmpp:ping'/>
</iq>

响应:

<iq from="user1@pdevdv3os18f.corp.intuit.net/BANL07R9AME9X" type="error" xml:lang="en"     to="user2@pdevdv3os18f.corp.intuit.net/BANL07R9AME9X" id="e2e1" >
<ping xmlns="urn:xmpp:ping"/>
<error type="cancel" code="503" >
<service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
</error>
</iq>

值得注意的是,这仅在您也拥有user2的资源时才有效,而在某些情况下可能并不知道。 - Sumit Jain

4
我不这么认为。请查看rfc第5.1.3节。具体来说,它说:
收到用户的在线状态探测请求后,联系人的服务器应该回复如下:
如果联系人的名单中没有订阅状态为“From”、“From + Pending Out”或“Both”的用户(在Subscription States(第9节)中定义),则联系人的服务器必须以“错误”的状态返回一个在线状态信息。
你可能会收到错误或禁止响应。

1

根据rfc规定,您不允许从不在您的花名册列表中的id接收出席信息。

但我相信如果有一个允许这样做的xmpp服务器,可以通过修改服务器来查询出席信息。


0

不。

  • 必须订阅才能检测到在线状态,而非查询。如果你等待查询的答案,信息将会变得陈旧。
  • 在线状态是个人信息。你必须得到联系人的显式授权才能查看它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接