如何使用 Java Smack 库从 openfire 服务器检索聊天记录?
How retrieve Chat History using Java Smack library from openfire server?
在 Openfire 服务器中安装 Open Archive 插件后,我可以从 openfire 管理面板看到两个用户之间的聊天对话,这非常简单,而且也是基于 Web 的。现在我想从我使用 Smack 库的聊天客户端应用程序(用 java 编写)中检索那些对话或聊天历史记录。我没有找到任何有用的资源。任何建议都会有所帮助。
终于找到答案了。 Smack 库中当前未实现存档消息传递功能。
您正在寻找的解决方案属于 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
在 Openfire 服务器中安装 Open Archive 插件后,我可以从 openfire 管理面板看到两个用户之间的聊天对话,这非常简单,而且也是基于 Web 的。现在我想从我使用 Smack 库的聊天客户端应用程序(用 java 编写)中检索那些对话或聊天历史记录。我没有找到任何有用的资源。任何建议都会有所帮助。
终于找到答案了。 Smack 库中当前未实现存档消息传递功能。
您正在寻找的解决方案属于 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