python - 在 SleekXMPP 中通过消息接收 "role"和/或 "affiliation"

标签 python xmpp bots

对于业余问题表示歉意。我刚刚学习 Python,正在使用 XMPP 摸索这个 XMPP 机器人脚本。

我有一个使用 SleekXMPP 中的 MUC 机器人示例构建的机器人:http://sleekxmpp.com/getting_started/muc.html

我的机器人与示例的不同之处在于我的脚本创建了一个 SQLite 数据库,并在每个 group_message 事件上解析 XML 以检索昵称和消息正文文本,并将其与时间戳一起写入数据库。

这是我的机器人记录 XMPP channel 的消息输出的部分:

def groupchat_message(self, msg):
    if msg['type'] in ('groupchat'):
        raw = str(msg) # Save raw XML as a string in the database for debugging purposes
        timestamp = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')
        fromuser = str(msg['from']) # Convert "from" attribute to string so it can be split
        author = fromuser.split('/')[1] # Split "from" attribute to remove channel address leaving only nick behind
        body = msg['body']

        msginsert = [timestamp, author, body, raw] # Database input list to be handed to placeholders.

        db.execute("INSERT INTO messages VALUES (?,?,?,?)", msginsert) # "?" placeholder is REQUIRED for automatic database sanitization.
        dbconn.commit()

        print("[",timestamp,"]",author,": ",body, sep='')
    else:
        print(msg)

打印语句仅用于调试目的,因此我可以在终端中观察消息的滴答声,以便我知道脚本正在运行。

在记录的信息中,我还想包含用户在 XMPP channel 中的角色或从属关系,以便可以挑出管理员和版主。这就是我难以理解的问题。看来我应该能够根据 SleekXMPP stanza docs 做到这一点但我无法弄清楚如何从消息 XML 获取角色/从属关系信息。

如何获取消息 XML 中提供的信息并获取发布该消息的用户的角色和/或从属关系?

作为引用,这是消息的 XMPP channel 的原始 XML 输出:

<message to="username@example.com" from="channelname@channels.example.com/User Nick" id="1453" type="groupchat">
    <body>This is the message body text</body>
    <x xmlns="jabber:x:event">
        <composing />
    </x>
</message>

最佳答案

角色/从属关系不包含在消息中,它是聊天状态的一部分。

提醒一下,XMPP 具有三个不同的节来发送:<message> ,以您为例,<iq> ,用于检索或设置事物和 <presence> ,表示事物的存在。角色/从属关系信息包含在存在节中。例如,在您的客户收到的第一个存在节中,通知它谁已经在房间中,请参阅 Example 21 from XEP-0045 (Multi-User Chat) 。每当某人的昵称、角色或从属关系发生变化或离开房间时,您的客户也会收到新的状态节。

您应该确保自己存储此信息,因为 SleekXMPP 不会为您执行此操作。这可以通过创建一个字典来完成,该字典存储每个昵称、他们的角色以及他们的从属关系。当状态发生变化时,您应该确保更新此信息。然后您可以在消息处理程序中使用这些字典来记录他们的角色/从属关系。

所以类似:

def __init__(...):
    self.roles = dict()
    self.affiliations = dict()
    self.add_event_handler(""groupchat_presence"", self.muc_presence)

...

def muc_presence(self, presence):
    nick = presence['muc']['nick']

    self.roles[nick] = presence['muc']['role']
    self.affiliations[nick] = presence['muc']['affiliation']

这是总体思路,您需要做更多的工作来使其处理昵称更改和人们正确离开房间。

关于python - 在 SleekXMPP 中通过消息接收 "role"和/或 "affiliation",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23725837/

相关文章:

python - Django 定时事件

python - 确定字符串列表中的条件

javascript - Electron + xmpp.js : How I can Debug SSL Self-signed error messages?

ios - Xcode 持续集成没有按预期完成

python - MediaWiki API : can it be used to create new articles programatically?

python - 使 wxPython TextCtrl 响应 cr 或 tab

python - PySimpleGUI 如何在图像顶部放置按钮

android - 从 Android 设备登录 ejabberd 服务器失败

android - XMPP aSmack MultiUserChat 服务器继续发送已收到的消息

open-source - 简单的聊天机器人项目