jabber协议问题

Posted

技术标签:

【中文标题】jabber协议问题【英文标题】:jabber protocol problem 【发布时间】:2009-06-03 01:18:37 【问题描述】:

我的jabber机器人的联系人之一,

其'subscription'属性值为'to',

根据jabber协议表示:

****机器人已订阅对方在线状态, 但是对方没有订阅我的机器人。****

但是当我登录对方账号时,

我可以看到机器人在线,

为什么会这样?

jabber 协议现在乱了吗?

【问题讨论】:

你应该也标记这个 XMPP。 【参考方案1】:

如果您说“我的机器人订阅了 TOshore”或“Shore 订阅了 FROM 我的机器人”,“from”和“to”会更有意义。

所以,如果机器人的名单有:

<item jid='shore@example.com' subscription='to'/>

那么机器人会看到shore的存在,但是shore不会看到bot的存在,假设shore的名册有:

<item jid='bot@example.com' subscription='from'/>

由于网络问题等原因,这些状态可能会不同步。在这些情况下,解决问题的最简单方法是删除该项目(最终应该会有效地删除另一侧的项目),然后重新添加(有关详细信息,请参阅RFC 3921bis, section 2.5.1):

<iq from='bot@example.com/background'
   id='delete_1'
   type='set'>
 <query xmlns='jabber:iq:roster'>
   <item jid='shore@example.com' subscription='remove'/>
 </query>
</iq>
<presence type='subscribe' 
          from='bot@example.com/background' 
          to='shore@example.com'/>

要记住的是,即使订阅方向是所示的,机器人也可能会向岸发送定向存在,在这种情况下,即使他没有订阅机器人,岸也会看到两者的存在.检查 bot 的协议日志,您可能会看到如下内容:

<presence to='shore@example.com'/>

【讨论】:

好话!你说当网络问题之类的时候,快速修复是在“双方”删除然后重新添加。但实际上,对方是用户,所以似乎有点不适用?还有其他解决方案吗?跨度> 如果您从您的一侧移除,它应该从另一侧移除足以修复问题。我在回答中为此添加了协议示例。 谢谢乔!还有一个问题是:有时如果对方第一次拒绝接受你的订阅,以后的订阅将永远无法工作,如何解决? 您可以随时删除并重新添加,但请记住,如果您经常这样做,您订阅的人会认为您是垃圾邮件发送者。【参考方案2】:

我已经有一段时间没有使用 XMPP 了,但是快速重新阅读规范让我认为您混淆了“to”的含义。如果用户在机器人的名单上被列为“to”,那么这意味着用户正在关注机器人的存在,而不是相反。 “from”表示机器人正在关注——或将接收来自——用户帐户的出席信息节。

您知道用户名册是什么样的吗?如果事情已同步,则用户名册应将机器人列为“来自”。

【讨论】:

哦,你是对的,我搞错了。但是通过我的机器人账号,我可以在线看到用户账号,并且我已经多次重新订阅了那个用户账号,仍然没有效果,比如说,“订阅”仍然是“到”。

以上是关于jabber协议问题的主要内容,如果未能解决你的问题,请参考以下文章

Jabber 协议概述

允许 ejabberd_service(Jabber 组件协议)修改用户名册

关于 python Jabber、Twisted、XMLRPC 和 SCP 的简单问题 [关闭]

如何了解更多 XMPP/Jabber 命令

如何使用 jabber-net 获取消息历史记录(消息归档)

使用 Jabber web api 的 Gtalk 是不是需要 BOSH 服务器?