向多个用户发送单聊消息

功能说明

支持一次对最多500个用户进行单发消息。
与单发消息相比,该接口更适用于营销类消息、系统通知 tips 等时效性较强的消息。
若消息不需要计入未读数,也不需要存储历史聊天记录,则可将 OnlineOnlyFlag 字段设置为1,这样可以带来更快的消息下发速度。
管理员指定某一账号向目标账号批量发消息,接收方看到发送者不是管理员,而是管理员指定的账号。
该接口不触发回调请求。
该接口不会检查发送者和接收者的好友关系(包括黑名单),同时不会检查发送者是否被禁言。
该接口默认不会检查接收者对发送者是否设置了免打扰,如需检查,请在"SendMsgControl"字段填上"WithMuteNotifications"。
单聊消息 MsgSeq 字段的作用及说明:该字段在发送消息时由用户自行指定,该值可以重复,非后台生成,非全局唯一。与群聊消息的 MsgSeq 字段不同,群聊消息的 MsgSeq 由后台生成,每个群都维护一个 MsgSeq,从1开始严格递增。单聊消息历史记录对同一个会话的消息先以时间戳排序,同秒内的消息再以 MsgSeq 排序。
注意:
当使用服务端集成 REST API 发送批量消息时,存在是否将消息同步至发送方(管理员账号或者由管理员指定的某账号)问题,同步方式包括在线终端和漫游,REST API 提供 SyncOtherMachine 参数用于说明是否进行同步,详细使用方式参见下文请求包示例。

接口调用说明

请求 URL 示例

https://xxxxxx/v4/openim/batchsendmsg?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/batchsendmsg
请求接口
sdkappid
创建应用时即时通信 IM 控制台分配的 SDKAppID
identifier
必须为 App 管理员账号,更多详情请参见 App 管理员
usersig
App 管理员账号生成的签名,具体操作请参见 生成 UserSig
random
请输入随机的32位无符号整数,取值范围0 - 4294967295
contenttype
请求格式固定值为json

最高调用频率

12000条/分钟,若一次发送给500个用户,计作500条。

请求包示例

本文以发送文本消息为例,如需发送其他类型的消息,只需将 MsgBody 字段改成相应消息类型即可,更多详情请参见 消息格式描述

管理员向目标账号批量发消息

注意:
若不希望将消息同步至 From_Account,则 SyncOtherMachine 填写2。 若希望将消息同步至 From_Account,则 SyncOtherMachine 填写1。
{
"SyncOtherMachine": 2, // 消息不同步至发送方
"To_Account": [ // 目标账号列表
"bonnie",
"rong"
],
"MsgSeq": 28360, // 消息序列号
"MsgRandom": 19901224, // 消息随机数
"MsgBody": [ // 消息
{
"MsgType": "TIMTextElem", // 消息类型,TIMTextElem为文本消息
"MsgContent": {
"Text": "hi, beauty" // 消息文本
}
}
],
"CloudCustomData": "your cloud custom data"
}

管理员指定某一账号向目标账号批量发消息,同时设置离线推送信息

From_Accout 为管理员指定的发送方,接收方看到发送者不是管理员,而是 From_Account。下述 Json 请求表达的是 dave 向账号 bonnie 和账号 rong 发送一条消息; bonnie 和 rong 收到消息,看到消息发送方是 dave。
注意:
若不希望将消息同步至 From_Account,则 SyncOtherMachine 填写2。 若希望将消息同步至 From_Account,则 SyncOtherMachine 填写1。
{
"SyncOtherMachine": 1, // 消息同步至发送方
"From_Account": "dave",
"To_Account": [
"bonnie",
"rong"
],
"MsgSeq": 28360, // 消息序列号
"MsgRandom": 19901224, // 消息随机数
"MsgBody": [
{
"MsgType": "TIMTextElem",
"MsgContent": {
"Text": "hi, beauty"
}
}
],
"CloudCustomData": "your cloud custom data",
"OfflinePushInfo": {
"PushFlag": 0,
"Desc": "离线推送内容",
"Ext": "这是透传的内容",
"AndroidInfo": {
"Sound": "android.mp3"
},
"ApnsInfo": {
"Sound": "apns.mp3",
"BadgeMode": 1, // 这个字段缺省或者为 0 表示需要计数,为 1 表示本条消息不需要计数,即右上角图标数字不增加
"Title":"apns title", // apns title
"SubTitle":"apns subtitle", // apns subtitle
"Image":"www.image.com" // image url
}
}
}

请求包字段说明

