如何获得联系人的可用性?

我需要使用python设置一个jabber机器人,它会根据几个联系人的在线/离线可用性发送消息。

我一直在研究pyxmpp和xmpppy,但找不到任何方法(至少没有直截了当的)来检查给定联系人的状态。

任何关于如何实现这一目标的指针?

理想情况下,我希望像bot.status_of("contact1@gmail.com")返回"online"


我不认为这是可能的,因为联系人(包含有关其可用性的信息)的存在是由机器人异步接收的。

您将不得不编写一个存在处理函数并将其注册到连接中。 无论何时从联系人收到状态,该功能都会被呼叫。 通话参数会告诉你联系人是否在线。 根据它,您可以将消息发送给联系人。

使用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:我没有测试代码,但它应该是非常相似的东西。


你想要的是通过<presence type="probe"/> 。 这是代表客户完成的,不应该由他们完成(按照XMPP IM的RFC)。 由于这是一个bot,您可以实施存在探测,并接收给定实体的当前状态。 请记住将探针发送到纯粹的JID(sans资源),因为服务器代表客户端响应在线探测。 这意味着您的工作流程将如下所示:

<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的这一部分,获取更多有关您的呼叫流程应该如何运作的深度信息。


你需要做的是:

  • 连接。
  • 声明一个存在处理程序。 该处理程序维护每个联系人存在的缓存(请参阅下面的详细信息)
  • 向服务器发送初始状态,这将引发接收所有在线联系人的状态状态,这将触发处理程序。
  • status_of()方法读取缓存并立即推断联系人的在线状态。
  • 现在,这取决于你需要什么状态信息。 为了简单起见,我们假装你只需要一个“在线”/“离线”值。 缓存将是一个字典,其键是裸(无资源)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
    

    当然,如果您需要更详细的信息,您不仅可以维护联系人可用资源的列表,还可以维护每个资源的状态,状态消息,优先级等。

    链接地址: http://www.djcxy.com/p/94047.html

    上一篇: how to get the availability of contacts?

    下一篇: How can I make my Perl Jabber bot an event