Серверный компонент SleekXMPP (Slixmpp) не получает все сообщения MU C от ejabberd - PullRequest
0 голосов
/ 28 февраля 2020

мы хотим создать простой серверный компонент для ejabberd , который получает все сообщения, отправленные в MU C комнаты (у нас много комнат, и все время создаются новые ) и после обработки некоторых из этих сообщений выполняет некоторые операции.

Мы не хотим, чтобы наш серверный компонент действовал как бот, поэтому мы не хотим, чтобы он отвечал на сообщения или тому подобное, мы просто хотим, чтобы он получал копии всех сообщений для обработки некоторых из них.

Чтобы сделать это, мы следовали учебному пособию, доступному здесь: https://sleekxmpp.readthedocs.io/en/latest/getting_started/component.html

Проблема в том, что компонент, кажется, получает только некоторые сообщения (примерно 1 из 5).

Кроме того, мы наблюдаем странное поведение: доставка сообщения кажется «исключительной», что означает, что сообщение доставляется либо клиентам, подключенным к комнате, либо компоненту сервера, что странно, если честно. Другими словами, 1 сообщение из 5 доставляется на серверный компонент, а остальные 4 доставляются клиентам как обычно.

Вот наш код компонента (мы пробовали с обоими sleekxmpp и slixmpp, но у нас всегда одинаковое поведение):

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()

и вот фрагмент нашей конфигурации ejabberd 18.03:

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

мы также пытались поиграть с доступом, privilege_access и такие вещи, но не повезло.

У вас есть идеи, что может вызвать это странное поведение? Есть ли какой-нибудь конкретный плагин или модуль, который должен быть включен?

Конечно, мы включили журналы отладки как в sleekxmpp, так и в ejabberd, но мы не видим никаких ошибок, просто сообщения отсутствуют.

Мы также сделали еще один тест. Даже используя официальный пример "echo component", доступный в репозитории slixmpp, мы сталкиваемся с той же проблемой. Похоже, что на нашем сервере есть какая-то проблема, возможно, в части маршрутизации сообщений, мы не знаем.

Спасибо

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Я думаю, что вы смешали пару вещей здесь. Компонент, который вы создали здесь, похоже, подключается к ejabber как внешний компонент (см. https://xmpp.org/extensions/xep-0114.html или https://xmpp.org/extensions/xep-0225.html), исходя из http://sleekxmpp.com/getting_started/component.html, что означает, что ejabber (кажется, по крайней мере) направляет некоторые сообщения к его внутреннему компоненту, а некоторые - к вашему (внешнему) компоненту. Это объясняет, почему ваш компонент получает только определенные сообщения.

У вас есть два варианта:

  • использовать SleekXMPP, но подключаться как обычный пользователь (вы можете использовать пример "бот" и просто слушать сообщения без ответа)
  • создать выделенный компонент / обработчик в ejabberd, который будет принимать все сообщения и обрабатывать их соответствующим образом.

Оба варианта имеют свои плюсы и минусы:

  • client-in-room - более простая (кажется, для вас) разработка, но требует постоянного подключения и может потерять некоторые сообщения, если соединение прервано
  • выделенный обработчик в ejabberd - скорее всего, немного сложнее в реализации.
0 голосов
/ 03 марта 2020

Оказывается, я совершенно неправильно понял назначение внешних компонентов Jabber.

Я ожидал получить "копию" всех событий, происходящих в ejabberd, но я ошибся.

чтобы достичь ожидаемого результата, я использую модуль с именем "mod_post_log", который отправляет HTTP-запрос на каждое сообщение, отправленное пользователем. Это работает для меня.

...