向多个用户发送单聊消息
功能说明
支持一次对最多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
请求参数说明
参数  | 说明  | 
xxxxxx  | SDKAppID 所在国家/地区对应的专属域名: 中国: console.tim.qq.com新加坡: adminapisgp.im.qcloud.com首尔:  adminapikr.im.qcloud.com东京: adminapijpn.im.qcloud.com法兰克福: adminapiger.im.qcloud.com硅谷: adminapiusa.im.qcloud.com雅加达: adminapiidn.im.qcloud.com | 
v4/openim/batchsendmsg  | 请求接口  | 
sdkappid  | 创建应用时即时通信 Chat 控制台分配的 SDKAppID  | 
identifier  | |
usersig  | |
random  | 请输入随机的32位无符号整数,取值范围0 - 4294967295  | 
contenttype  | 请求格式固定值为 json | 
最高调用频率
12000条/分钟,若一次发送给500个用户,计作500条。
请求包示例
管理员向目标账号批量发消息
注意:
若不希望将消息同步至 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  | |
90004  | JSON 格式请求包中 MsgSeq 字段非法  | 
90007  | JSON 格式请求包体中 MsgBody 类型不是 Array 类型,请将其修改为 Array 类型  | 
90008  | JSON 格式请求包体中缺少 From_Account 字段,或者From_Account 不存在  | 
90009  | 请求需要 App 管理员权限  | 
90010  | |
90011  | 批量发消息目标账号超过500,请减少 To_Account 中目标账号数量  | 
90012  | To_Account 没有注册或不存在,请确认 To_Account 是否导入即时通信 Chat 或者是否拼写错误  | 
90026  | 消息离线存储时间错误(最多不能超过7天)  | 
90048  | 请求的用户账号不存在  | 
90992  | 服务内部错误,请重试;如果所有请求都返回该错误码,且 App 配置了第三方回调,请检查 App 服务器是否正常向即时通信 Chat后台服务器返回回调结果  | 
91000  | 服务内部错误,请重试  | 
93000  | JSON 数据包超长,消息包体请不要超过12k  | 
接口调试工具
参考
单发单聊消息(v4/openim/sendmsg)
群组内发普通消息(v4/group_open_http_svc/send_group_msg)