拉取单聊历史消息

最近更新时间:2024-07-09 17:59:31

我的收藏

功能说明

管理员按照时间范围,以会话其中一方的角度查询单聊会话的消息记录。
查询的单聊会话由请求中的 Operator_Account 和 Peer_Account 指定,以 Operator_Account 的角度查询。查询结果包含会话双方互相发送的消息,具体每条消息的发送方和接收方由每条消息里的 From_Account 和 To_Account 指定。
正常情况下,分别以会话双方的角度查询消息,结果是一样的。但以下四种情况会导致结果不一样(即会话里的某些消息,其中一方能查询到,另一方查询不到):
会话的其中一方清空了会话的消息记录,即调用了终端的 clearC2CHistoryMessage() 接口。
会话的其中一方删除了会话,即调用了终端的 deleteConversation() 接口,或者 Web /小程序/ uni-app 的 deleteConversation 接口,或者服务端的 删除单个会话 的接口且指定了 ClearRamble 的值为1。
会话的其中一方删除了部分消息,即调用了终端的 deleteMessages() 接口,或者 Web /小程序/ uni-app 的 deleteMessage 接口。
通过 单发单聊消息批量发单聊消息 接口发送的消息,指定了 SyncOtherMachine 值为2,即指定消息不同步到发送方的消息记录。
查询结果包含被撤回的消息,由消息里的 MsgFlagBits 字段标识。
查询结果中的 IsPeerRead 字段表示接收方是否发送该条消息的已读回执。只有接收方调用 sendMessageReadReceipts (Android / iOS & Mac / Windows)sendMessageReadReceipt (Web&小程序&uni-app) 接口后,该字段才会为1。
若想通过 REST API 撤回单聊消息 接口撤回某条消息,可先用本接口查询出该消息的 MsgKey,然后再调用撤回接口进行撤回。
可查询的消息记录的时间范围取决于漫游消息存储时长,默认是7天。支持在控制台修改消息漫游时长,延长消息漫游时长是增值服务。具体请参考 漫游消息存储
若请求时间段内的消息总大小超过应答包体大小限制(目前为13K)时,则需要续拉。您可以通过应答中的 Complete 字段查看是否已拉取请求的全部消息。

接口调用说明

请求 URL 示例

https://xxxxxx/v4/openim/admin_getroammsg?sdkappid=88888888&identifier=admin&usersig=xxx&random=99999999&contenttype=json

请求参数说明

下表仅列出调用本接口时涉及修改的参数及其说明,更多参数详情请参考 REST API 简介
参数
说明
xxxxxx
SDKAppID 所在国家/地区对应的专属域名:
中国:console.tim.qq.com
新加坡:adminapisgp.im.qcloud.com
首尔: adminapikr.im.qcloud.com
法兰克福:adminapiger.im.qcloud.com
硅谷:adminapiusa.im.qcloud.com
雅加达:adminapiidn.im.qcloud.com
v4/openim/admin_getroammsg
请求接口
sdkappid
创建应用时即时通信 IM 控制台分配的 SDKAppID
identifier
必须为 App 管理员账号,更多详情请参见 App 管理员
usersig
App 管理员账号生成的签名,具体操作请参见 生成 UserSig
random
请输入随机的32位无符号整数,取值范围0 - 4294967295
contenttype
请求格式固定值为json

最高调用频率

200次/秒。

请求及应答示例

例如,用户 user1 和 user2 聊天,现在需要以 user2 的角度查询该会话在2020-03-20 10:00:00 - 2020-03-20 11:00:00内的聊天记录。

请求示例

{
"Operator_Account":"user2",
"Peer_Account":"user1",
"MaxCnt":100,
"MinTime":1584669600,
"MaxTime":1584673200
}

应答示例

{
"ActionStatus": "OK",
"ErrorInfo": "",
"ErrorCode": 0,
"Complete": 0,
"MsgCnt": 12, //本次拉取返回了12条消息
"LastMsgTime": 1584669680,
"LastMsgKey": "549396494_2578554_1584669680",
"MsgList": [
{
"From_Account": "user1",
"To_Account": "user2",
"MsgSeq": 549396494,
"MsgRandom": 2578554,
"MsgTimeStamp": 1584669680,
"MsgFlagBits": 0,
"IsPeerRead": 0,
"MsgKey": "549396494_2578554_1584669680",
"MsgBody": [
{
"MsgType": "TIMTextElem",
"MsgContent": {
"Text": "msg 1"
}
}
],
"CloudCustomData": "your cloud custom data"
},
{
"From_Account": "user2",
"To_Account": "user1",
"MsgSeq": 1054803289,
"MsgRandom": 7201,
"MsgTimeStamp": 1584669689,
"MsgFlagBits": 0,
"IsPeerRead": 0,
"MsgKey": "1054803289_7201_1584669689",
"MsgBody": [
{
"MsgType": "TIMTextElem",
"MsgContent": {
"Text": "msg 2"
}
}
],
"CloudCustomData": "your cloud custom data"
},
{ ... } //为节省篇幅,余下的10条消息未列出
]
}
应答中的"Complete": 0表示该时间范围的消息未全部拉取,需要续拉。 续拉请求中的 MaxTime 应改成应答的 LastMsgTime 字段值,同时填上应答的 LastMsgKey 字段,如下所示:
续拉请求示例
{
"Operator_Account":"user2",
"Peer_Account":"user1",
"MaxCnt":100,
"MinTime":1584669600,
"MaxTime":1584669680,
"LastMsgKey": "549396494_2578554_1584669680"
}

