如何通过REST API获取ejabberd中两个用户的全部消息
问题:如何通过ejabberd REST API获取用户间的全部聊天消息?
我目前正在使用ejabberd将一对一聊天功能集成到Web应用中。已尝试通过send_message API从user2向user1发送消息,请求示例如下:
POST /api/send_message { "type": "headline", "from": "user2@localhost", "to": "user1@localhost", "subject": "Testing", "body": "Sample message from user2" }
打开pidgin后能看到来自user2的消息,接口返回0表示成功(文档说明此状态为成功)。在打开pidgin查看消息前,该消息被标记为离线消息,这一点我可从管理面板中查看。
现咨询:如何通过REST API端点获取user1与user2之间的全部消息?就像使用send_message端点实现跨用户发消息那样。
解决方案
首先得确认你的ejabberd实例已经启用了mod_mam模块(消息归档功能),这是获取历史消息的核心前提。如果没开,需要在ejabberd配置文件中添加或启用该模块,同时配置自动归档一对一消息的规则。
接下来,你可以通过ejabberd的REST API调用get_archive端点来拉取指定用户间的聊天记录,具体请求示例如下:
基础请求示例(带时间范围)
POST /api/get_archive { "user": "user1@localhost", "with": "user2@localhost", "start": "2024-01-01T00:00:00Z", "end": "2024-12-31T23:59:59Z" }
简化请求示例(无时间范围)
如果不需要限定时间,只传对话双方的账号即可:
POST /api/get_archive { "user": "user1@localhost", "with": "user2@localhost" }
参数说明
user:指定要查询消息记录的目标用户(比如要查看user1的聊天记录就填user1@localhost)with:指定对话的另一方账号(此处为user2@localhost)start/end:可选参数,用ISO 8601格式的时间串限定查询的时间范围
注意事项
- 调用该API的账号需要具备访问消息归档的权限,可在ejabberd的ACL配置中设置对应权限规则。
- 只有启用
mod_mam之后发送的消息才会被归档,之前的历史消息无法通过该API获取。 - 离线消息被用户读取后,依然会保存在归档中,除非你配置了自动删除过期消息的规则。
内容的提问来源于stack exchange,提问作者rangarajan
相关产品推荐
相关产品推荐

