SliekXMPP(Slixmpp)服务器组件未从ejabberd接收所有MUC消息
我们希望为ejabberd构建一个简单的服务器组件,该组件接收发送到MUC房间的所有消息(我们有许多房间,并且一直在创建新房间),并在处理其中一些消息后执行一些操作 我们不希望我们的服务器组件像机器人一样工作,所以我们不希望它回复消息或类似的事情,我们只希望它接收所有消息的副本,以便处理其中一些消息 为此,我们遵循了此处提供的教程: 问题在于组件似乎只接收部分消息(大约五分之一) 此外,我们还观察到一种奇怪的行为:消息传递似乎是“独占的”,这意味着消息要么被传递到连接到房间的客户端,要么被传递到服务器组件,老实说,这很奇怪。换句话说,5条消息中有1条发送到服务器组件,其余4条消息照常发送到客户端。 下面是我们的组件代码(我们已经尝试了sleekxmpp和slixmpp,但我们总是有相同的行为): 我们也尝试过使用访问、特权访问和类似的东西,但没有运气 你知道是什么导致了这种奇怪的行为吗?是否有任何特定的插件或模块需要启用 当然,我们在sleekxmpp和ejabberd上都启用了调试日志,但是我们没有看到任何错误,只是缺少消息 我们还做了一个测试。即使使用slixmpp存储库中提供的官方“echo组件”示例,我们也有同样的问题。因此,我们的服务器似乎存在一些问题,可能在消息路由部分,我们不知道SliekXMPP(Slixmpp)服务器组件未从ejabberd接收所有MUC消息,xmpp,ejabberd,ejabberd-module,sleekxmpp,Xmpp,Ejabberd,Ejabberd Module,Sleekxmpp,我们希望为ejabberd构建一个简单的服务器组件,该组件接收发送到MUC房间的所有消息(我们有许多房间,并且一直在创建新房间),并在处理其中一些消息后执行一些操作 我们不希望我们的服务器组件像机器人一样工作,所以我们不希望它回复消息或类似的事情,我们只希望它接收所有消息的副本,以便处理其中一些消息 为此,我们遵循了此处提供的教程: 问题在于组件似乎只接收部分消息(大约五分之一) 此外,我们还观察到一种奇怪的行为:消息传递似乎是“独占的”,这意味着消息要么被传递到连接到房间的客户端,要么被传递到
谢谢我想你在这里混合了一些东西。您在此处创建的组件似乎作为外部组件连接到ejabber(请参阅或),这意味着ejabber(似乎至少)将一些消息路由到其内部组件,而将一些消息路由到您的(外部)组件。这将解释为什么您的组件只接收某些消息 您有两个选择:
- 使用SleekXMPP,但作为普通用户连接(您可以使用“bot”示例,只需侦听消息而无需响应)
- 在ejabberd中创建专用组件/处理程序,用于接收所有消息并进行相应处理
- 室内客户端-更容易(似乎对您而言)开发,但需要不断连接,如果连接断开,可能会丢失一些消息
- ejabberd中的专用处理程序-很可能稍微难以实现
为了达到我预期的效果,我使用了一个名为“mod_post_log”的模块,该模块为用户发送的每条消息发送一个HTTP请求。这对我很有用。Hi@Wojtek,谢谢你的回答。可能我误解了ejabberd中外部组件的用途,我认为它们收到了ejabberd中生成的每个事件(消息、存在等)的通知,但可能我错了。允许外部组件接收来自用户的消息的唯一方法是明确地让用户向其JID发送消息,对吗?是的,向专用JID发送消息是可行的,但对于外部组件,您使用的是完全相同的JID(
muc.ourservice.it
),因此“混淆”了ejabberd。
import sys
import logging
#import sleekxmpp
#from sleekxmpp.componentxmpp import ComponentXMPP
import slixmpp
from slixmpp.componentxmpp import ComponentXMPP
if sys.version_info < (3, 0):
from sleekxmpp.util.misc_ops import setdefaultencoding
setdefaultencoding('utf8')
else:
raw_input = input
class NotificationsComponent(ComponentXMPP):
def __init__(self):
ComponentXMPP.__init__(self, "muc.ourservice.it", "secret", "jabber.ourservice.it", 5233)
# add handler
self.add_event_handler("message", self.message)
#self.add_event_handler("groupchat_message", self.message)
def message(self, msg):
if msg['type'] == 'groupchat':
print('Received group chat message')
print(msg)
#msg.reply('Well received').send()
else:
print('Received another message')
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG,format='%(levelname)-8s %(message)s')
xmpp = NotificationsComponent()
xmpp.register_plugin('xep_0030') # Service Discovery
#xmpp.register_plugin('xep_0004') # Data Forms
#xmpp.register_plugin('xep_0060') # PubSub
xmpp.register_plugin('xep_0199') # XMPP Ping
#xmpp.register_plugin('xep_0045') # MUC
# Connect to the XMPP server and start processing XMPP stanzas.
xmpp.connect()
xmpp.process()
listen:
-
port: 5222
ip: "::"
module: ejabberd_c2s
starttls: true
certfile: 'CERTFILE'
protocol_options: 'TLSOPTS'
## dhfile: 'DHFILE'
## ciphers: 'CIPHERS'
##
## To enforce TLS encryption for client connections,
## use this instead of the "starttls" option:
##
starttls_required: true
##
## Stream compression
##
zlib: true
##
max_stanza_size: 65536
shaper: none
access: c2s
-
port: 5280
ip: "::"
module: ejabberd_http
request_handlers:
"/admin": ejabberd_web_admin
"/bosh": mod_bosh
#request_handlers:
# "/ws": ejabberd_http_ws
# "/bosh": mod_bosh
# "/api": mod_http_api
## "/pub/archive": mod_http_fileserver
web_admin: true
http_bind: true
## register: true
captcha: false
certfile: 'CERTFILE'
tls: true
-
port: 5233
ip: "::"
module: ejabberd_service
access: all
privilege_access:
message: "outgoing"
password: "secret"
shaper: none