如何使用Python的xmpp查询联系人的PubSub?

0 投票
1 回答
617 浏览
提问于 2025-04-15 17:31

我正在用Python写一个XMPP机器人(使用xmpppy这个库)。我想在用户请求后,检查他的PubSub状态(比如心情、音乐)并对这些信息做点什么。请问我该怎么做呢?

我知道如何解析用户在改变状态时发送的消息,但我不知道怎么让用户主动给我发送这样的消息。

1 个回答

3

阅读一下 XEP-163。简单来说,你需要实现实体能力的发送端(XEP-115),这样你就可以像下面这样发送你的状态信息:

<presence from='romeo@example.net/home'>
  <c xmlns='http://jabber.org/protocol/caps' 
     hash='sha-1'
     node='http://example.com/MYBOT'
     ver='/FpawanrJ31ymsv4ApCMGcyJmUk='/>
</presence>

当你收到这样的 disco#info 请求时:

<iq to='romeo@example.net/home'
    id='disco1'
    from='example.net' 
    type='get'>
  <query xmlns='http://jabber.org/protocol/disco#info'
         node='http://example.com/MYBOT#/FpawanrJ31ymsv4ApCMGcyJmUk='/>
</iq>

你需要用你实现的功能列表来回应:

<iq from='romeo@example.net/home'
    id='disco1'
    to='example.net' 
    type='result'>
  <query xmlns='http://jabber.org/protocol/disco#info'
         node='http://example.com/MYBOT#/FpawanrJ31ymsv4ApCMGcyJmUk='>
    <identity category='client' type='bot' name='MYBOT'/>
    <feature var='http://jabber.org/protocol/mood+notify'/>
    <feature var='http://jabber.org/protocol/tune+notify'/>
  </query>
</iq>

在你想要隐式订阅的每个节点名称前加上 +notify,然后把生成的字符串作为功能添加,如上所示。确保你发送的状态信息中的 SHA-1 哈希值是正确的,这一点是唯一比较复杂的部分。

撰写回答