在不开始聊天的情况下发送XMPP消息

时间:2010-11-06 07:15:10

标签: xmpp smack

我基本上是在写一个XMPP客户端来自动回复“特定”聊天消息。

我的设置是这样的:

  • 我的机器上运行了 pidgin ,配置为使用 x@xyz.com 帐户运行。
  • 我已将我自己的jabber客户端配置为使用相同的帐户运行 x@xyz.com
  • 可能有其他XMPP客户端

    这是我的要求:

    我正在尝试自动化我在gtalk上收到的某些消息。因此,每当我收到一条特定的消息,例如:“你好吗”时,我自己的XMPP客户端应该自动回复说“罚款”。你是怎么回事。所有邮件(我的客户回复之前和之后)发送到x@xyz.com但是应该被所有客户收到(我自己的客户端没有用户界面,只能回复具体信息。)。

    现在我已经将客户端编码为自动回复。这很好用。但我面临的问题是,只要我回复(我使用smack库),发送到x@xyz.com的所有后续消息都只能由我的XMPP客户端接收。这显然是一个问题,因为我自己的客户端非常倾倒并且没有UI,所以我不会看到发送给我的其他消息,从而使我“丢失”消息。

    我也观察到与其他XMPP客户端相同的行为。现在的问题是,这是XMPP的要求(很抱歉,我还没有很好地阅读XMPP协议)。是否可以对XMPP客户端进行编码以向用户发送回复,并且仍能够在当前正在侦听消息的所有客户端中接收所有后续消息?让我的客户端成为一个完整的XMPP客户端是一个解决方案,但我不想走那条路。

    我希望我的问题很明确。

  • 1 个答案:

    答案 0 :(得分:5)

    您可能必须为机器人设置负面存在优先级..

    首先要知道的是,在XMPP协议中,每个客户端都应该有一个完整的JID。这是一个简单的JID - 在你的情况下是x@xyz.com,最后有一个资源,例如: x@xyz.com/pidgin或x@xyz.com/home(其中/ pidgin和/ home是资源)。这是如何实现将消息路由到不同客户端的一部分。

    然后是存在节。上线时,客户端通常会向服务器发送一个在线状态节。这告知例如如果客户可以聊天或外出吃午饭。随着这些信息可以优先发送。当连接多个客户端时,具有最高优先级的客户端将收到发送到裸JID的消息(例如ClientA(prio = 50)和ClientB(prio = 60) - > ClientB接收发送到x @ xyz的消息.COM)。但也存在负面优先事项。小于0的优先级表示永远不应该向该客户端发送任何消息。这样的节可能看起来像这样

    <presence from="x@xyz.com/bot">
        <priority>-1</priority>
    </presence>
    

    这可能适合您的情况。请记住,它还取决于您的帐户所在的XMPP服务器,该服务器可能已经或可能没有完全实现此协议的这一部分。

    总结一下:我建议您查看Smack API如何设置状态,并在连接后立即为您的bot客户端设置优先级为<0。