【问题标题】:Jabber bot - how to get the availability of contacts?Jabber bot - 如何获取联系人的可用性?
【发布时间】:2011-04-22 21:18:30
【问题描述】:

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

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

关于如何实现这一点的任何指示?

理想情况下,我想要类似的东西,例如bot.status_of("contact1@gmail.com")返回"online"

【问题讨论】:

    标签: python xmpp bots xmpppy


    【解决方案1】:

    你需要做的是:

    1. 连接。
    2. 声明一个存在处理程序。该处理程序维护每个联系人的存在缓存(请参阅下面的详细信息)
    3. 将初始状态发送到服务器,这将促使接收所有在线联系人的状态状态,进而触发处理程序。
    4. 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
    

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

    【讨论】:

      【解决方案2】:

      您想要的可以通过<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 的该部分,了解有关您的呼叫流程应如何表现的更深入信息。

      【讨论】:

        【解决方案3】:

        我认为这不可能以您想要的方式进行,因为机器人会异步接收联系人的存在(其中包含有关其可用性的信息)。

        您必须编写一个在线处理函数并将其注册到连接中。每当收到来自联系人的出席信息时,都会调用此函数。通话参数会告诉你联系人是否在线。根据它,您可以将消息发送给联系人。

        使用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:我没有测试过代码,但它应该和这个非常相似。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-19
          • 1970-01-01
          • 2017-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-04
          相关资源
          最近更新 更多