2012-02-22 63 views
0

我使用下面的代码连接到XMPP服务器(蟒蛇+ xmppy):Jabber机器人 - 如何获得状态更新?

c = xmpp.Client("localhost", debug=[]) 
    c.connect(("127.0.0.1", 5222)) 
    c.auth("test","test") 
    c.sendInitPresence() 
    c.send(xmpp.Presence(to="[email protected]", typ='subscribe')) 
    time.sleep(1000) 

这只是正常,管理员获取用户的存在更新和通讯录中的“测试”的用户显示为线上。如果我在该脚本上按ctrl + c(当它在最后睡觉时),则会发生问题,因此它会被终止。问题在于admin用户没有从该脚本获取状态更新。

我还应该提到admin用户自动接受订阅请求。

我的问题是:管理员用户如何检测到测试用户脱机。并且更改上面的脚本不是一种选择,因为任何人都可以编写这个脚本并在我的xmpp服务器上构建一个程序。

任何想法为什么管理员没有收到状态更新或如何检测用户'测试'下线是受欢迎的。

感谢

回答

1

检测一个端点有没有一个具体的存在更新设备下线了通常由服务器处理,例如通过。检测到端点正在通信的套接字已关闭。

如果您只能控制客户端代码,则可以偶尔从管理客户端发送presence probes到其所有订阅端点。

+0

嗨。我可以控制XMPP服务器,它是openfire,如果使用上述脚本,它不会发送当前更新。它检测到用户已经离线,因为如果我列出所有用户,“测试”用户被标记为离线。没有更新。我想'admin'用户应该收到状态更新,因为上面的脚本将它添加到'测试'名单中 - 并且由于管理员自动接受订阅。所以我不知道发生了什么事情,'管理员'没有得到离线状态更新,但是openfire检测到用户“测试”已经离线。 – eleanor 2012-02-22 23:23:37

+1

然后,它听起来像它可能是一个Openfire的错误。 XMPP规范指出,如果客户端断开连接,服务器必须生成不可用状态:http://xmpp.org/rfcs/rfc6121.html#presence-unavailable-outbound – MattJ 2012-02-25 14:29:56