4

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

我的设置是这样的:

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

    这是我的要求:

    我正在尝试自动化我在 gtalk 上收到的某些类型的消息。所以每当我收到一条特定的消息,例如:“你好吗”,我自己的 XMPP 客户端应该自动回复说“很好”。你好吗”。所有发送到 x@xyz.com 的消息(在我的客户回复之前和之后)但应该被所有客户端接收(我自己的客户端没有 UI,只能回复特定的消息。)。

    现在我已经对我的客户进行了编码以自动回复。这工作正常。但我面临的问题是,一旦我回复(我使用 smack 库),发送到 x@xyz.com 的所有后续消息都只能由我的 XMPP 客户端接收。这显然是一个问题,因为我自己的客户端非常垃圾并且没有 UI,所以我看不到发送给我的其余消息,从而使我“丢失”消息。

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

    我希望我的问题很清楚。

  • 4

    1 回答 1

    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 如何在连接后立即为您的机器人客户端设置状态并将优先级设置为 <0。

    于 2010-11-08T07:55:27.907 回答