字段
类型
属性
说明
SyncOtherMachine
Integer
选填
1:把消息同步到 From_Account 在线终端和漫游上
2:消息不同步至 From_Account;若不填写默认情况下会将消息存 From_Account 漫游
From_Account
String
选填
管理员指定消息发送方账号(若需设置 From_Account 信息,则该参数取值不能为空)
To_Account
Array
必填
消息接收方用户 UserID
MsgSeq
Integer
选填
消息序列号(32位无符号整数),后台会根据该字段去重及进行同秒内消息的排序,详细规则请看本接口的功能说明。若不填该字段,则由后台填入随机数
MsgRandom
Integer
必填
消息随机数(32位无符号整数),后台用于同一秒内的消息去重。请确保该字段填的是随机
MsgBody
Array
必填
TIM 消息,请参考 消息格式描述
OnlineOnlyFlag
Integer
选填
默认为 0,表示消息存历史聊天记录
1表示消息不存历史聊天记录,即发送消息时,若接收方在线,则能收到此消息,若接收方不在线,则收不到该消息。适用于实现一些实时状态类的功能。
MsgType
String
必填
TIM 消息对象类型,目前支持的消息对象包括:
TIMTextElem(文本消息)
TIMLocationElem(位置消息)
TIMFaceElem(表情消息)
TIMCustomElem(自定义消息)
TIMSoundElem(语音消息)
TIMImageElem(图像消息)
TIMFileElem(文件消息)
TIMVideoFileElem(视频消息)
MsgContent
Object
必填
MsgContent 为 TIM 消息对象,具体可参考 消息格式描述
CloudCustomData
String
选填
消息自定义数据(云端保存,会发送到对端,程序卸载重装后还能拉取到)
SendMsgControl
Array
选填
消息发送控制选项,是一个 String 数组,只对本次请求有效。
"NoUnread"表示该条消息不计入未读数。
"NoLastMsg"表示该条消息不更新会话列表。
"WithMuteNotifications"表示该条消息的接收方对发送方设置的免打扰选项生效(默认不生效)。
"NoMsgCheck"表示开启云端审核后,该条消息不送审。 示例: "SendMsgControl": ["NoUnread","NoLastMsg","WithMuteNotifications","NoMsgCheck"]
OfflinePushInfo
Object
选填
离线推送信息配置,具体可参考 消息格式描述
IsNeedReadReceipt
Integer
选填
该条消息是否需要已读回执:
0为不需要,
1为需要,默认为0

应答包体示例

成功应答包体示例
{
"ErrorInfo": "",
"ActionStatus": "OK",
"ErrorCode": 0,
"MsgKey": "128493_903762_1572870301",
"MsgId": "144015217074523023-1734398005-1067690400"
}
部分账号发送失败的应答包体示例
{
"ActionStatus": "SomeError",
"ErrorCode": 0,
"ErrorInfo": "",
"MsgKey": "4852_28135_1579678877",
"MsgId": "144015217074523023-1734398005-1067690400",
"ErrorList": [ // 发送消息失败列表
{
"To_Account": "rong", // 失败账号
"ErrorCode": 70107 // 错误码,70107表示该账号不存在
}
]
}
全部账号发送失败的应答包体示例
{
"ActionStatus": "FAIL",
"ErrorInfo": "invalid To_Account",
"ErrorCode": 90012
}

应答包字段说明

字段
类型
说明
ActionStatus
String
请求处理的结果
OK:表示处理成功
FAIL:表示失败
ErrorCode
Integer
本次请求的错误码
如有任意账号发送成功,则此字段返回0
全部账号都发送失败,则此字段返回非0
ErrorInfo
String
详细错误信息
ErrorList
Array
发消息失败的账号列表,在此列表中的目标账号,消息发送失败或账号不存在。若消息全部发送成功,则 ErrorList 为空
ErrorList.To_Account
String
消息发送失败的目标账号
ErrorList.ErrorCode
Integer
消息发送失败的错误码,若目标账号的错误码为70107表示该账号不存在
MsgKey
String
消息唯一标识,用于撤回。长度不超过50个字符
MsgId
String
该条消息在客户端唯一标识。

错误码说明

除非发生网络错误(例如502错误),否则该接口的 HTTP 返回码均为200。真正的错误码、错误信息是通过应答包体中的 ErrorCode、ErrorInfo 来表示的。 公共错误码(60000到79999)参见 错误码 文档。 本 API 私有错误码如下:
错误码
描述
70107
请求的用户账号不存在
70169
服务端内部超时,请稍后重试
90001
JSON 格式解析失败,请检查请求包是否符合 JSON 规范
90002
JSON 格式请求包中 MsgBody 不符合消息格式描述,或者 MsgBody 不是 Array 类型,请参考 TIMMsgElement 对象 的定义
90004
JSON 格式请求包中 MsgSeq 字段非法
90007
JSON 格式请求包体中 MsgBody 类型不是 Array 类型,请将其修改为 Array 类型
90008
JSON 格式请求包体中缺少 From_Account 字段,或者From_Account 不存在
90009
请求需要 App 管理员权限
90010
JSON 格式请求包不符合消息格式描述,请参考 TIMMsgElement 对象 的定义
90011
批量发消息目标账号超过500,请减少 To_Account 中目标账号数量
90012
To_Account 没有注册或不存在,请确认 To_Account 是否导入即时通信 IM 或者是否拼写错误
90026
消息离线存储时间错误(最多不能超过7天)
90048
请求的用户账号不存在
90992
服务内部错误,请重试;如果所有请求都返回该错误码,且 App 配置了第三方回调,请检查 App 服务器是否正常向即时通信 IM 后台服务器返回回调结果
91000
服务内部错误,请重试
93000
JSON 数据包超长,消息包体请不要超过12k

接口调试工具

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

参考

单发单聊消息(v4/openim/sendmsg
群组内发普通消息(v4/group_open_http_svc/send_group_msg
在群组中发送系统通知(v4/group_open_http_svc/send_group_system_notification