应答示例

{
"ActionStatus": "OK",
"ErrorInfo": "",
"ErrorCode": 0,
"Complete": 1,
"MsgCnt": 5, //本次拉取返回了5条消息
"LastMsgTime": 1584669601,
"LastMsgKey": "1456_23287_1584669601",
"MsgList": [
{
"From_Account": "user1",
"To_Account": "user2",
"MsgSeq": 1456,
"MsgRandom": 23287,
"MsgTimeStamp": 1584669601,
"MsgFlagBits": 0,
"IsPeerRead": 1,
"MsgKey": "1456_23287_1584669601",
"MsgBody": [
{
"MsgType": "TIMTextElem",
"MsgContent": {
"Text": "msg 13"
}
}
],
"CloudCustomData": "your cloud custom data"
},
{
"From_Account": "user2",
"To_Account": "user1",
"MsgSeq": 9806,
"MsgRandom": 14,
"MsgTimeStamp": 1584669602,
"MsgFlagBits": 0,
"IsPeerRead": 1,
"MsgKey": "9806_14_1584669602",
"MsgBody": [
{
"MsgType": "TIMTextElem",
"MsgContent": {
"Text": "msg 14"
}
}
],
"CloudCustomData": "your cloud custom data"
},
{ ... } //为节省篇幅,余下的3条消息未列出
]
}
应答中的"Complete": 1表示该时间范围的消息已全部拉取。 若续拉的应答里 Complete 值为0,表明还需要继续续拉,直到 Complete 值为1。

请求包字段说明

字段
类型
属性
说明
Operator_Account
String
必填
会话其中一方的 UserID,以该 UserID 的角度去查询消息。同一个会话,分别以会话双方的角度去查询消息,结果可能会不一样,请参考本接口的接口说明
Peer_Account
String
必填
会话的另一方 UserID
MaxCnt
Integer
必填
请求的消息条数
MinTime
Integer
必填
请求的消息时间范围的最小值(单位:秒)
MaxTime
Integer
必填
请求的消息时间范围的最大值(单位:秒)
LastMsgKey
String
选填
上一次拉取到的最后一条消息的 MsgKey,续拉时需要填该字段,填写方法见上方 示例

应答包体示例

正常应答
{
"ActionStatus": "OK",
"ErrorInfo": "",
"ErrorCode": 0,
"Complete": 1,
"MsgCnt": 1,
"LastMsgTime": 1584669680,
"LastMsgKey": "549396494_2578554_1584669680",
"MsgList": [
{
"From_Account": "user1",
"To_Account": "user2",
"MsgSeq": 549396494,
"MsgRandom": 2578554,
"MsgTimeStamp": 1584669680,
"MsgFlagBits": 0,
"IsPeerRead": 0,
"MsgKey": "549396494_2578554_1584669680",
"MsgBody": [
{
"MsgType": "TIMTextElem",
"MsgContent": {
"Text": "1"
}
}
],
"CloudCustomData": "your cloud custom data"
}
]
}
异常应答
{
"ActionStatus": "FAIL",
"ErrorInfo": "Fail to Parse json data of body, Please check it",
"ErrorCode": 90001
}

应答包字段说明

字段
类型
说明
ActionStatus
String
请求处理的结果:
OK:表示处理成功
FAIL:表示失败
ErrorCode
Integer
错误码:
0:表示成功
非0:表示失败
ErrorInfo
String
错误信息
Complete
Integer
是否全部拉取:
0:表示未全部拉取,需要续拉
1:表示已全部拉取
MsgCnt
Integer
本次拉取到的消息条数
LastMsgTime
Integer
本次拉取到的消息里的最后一条消息的时间
LastMsgKey
String
本次拉取到的消息里的最后一条消息的标识
MsgList
Array
返回的消息列表
MsgFlagBits
Integer
该条消息的属性:
0:表示正常消息
8:表示被撤回的消息
IsPeerRead
Integer
消息接收方是否发送该条消息的已读回执。
0:表示未发送
1:表示已发送
详情可参考本接口的功能说明
MsgBody
Array
消息内容,具体格式请参考 消息格式描述(一条消息可包括多种消息元素,MsgBody 为 Array 类型)
CloudCustomData
String
消息自定义数据(云端保存,会发送到对端,程序卸载重装后还能拉取到)
MsgKey
String
标识该条消息,可用于 REST API 撤回单聊消息

错误码说明

除非发生网络错误(例如502错误),否则该接口的 HTTP 返回码均为200。真正的错误码,错误信息是通过应答包体中的 ErrorCode、ErrorInfo 来表示的。 公共错误码(60000到79999)参见 错误码 文档。 本 API 私有错误码如下:
错误码
描述
90001
JSON 格式解析失败,请检查请求包是否符合 JSON 规范
90003
JSON 格式请求包体中缺少 To_Account 字段或者 To_Account 字段不是 String 类型
90008
JSON 格式请求包体中缺少 From_Account 字段或者 From_Account 账号不存在。
90009
请求需要 App 管理员权限
91000
服务内部错误,请重试

接口调试工具

通过 REST API 在线调试工具 调试本接口。

参考

单发单聊消息(v4/openim/sendmsg
批量发单聊消息(v4/openim/batchsendmsg
撤回单聊消息(v4/openim/admin_msgwithdraw