2024-06-16 17:56:41 发布
网友
我需要使用python设置一个jabber机器人,它将根据几个联系人的在线/离线可用性发送消息。在
我一直在研究pyxmpp和xmppy,但找不到任何方法(至少没有直接的方法)来检查给定联系人的状态。在
有什么建议吗?在
理想情况下,我想要一些类似bot.status_of("contact1@gmail.com")返回"online"
bot.status_of("contact1@gmail.com")
"online"
我不认为这是可能的,因为联系人的存在(其中包含他们的可用性信息)是由bot异步接收的。在
您必须编写一个状态处理程序函数,并将其注册到连接中。每当收到联系人的状态信息时,就会调用此函数。呼叫的参数将告诉您联系人是否在线。根据它,你可以把信息发送给联系人。在
使用xmpppy可以这样做:
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:我还没有测试代码,但它应该与此非常相似。在
你需要做的是:
现在,这取决于你需要什么状态信息。为了简单起见,假设您只需要一个“online”/“offline”值。缓存将是一个字典,其键是裸(无资源)JID,值是该JID的一组连接的资源。例如:
{'foo@bar.com': set(['work', 'notebook']), 'bob@example.net': set(['gtalk'])}
现在,当您收到来自某个JID/资源的“可用”状态时:
反过来,当您收到“不可用”状态时:
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
当然,如果您想要更详细的信息,您不仅可以维护联系人的可用资源列表,还可以维护每个资源的状态、状态消息、优先级等。在
您想要的是通过<presence type="probe"/>完成的。这是代表客户完成的,不应该由他们完成(根据xmppim的RFC)。因为这是一个bot,所以您可以实现presence probe,并接收给定实体的当前存在。记住将探测发送到裸JID(sans资源),因为服务器代表客户机响应状态探测。这意味着您的工作流程将如下所示:
<presence type="probe"/>
<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的那一部分,以获得关于调用流应该如何工作的更深入的信息。在
我不认为这是可能的,因为联系人的存在(其中包含他们的可用性信息)是由bot异步接收的。在
您必须编写一个状态处理程序函数,并将其注册到连接中。每当收到联系人的状态信息时,就会调用此函数。呼叫的参数将告诉您联系人是否在线。根据它,你可以把信息发送给联系人。在
使用
xmpppy
可以这样做:PS:我还没有测试代码,但它应该与此非常相似。在
你需要做的是:
现在,这取决于你需要什么状态信息。为了简单起见,假设您只需要一个“online”/“offline”值。缓存将是一个字典,其键是裸(无资源)JID,值是该JID的一组连接的资源。例如:
现在,当您收到来自某个JID/资源的“可用”状态时:
^{pr2}$反过来,当您收到“不可用”状态时:
现在:
当然,如果您想要更详细的信息,您不仅可以维护联系人的可用资源列表,还可以维护每个资源的状态、状态消息、优先级等。在
您想要的是通过
<presence type="probe"/>
完成的。这是代表客户完成的,不应该由他们完成(根据xmppim的RFC)。因为这是一个bot,所以您可以实现presence probe,并接收给定实体的当前存在。记住将探测发送到裸JID(sans资源),因为服务器代表客户机响应状态探测。这意味着您的工作流程将如下所示:查看RFC的那一部分,以获得关于调用流应该如何工作的更深入的信息。在
相关问题 更多 >
编程相关推荐