2

我正在尝试使用 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')

返回无

查看“原始名册”,我可以看到资源字典是空的

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

奇怪的是我今天已经让它工作了,但我的代码可能略有不同,但我无法弄清楚我到底做了什么不同......

任何帮助将不胜感激!

干杯,

马丁

4

2 回答 2

3

这是我发现的一件事,当我第一次开始使用 xmpp 时,我并不清楚。交友是双向的。

使用状态节
(a) 您可以“订阅”您的朋友,您的朋友可以返回“已订阅”。
(b) 您的好友可以“订阅”您,您可以回复“订阅”。

如果 (a) 或 (b) 发生了,您的朋友将在您的名单中。
如果 (a) 或 (b) 发生了,您将在您的朋友名单中。

但是...
除非您“订阅”您的朋友,否则您将看不到他们的状态 - (a) 必须发生
他们不会看到您的状态,除非他们“订阅”您 - (b) 必须发生。

大多数 XMPP 客户端(pidgin、trillian 等)在您向您的朋友发送“订阅”时(在他们向您发送“订阅”之后)会自动让您向您的朋友发送“订阅”。XMPPPY 并不是开箱即用的。您必须对其进行编码才能执行此操作。

这可以解释为什么您没有看到状态。或者,如果这不涵盖您的情况,它可能对其他人提供信息。

于 2010-08-18T03:17:44.090 回答
2

这是一个时间问题。添加一个处理程序:

jabber.RegisterHandler('presence', myPresenceHandler)

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

连接前。然后确保jabber.Process()循环调用。问题在于,使用您的代码,您有时会在查看 roster 对象之前收到出席信息节,有时会在之后收到。

于 2010-03-08T21:44:37.757 回答