XMPP聊天:使用xmppPy的Roster访问联系人状态消息

2 投票
2 回答
3273 浏览
提问于 2025-04-15 20:01

我正在尝试使用xmpppy访问我的Google Talk联系人自定义状态消息。我已经做到这一点:

import xmpp
import sys

userID   = 'myname@gmail.com' 
password = 'mypassword'
ressource = 'Script'

jid  = xmpp.protocol.JID(userID)
jabber  = xmpp.Client(jid.getDomain(), debug=[])

connection = jabber.connect(('talk.google.com',5222))
auth = jabber.auth(jid.getNode(), password, ressource)

jabber.sendInitPresence(requestRoster=1)
myroster = jabber.getRoster()

我的联系人列表对象myroster现在包含了我的联系人,但自定义状态消息没有包含在内。

myroster.getStatus('oneofmyfriends@gmail.com')

返回的是None

查看“原始联系人列表”,我发现资源字典是空的

u'oneofmyfriends@googlemail.com': {'ask': None, 'resources': {}, 'name': u'Some Name', 'groups': [], 'subscription': u'both'}

奇怪的是,我今天已经让这个功能正常工作过,但代码可能稍有不同,我就是搞不清楚我到底做了什么不同的事情……

任何帮助都会非常感激!

谢谢,

马丁

2 个回答

3

我发现了一件事情,这在我刚开始接触xmpp时并不清楚。加好友是双向的。

使用状态信息
(a) 你可以“订阅”你的朋友,而你的朋友可以回复“已订阅”。
(b) 你的朋友可以“订阅”你,而你可以回复“已订阅”。

如果发生了(a)或(b)中的任何一个,你的朋友就会出现在你的好友列表里。
如果发生了(a)或(b)中的任何一个,你也会出现在你朋友的好友列表里。

但是……
除非你“订阅”了你的朋友,否则你是看不到他们的状态的——(a)必须发生。
除非他们“订阅”了你,否则他们是看不到你的状态的——(b)必须发生。

大多数XMPP客户端(比如pidgin、trillian等)在你回复“已订阅”给朋友时,会自动让你发送“订阅”给他们(前提是他们先发给你“订阅”)。但是XMPPPY默认并不会这样做,你需要自己编写代码来实现。

这可能解释了为什么你看不到状态。如果这不适用于你的情况,可能对其他人也会有帮助。

2

这是一个时机问题。你需要在连接之前添加一个处理程序:

jabber.RegisterHandler('presence', myPresenceHandler)

def myPresenceHandler(self, con, event):
  fromjid = event.getFrom().getStripped()
  status = myroster.getStatus(fromjid)

然后确保在一个循环中调用 jabber.Process()。问题在于,你的代码有时候会在你查看联系人列表之前收到状态信息,有时候则是在之后收到。

撰写回答