如何获取即时通讯协议XMPP消息的时间戳?

19

我正在使用aSmack库与远程xmpp服务器通信。 我能够发送/接收消息,但我想获取传入消息的时间戳。

请问是否可能实现?因为我无法在这个问题上找到任何信息。

提前致谢。


你有任何解决方案吗?我正在面临一些问题。 - CoronaPintu
6个回答

12

由于规范要求XMPP消息必须有时间属性:

http://xmpp.org/extensions/xep-0203.html#protocol

请检查<message<delay项:

<delay xmlns='urn:xmpp:delay'
 from='capulet.com'
 stamp='2002-09-10T23:08:25Z'>
Offline Storage
</delay> 

不过获取它看起来有点棘手。一旦重新编译aSmack与一些替换的东西,因此尝试像这里一样获取它:

http://edwin.baculsoft.com/2011/06/how-to-get-offline-messages-timestamp-on-openfire/

DelayInformation inf = null;
try {
    inf = (DelayInformation)packet.getExtension("x","jabber:x:delay");
} catch (Exception e) {
    log.error(e);
}
// get offline message timestamp
if(inf!=null)
    Date date = inf.getStamp();

很可能,您需要检查服务器发送的消息扩展值,并将"jabber:x:delay"替换为'urn:xmpp:delay',就像XMPP规范示例中所示。

但不确定是否有效。


很遗憾它没有帮助,但我非常感谢你的帮助。 - Infernus
3
这个答案是错误的,因为提到的协议仅适用于特定情况下历史性质的消息。它不适用于原帖中的问题(一般消息),因为XMPP不支持这种功能。 - Robin
@Dmitry 当我加入群组时会有延迟,但在addPacketListener(new PacketListener()中不会有。我想要获取消息时间。 - CoronaPintu

12

时间戳不是常规消息的一部分,因此您无法提取它。

有一个规范(由@Dmitry提到),但这仅适用于特定类型的消息。通常这些消息不是实时的,比如离线和在创建新订阅时发布节点的最后一个pubsub消息。这些是具有内在延迟的消息。


6
虽然部分内容已经在其他答案中提到,但我会按照以下方式呈现答案...
XMPP是“实时”的...尽管这个术语对不同的人意味着很多不同的事情,但通常你可以安全地假设你收到消息几乎就是它们被发送的时候——所有XMPP软件都是围绕实现这个目标而设计的。
然而,没有关于端到端延迟的实际保证。在一般情况下,你通常会在发送者传输消息后不到一秒钟就接收到消息,尽管网络条件可能会影响这一点。
在某些情况下,消息将被暂时延迟,例如当需要建立新的服务器对服务器连接时。这通常需要几秒钟的时间,具体取决于网络条件和服务器之间使用的身份验证方法。
如果收件人离线,消息也可能被阻塞——收件人的服务器可能会将消息保存在“离线消息”存储中,直到收件人上线时才能将其交付。
由于XMPP消息的一般即时传递性,时间戳通常不包含在消息本身中,因为这些信息是无用的(并且假定所有时钟都是正确的)。
在某些情况下,消息被有意延迟,例如上面的示例,延迟消息的实体可能会在消息中插入一个标记,指示消息的原始时间。这在XEP-0203: Delayed Delivery中有详细说明。

当然。一些服务器如OpenFire在发送聊天历史时使用XEP-0203协议。 - Eric G

3

它也适用于4.1.9版本

DelayInformation inf = null;
inf = (DelayInformation)message.getExtension(DelayInformation.ELEMENT,DelayInformation.NAMESPACE);
if (inf != null){
    Date date = inf.getStamp();
    System.out.println("date: "+date);
}

1
使用 smack 4.2.0-rc2-SNAPSHOT 版本可以很容易地访问。
DelayInformation delayInformation = forwarded.getDelayInformation();
delayInformation.getStamp().getTime();

你的转发来自哪里? - penguineer
你能解释一下你从哪里转发过来的吗? - Sagar Maiyad

1

对于离线消息: 您将会收到以下消息:

<message xml:lang='en' to='<TO>' from='<FROM>' type='chat' id='3SE7n-39'><delay xmlns='urn:xmpp:delay' from='lakshitnagar.com' stamp='2020-09-05T18:01:01.854690Z'>Offline Storage</delay><offline xmlns='http://jabber.org/protocol/offline'><item node='335'/></offline><body>Hello</body></message>

你可以解析这个XML来获取delay标签下的stamp属性。这将给出消息从发送者发送的时间。
对于MAM归档消息: 你将会收到以下内容:
<message xmlns='jabber:client' to='<TO>' from='<FROM>' id='NzVV5-84' xml:lang='en' type='chat'><archived xmlns='urn:xmpp:mam:tmp' xmlns:stream='http://etherx.jabber.org/streams' by='lakshitnagar@lakshitnagar.com' id='1599328757912003'></archived><body>hello</body></message>

你可以解析这个XML文件来获取archived标签下的id属性。这将为你提供从发送者发送此消息时的微秒级时间戳。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接