Я отлаживаюсь часами, чтобы решить проблему с извлечением истории чата сервера 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.