如何使用 Java Smack 库从 openfire 服务器检索聊天记录?

How retrieve Chat History using Java Smack library from openfire server?

在 Openfire 服务器中安装 Open Archive 插件后,我可以从 openfire 管理面板看到两个用户之间的聊天对话,这非常简单,而且也是基于 Web 的。现在我想从我使用 Smack 库的聊天客户端应用程序(用 java 编写)中检索那些对话或聊天历史记录。我没有找到任何有用的资源。任何建议都会有所帮助。

终于找到答案了。 Smack 库中当前未实现存档消息传递功能。

https://community.igniterealtime.org/message/249993#249993

您正在寻找的解决方案属于 XMPP 规范的 XEP-0136 消息归档,但 Smack 尚未实现此功能。但您可以使用 SMACK API 提供的 "custom-stanza" 功能从服务器检索消息历史记录。以下链接描述了如何发送自定义节。 “”。

Smack 刚刚实现了 MAM 功能 [XEP 0313] 但尚未发布,如果您想使用此功能,希望在下一个版本中获得它 从 source 构建 smack 库,或者您可以使用自定义 IQ 来从服务器获取归档消息。

这可能是一个迟到的答案,但现在 SMACK API 支持 XEP-0136 和 XEP-0313,所以下面的代码可以帮助人们登陆这个页面。

public MamManager.MamQueryResult getArchivedMessages(String jid, int maxResults) {

        MamManager mamManager = MamManager.getInstanceFor(connection);
        try {
            DataForm form = new DataForm(DataForm.Type.submit);
            FormField field = new FormField(FormField.FORM_TYPE);
            field.setType(FormField.Type.hidden);
            field.addValue(MamElements.NAMESPACE);
            form.addField(field);

            FormField formField = new FormField("with");
            formField.addValue(jid);
            form.addField(formField);

            // "" empty string for before
            RSMSet rsmSet = new RSMSet(maxResults, "", RSMSet.PageDirection.before);
            MamManager.MamQueryResult mamQueryResult = mamManager.page(form, rsmSet);

            return mamQueryResult;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

也许我来晚了回答这个问题,但可能会对其他人有所帮助。

获取 getArchivedMessages(jid, maxResults); 的函数结果
public List<ChatMessage> getChatHistoryWithJID(String jid, int maxResults) {
    List<ChatMessage> chatMessageList = new ArrayList<>();
    MamManager.MamQueryResult mamQueryResult = getArchivedMessages(jid, maxResults);
    String userSendTo = XmppUtils.parseNameFromJID(jid);

    try {
        if (mamQueryResult != null && userSendTo != null) {
            for (Forwarded forwarded : mamQueryResult.forwardedMessages) {
                if (forwarded.getForwardedStanza() instanceof Message) {
                    Message msg = (Message) forwarded.getForwardedStanza();
                    Log.d(TAG, "onCreate: " + msg.toString());
                    Log.d(TAG, "processStanza: " + msg.getFrom() + " Say:" + msg.getBody() + " String length:" + (msg.getBody() != null ? msg.getBody().length() : ""));
                    ChatMessage chatMessage;
                    if (XmppUtils.parseNameFromJID(msg.getFrom().toString()).equalsIgnoreCase(userSendTo)) {
                        chatMessage = new ChatMessage(msg.getBody(), forwarded.getDelayInformation().getStamp().getTime(), ChatMessage.Type.RECEIVED);
                    } else {
                        chatMessage = new ChatMessage(msg.getBody(), forwarded.getDelayInformation().getStamp().getTime(), ChatMessage.Type.SENT);
                    }
                    chatMessageList.add(chatMessage);

                }
            }
        } else {
            return chatMessageList;
        }

        return chatMessageList;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return chatMessageList;
}

现在查询将变成:

<iq  id='ri7F7-270' type='set'>
<query  xmlns='urn:xmpp:mam:1' queryid='afd9c922-21cb-437e-b5c4-3a5bf9994e40'>
    <x  xmlns='jabber:x:data' type='submit'>
        <field  var='FORM_TYPE' type='hidden'>
            <value>urn:xmpp:mam:1</value>
        </field>
        <field  var='with'>
            <value>vishal@jabberid</value>
        </field>
    </x>
    <set  xmlns='http://jabber.org/protocol/rsm'>
        <before>
        </before>
        <max>100</max>
    </set>
</query>

响应如下:

<message to="vishal@jabberid">
<result xmlns="urn:xmpp:mam:1"  queryid="afd9c922-21cb-437e-b5c4-3a5bf9994e40" id="992">
<forwarded xmlns="urn:xmpp:forward:0">
  <delay xmlns="urn:xmpp:delay" stamp="2019-04-05T06:38:40.612Z"/>
  <message xmlns="jabber:client" to="vishal@jabberid" id="h58k4-104" type="chat" from="vishal@jabberid">
    <body>Hi</body>
  </message>
</forwarded>
</result>
</message>

还有更多内容可以阅读 link https://xmpp.org/extensions/xep-0313.html