Python -Sleekxmpp Как получить историю чата ejabberd-сервера? - PullRequest
0 голосов
/ 13 февраля 2020

Я отлаживаюсь часами, чтобы решить проблему с извлечением истории чата сервера ejabberd.

Я хочу получить историю чата ejabberd с помощью sleekxmpp и xep-0313, но получаю только этот ответ сервер:

<iq xml:lang="en" to="testuser2@ejabberd-server/5059298523419536631211" from="testuser2@ejabberd- 
server" type="result" id="a6f812aa-ab9b-4911-a012-fc1189cd0f28-4"><query xmlns="urn:xmpp:mam:tmp" 
queryid="a6f812aa-ab9b-4911-a012-fc1189cd0f28-4"><set xmlns="http://jabber.org/protocol/rsm"> 
<count>32</count><first>1579634833666674</first><last>1581591145874419</last></set></query></iq>

Я посмотрел спецификацию xmpp xep-0313 и обнаружил, что sleekxmpp дает мне только конец сообщений, что является правильным типом результата сервера чата.

Я также отлаживал с помощью wireshark и вижу, что сервер правильно возвращает все сообщения клиенту sleekxmpp, но выводит только конечное сообщение сервера с типом = результат, но не все возвращенные сообщения сервера.

У меня есть настройка ejabberd с базой данных mysql, и модуль mod_mam включен правильно. Я могу использовать gajim для правильного извлечения истории чата, и я вижу ее также на Wireshark. Должно быть, это ошибка в библиотеке sleekxmpp, но после прочтения исходного кода я понятия не имею, что происходит не так внутри библиотеки при анализе ответа.

В противном случае я не знаю, как использовать функцию получения из xep -0313 Подкласс sleekxmpp правильно, я просто следовал совету сообщества inte rnet. Я часами ищу документацию по этому вопросу в документации sleekxmpp, но ничего не нашел.

У кого-то есть такие же проблемы и есть решение, которое будет работать для извлечения истории чата. Я открыт для любого другого решения, не только для sleekxmpp.

Вот пример кода inte rnet Я нашел:

from sleekxmpp import ClientXMPP
import logging
import argparse

def test(*args, **kwargs):
    print(args, kwargs)


class EchoBot(ClientXMPP):
    """
        -- xmpp client class
        class for sending and recieving messages to xmpp server
    """

    def __init__(self, jid, passwd):
        super(EchoBot, self).__init__(jid, passwd)
        self.add_event_handler('session_start', self.start, threaded=True)
        self.add_event_handler('message', self.message, threaded=True)

    def start(self, event):
        self.send_presence()
        self.get_roster()
        self['xep_0313'].retrieve(block=True, callback=test)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("-j", "--jid", action="store", required=True, help="please insert a jabber id 
       like testuser@localhost.")
    parser.add_argument("-p", "--passwd", action="store", required=True, help="please insert a 
    password.", default=logging.INFO)
    parser.add_argument("-n", "--node", action="store", required=True, help="please insert a host 
    address 
    to connect to a specific host.", default="")
    parser.add_argument("-l", "--loglevel", action="store", required=False, help="you can optional 
    enter a loglevel.")
    args = parser.parse_args()

    logging.basicConfig(level=args.loglevel, format= '%(levelname)-8s %(message)s')

    xmpp_client = EchoBot(args.jid, args.passwd)
    plugins = ['xep_0030', 'xep_0004', 'xep_0060', 'xep_0199', 'xep_0313']

    for item in plugins:
        xmpp_client.register_plugin(item)

    if xmpp_client.connect((args.node, 5222)):
        print("Success")
        xmpp_client.proccess(block=True)

Я пробовал несколько аргументов при получении функция (с block = True и block = False или с функцией обратного вызова и без), но я получаю только этот результат chatserver.

...