我需要使用python设置一个jabber bot,它将根据几个联系人的在线/离线可用性发送消息。
我一直在研究pyxmpp和xmpppy,但无法找到任何方法(至少没有任何简单的方法)来检查给定联系人的状态。
有关如何实现这一目标的任何指示?
理想情况下,我想要像bot.status_of("contact1@gmail.com")
返回"online"
答案 0 :(得分:2)
我认为这不可能以你想要的方式存在,因为机器人会异步接收联系人(包含有关其可用性的信息)的存在。
您必须编写在线处理函数并在连接中注册它。只要从联系人收到状态,就会调用此函数。呼叫参数将告诉您联系人是否在线。根据它,您可以将消息发送给联系人。
使用xmpppy
你可以这样做:
def connect(jid, password, res, server, proxy, use_srv):
conn = xmpp.Client(jid.getDomain())
if not conn.connect(server=server, proxy=proxy, use_srv=use_srv):
log( 'unable to connect to server.')
return None
if not conn.auth(jid.getNode(), password, res):
log( 'unable to authorize with server.')
return None
conn.RegisterHandler( 'presence', callback_presence)
return conn
conn = connect(...)
def callback_presence(sess, pres):
if pres.getStatus() == "online":
msg = xmpp.Message(pres.getFrom(), "Hi!")
conn.send(msg)
PS:我没有测试过代码,但它应该与此非常相似。
答案 1 :(得分:0)
您想要的是通过<presence type="probe"/>
完成的。这是代表客户端完成的,并且不应该由他们完成(根据XMPP IM的RFC)。由于这是一个机器人,您可以实现在线探测,并接收给定实体的当前存在。请记住将探测发送到裸JID(无资源),因为服务器代表客户端响应状态探测。这意味着您的工作流程将如下所示:
<presence/> // I'm online! BOT
<presence from="juliet@capulet.org/balcony"/> RESPONSE
<presence from="romeo@montague.net/hallway"/> // and so on... RESPONSE
<presence type="probe" to="benvolio@montague.net"/> BOT
<presence from="benvoio@montague.net/hallway"> RESPONSE
<status>Huzzah!</status>
<priority>3</priority>
</presence>
请查看RFC的该部分,详细了解您的呼叫流程应如何运作。
答案 2 :(得分:0)
您需要做的是:
现在,它取决于您需要的在线信息。为简单起见,让我们假装您只需要一个“在线”/“离线”值。缓存是一个字典,其密钥是裸(无资源)JID,值是这个JID的一组连接资源。例如:
{'foo@bar.com': set(['work', 'notebook']), 'bob@example.net': set(['gtalk'])}
现在,当您从某个JID /资源收到“可用”状态时:
if jid not in cache:
cache[jid] = set()
cache[jid].add(resource)
相反,当您收到“不可用”状态时:
if jid in cache: # bad people send "unavailable" just to make your app crash
cache[jid].discard(resource)
if 0 == len(cache[jid]):
del cache[jid]
现在:
def is_online(jid):
return jid in cache
当然,如果您需要更详细的信息,您不仅可以维护联系人的可用资源列表,还可以维护每个资源的状态,状态消息,优先级等。