SleekXMPP 自动接受所有聊天室邀请

Posted

技术标签:

【中文标题】SleekXMPP 自动接受所有聊天室邀请【英文标题】:SleekXMPP automatically accept all chat room invites 【发布时间】:2014-06-10 05:42:34 【问题描述】:

我想使用 SleekXMPP 并自动接受发送给我的所有聊天室邀请。我知道 xep_0045 插件可以检测到我何时收到邀请,因为我在调试器中收到通知。我对 Python 还是很陌生,如果有任何帮助,我将不胜感激。

到目前为止,我在 xep_0045 插件中找到了一个名为 handle_groupchat_invite 的函数。具体来说,这段代码:

def plugin_init(self):
        #...
        self.xmpp.registerHandler(Callback('MUCInvite', MatchXMLMask("<message xmlns='%s'><x xmlns='http://jabber.org/protocol/muc#user'><invite></invite></x></message>" % self.xmpp.default_ns), self.handle_groupchat_invite))

#...

def handle_groupchat_invite(self, inv):
        """ Handle an invite into a muc.
        """
        logging.debug("MUC invite to %s from %s: %s", inv['from'], inv["from"], inv)
        if inv['from'].bare not in self.rooms.keys():
            self.xmpp.event("groupchat_invite", inv)

所以当我在终端日志中看到“MUC 邀请...”消息时,我看到了这种方法。从那里,我希望我需要使用self.plugin['xep_0045'].joinMUC() 加入聊天室的 URL(由inv["from"] 提供)。但是,我不确定应该在脚本中的何处调用此代码。

再次感谢您的帮助。

更新:我也尝试在__init__ 函数中使用add_event_handler。具体我的代码是:

def __init__(self, jid, password, room, nick):
    sleekxmpp.ClientXMPP.__init__(self, jid, password)

    self.room = room
    self.nick = nick

    # The session_start event will be triggered when
    # the bot establishes its connection with the server
    # and the XML streams are ready for use. We want to
    # listen for this event so that we we can initialize
    # our roster.
    self.add_event_handler("session_start", self.start)

    # The groupchat_message event is triggered whenever a message
    # stanza is received from any chat room. If you also also
    # register a handler for the 'message' event, MUC messages
    # will be processed by both handlers.
    self.add_event_handler("groupchat_message", self.muc_message)

    # The groupchat_presence event is triggered whenever a
    # presence stanza is received from any chat room, including
    # any presences you send yourself. To limit event handling
    # to a single room, use the events muc::room@server::presence,
    # muc::room@server::got_online, or muc::room@server::got_offline.
    self.add_event_handler("muc::%s::got_online" % self.room,
                           self.muc_online)

    self.add_event_hander("groupchat_invite", self.sent_invite)

从那里,我创建了sent_invite 函数,代码在这里:

def sent_invite(self, inv):
    self.plugin['xep_0045'].joinMUC(inv["from"], self.nick, wait=True)

但是,当我这样做时,我收到以下错误:

文件“muc.py”,第 66 行,在 init 中 self.add_event_hander("groupchat_invite", self.sent_invite) AttributeError: 'MUCBot' object has no attribute 'add_event_hander'

但在 xep_0045 插件中,我看到了以下代码:self.xmpp.event("groupchat_invite", inv)。根据事件处理程序 SleekXMPP wiki page,

每当从 XML 流中接收到特定节时,就会出现流事件。每当调用 xmpp.event(name, data) 时都会创建触发事件(其中 xmpp 是一个 SleekXMPP 对象)。

有人可以解释我为什么会收到错误吗?我也尝试过使用

self.add_event_hander("muc::groupchat_invite", self.sent_invite)

但也没有成功。

【问题讨论】:

【参考方案1】:

我刚刚从 git 下载了 SleekXMPP 并像这样添加 groupchat_invite 处理程序,它可以工作:

diff --git a/examples/muc.py b/examples/muc.py
index 5b5c764..e327fac 100755
--- a/examples/muc.py
+++ b/examples/muc.py
@@ -61,7 +61,10 @@ class MUCBot(sleekxmpp.ClientXMPP):
         # muc::room@server::got_online, or muc::room@server::got_offline.
         self.add_event_handler("muc::%s::got_online" % self.room,
                                self.muc_online)
-
+        self.add_event_handler("groupchat_invite", self.accept_invite)
+
+    def accept_invite(self, inv):
+       print("Invite from %s to %s" %(inv["from"], inv["to"]))

     def start(self, event):
         """

【讨论】:

啊,你只是打错了手ler那里:)

以上是关于SleekXMPP 自动接受所有聊天室邀请的主要内容,如果未能解决你的问题,请参考以下文章

通过 SleekXMPP 发送 facebook 消息

python 响应好友请求/自动聊天/限制频率/邀请入群/远程群管理/新人欢迎消息/关键词问答/发心跳/远程命令/远程执行代码

如何在纽约接受邀请?

使用 XMPPHP 的聊天邀请

关于Java聊天收到消息自动弹出窗口代码

无法再从 Openfire 用户向 GMAIL 帐户发送聊天邀请 [关闭]