App 管理员可以通过该接口获取 App 中所有群组的 ID。
说明
即时通信 IM 内置多种群组类型,详情请参见 群组系统 。
使用示例:
GetAppIdGroupListRequest request = GetAppIdGroupListRequest . builder ( )
+ . limit ( 10 )
+ . groupType ( GroupType . PUBLIC )
+ . next ( 0 )
+ . build ( ) ;
+
+GetAppIdGroupListResult result = client. group. getAppIdGroupList ( request) ;
+
App 管理员可以通过该接口创建群组。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持,用户(包括群主)使用 AVChatroom(直播群)时必须操作 SDK 主动申请进群 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
CreateGroupRequest request = CreateGroupRequest . builder ( )
+ . type ( GroupType . PUBLIC )
+ . name ( "TestGroup" )
+ . ownerAccount ( "user1" )
+ . groupId ( "MyFirstGroup" )
+ . introduction ( "This is group Introduction" )
+ . notification ( "This is group Notification" )
+ . faceUrl ( "https://avatars.githubusercontent.com/u/43716716?s=200&v=4" )
+ . maxMemberCount ( 500 )
+ . applyJoinOption ( ApplyJoinOption . FREE_ACCESS )
+ . inviteJoinOption ( InviteJoinOption . DISABLE_INVITE )
+ . build ( ) ;
+
+CreateGroupResult result = client. group. createGroup ( request) ;
+
App 管理员可以根据群组 ID 获取群组的详细信息。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
List < String > groupIdList = Collections . singletonList ( "MyFirstGroup" ) ;
+GetGroupInfoRequest request = new GetGroupInfoRequest ( groupIdList) ;
+
+GetGroupInfoResult result = client. group. getGroupInfo ( request) ;
+
App 管理员可以根据群组 ID 获取群组成员的资料。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持,使用 Next 字段分批获取
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
因 Community(社群)人数较多,分页获取方式改用 Next 分批方法。
使用示例:
GetGroupMemberInfoRequest request = GetGroupMemberInfoRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . limit ( 100 )
+ . offset ( 0 )
+ . build ( ) ;
+
+GetGroupMemberInfoResult result = client. group. getGroupMemberInfo ( request) ;
+
App 管理员可根据群组 ID 与群内指定成员 UserID 列表等参数获取指定群组成员的资料。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetSpecifiedGroupMemberInfoRequest request = GetSpecifiedGroupMemberInfoRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . memberInfoFilter ( Collections . singletonList ( "bingo" ) )
+ . build ( ) ;
+
+GetSpecifiedGroupMemberInfoResult result = client. group. getSpecifiedGroupMemberInfo ( request) ;
+
App 管理员可以通过该接口修改指定群组的基础信息。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
ModifyGroupBaseInfoRequest request = ModifyGroupBaseInfoRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . name ( "groupName" )
+ . introduction ( "my first group" )
+ . notification ( "hello world!" )
+ . faceUrl ( "https://avatars.githubusercontent.com/u/43716716?s=200&v=4" )
+ . maxMemberNum ( 500 )
+ . applyJoinOption ( ApplyJoinOption . NEED_PERMISSION )
+ . muteAllMember ( MuteAllMember . OFF )
+ . build ( ) ;
+
+ModifyGroupBaseInfoResult result = client. group. modifyGroupBaseInfo ( request) ;
+
App 管理员可以通过该接口向指定的群中添加新成员。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持增加群成员,对此类型群组进行操作时会返回 10007 错误。用户加入此类型群组的唯一方式是用户申请加群。
使用示例:
MemberRequestItem item = new MemberRequestItem ( "user2" ) ;
+List < MemberRequestItem > memberList = Collections . singletonList ( item) ;
+AddGroupMemberRequest request = AddGroupMemberRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . memberList ( memberList)
+ . silence ( 1 )
+ . build ( ) ;
+
+AddGroupMemberResult result = client. group. addGroupMember ( request) ;
+
App 管理员可以通过该接口删除群成员。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持删除群成员,对这种类型的群组进行操作时会返回 10004 错误。如果管理员希望达到删除群成员的效果,可以通过设置 批量禁言和取消禁言 的方式实现。
使用示例:
List < String > toDelAccount = Collections . singletonList ( "user2" ) ;
+DeleteGroupMemberRequest request = DeleteGroupMemberRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . memberToDelAccount ( toDelAccount)
+ . build ( ) ;
+
+DeleteGroupMemberResult result = client. group. deleteGroupMember ( request) ;
+
App 管理员可以通过该接口修改群成员资料。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不存储群成员资料,所以不能修改成员资料。只能修改管理员和群主的成员资料,修改普通成员资料时会返回 10007 错误。
使用示例:
ModifyGroupMemberInfoRequest request = ModifyGroupMemberInfoRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . memberAccount ( "doocs" )
+ . nameCard ( "hello World!" )
+ . build ( ) ;
+
+ModifyGroupMemberInfoResult result = client. group. modifyGroupMemberInfo ( request) ;
+
App 管理员通过该接口解散群。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
DestroyGroupRequest request = new DestroyGroupRequest ( "MyFirstGroup" ) ;
+
+DestroyGroupResult result = client. group. destroyGroup ( request) ;
+
App 管理员可以通过本接口获取某一用户加入的群信息。默认不获取用户已加入但未激活好友工作群(Work)以及直播群(AVChatRoom)群信息。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群),但默认不返回已加入但未激活的此类型群信息 Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持,但默认不返回此类型群信息。如果指定拉取 AVChatRoom 类型群信息,获得的群信息可能不完整,AVChatRoom 并不存储所有的群成员资料。 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetJoinedGroupListRequest request = new GetJoinedGroupListRequest ( "doocs" ) ;
+
+GetJoinGroupListResult result = client. group. getJoinGroupList ( request) ;
+
App 管理员可以通过该接口获取一批用户在群内的身份,即“成员角色”。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持该接口,对此类型群组进行操作将返回 10007 错误;但可以通过 获取群组成员详细资料 达到查询“成员角色”的效果。
使用示例:
List < String > userAccount = Collections . singletonList ( "doocs" ) ;
+GetRoleInGroupRequest request = GetRoleInGroupRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . userAccount ( userAccount)
+ . build ( ) ;
+
+GetRoleInGroupResult result = client. group. getRoleInGroup ( request) ;
+
App 管理员禁止指定群组中某些用户在一段时间内发言。 App 管理员取消对某些用户的禁言。 被禁言用户退出群组之后再进入同一群组,禁言仍然有效。 说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
Private(即新版本中的 Work,好友工作群)类型不支持禁言。
使用示例:
List < String > membersAccount = Collections . singletonList ( "doocs" ) ;
+ForbidSendMsgRequest request = ForbidSendMsgRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . membersAccount ( membersAccount)
+ . muteTime ( 200L )
+ . build ( ) ;
+
+ForbidSendMsgResult result = client. group. forbidSendMsg ( request) ;
+
App 管理员可以根据群组 ID 获取群组中被禁言的用户列表。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetGroupMutedAccountRequest request = new GetGroupMutedAccountRequest ( "MyFirstGroup" ) ;
+
+GetGroupMutedAccountResult result = client. group. getGroupMutedAccount ( request) ;
+
App 管理员可以通过该接口在群组中发送普通消息。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "red packet" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+SendGroupMsgRequest request = SendGroupMsgRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . random ( 1314 )
+ . msgBody ( msgBody)
+ . onlineOnlyFlag ( OnlineOnlyFlag . YES )
+ . build ( ) ;
+
+SendGroupMsgResult result = client. group. sendGroupMsg ( request) ;
+
App 管理员可以通过该接口在群组中发送系统通知。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持,仅支持面向全员 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
非直播群支持向群组中的一部分指定成员发送系统通知,而 AVChatRoom(直播群)只支持向群组中所有成员发送系统通知。 客户端接收系统通知接口(V2TIMGroupListener.onReceiveRESTCustomData)请参见 Android 、iOS 。 使用示例:
List < String > toMembersAccount = Collections . singletonList ( "doocs" ) ;
+SendGroupSystemNotificationRequest request = SendGroupSystemNotificationRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . content ( "hello world" )
+ . toMembersAccount ( toMembersAccount)
+ . build ( ) ;
+
+SendGroupSystemNotificationResult result = client. group. sendGroupSystemNotification ( request) ;
+
App 管理员可以通过该接口将群主身份转移给他人。 没有群主的群,App 管理员可以通过此接口指定他人作为群主。 新群主必须为群内成员。 说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持(见说明) Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持转让群主,对该类型的群组进行操作时会返回 10007 错误。
使用示例:
ChangeGroupOwnerRequest request = ChangeGroupOwnerRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . newOwnerAccount ( "doocs" )
+ . build ( ) ;
+
+ChangeGroupOwnerResult result = client. group. changeGroupOwner ( request) ;
+
App 管理员通过该接口撤回指定群组的消息,消息需要在漫游有效期以内。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
List < MsgSeqItem > msgSeqList = Collections . singletonList ( new MsgSeqItem ( 0L ) ) ;
+GroupMsgRecallRequest request = GroupMsgRecallRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . msgSeqList ( msgSeqList)
+ . build ( ) ;
+
+GroupMsgRecallResult result = client. group. groupMsgRecall ( request) ;
+
App 管理员可以通过该接口导入群组,不会触发回调、不会下发通知; 当 App 需要从其他即时通信系统迁移到即时通信 IM 时,使用该协议导入存量群组数据。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持导入群基础资料,对此类型的群组进行操作时会返回 10007 错误;如果需要达到导入群组基础资料的效果,可以通过 创建群组 和 修改群基础资料 的方式实现。
使用示例:
ImportGroupRequest request = ImportGroupRequest . builder ( )
+ . type ( GroupType . PUBLIC )
+ . name ( "groupName" )
+ . build ( ) ;
+
+ImportGroupResult result = client. group. importGroup ( request) ;
+
该 API 接口的作用是导入群组的消息,不会触发回调、不会下发通知。 当 App 需要从其他即时通信系统迁移到即时通信 IM 时,使用该协议导入存量群消息数据。 说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持导入群消息,对此类型的群组进行操作时会返回 10007 错误;因为此类型群组所适用的场景不支持查看入群前的历史消息,所以没有提供这一功能。
使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "hello world" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+GroupMsgItem item = GroupMsgItem . builder ( )
+ . fromAccount ( "doocs" )
+ . sendTime ( 1628062005 )
+ . msgBody ( msgBody)
+ . build ( ) ;
+List < GroupMsgItem > msgList = Collections . singletonList ( item) ;
+ImportGroupMsgRequest request = ImportGroupMsgRequest . builder ( )
+ . groupId ( "newGroup" )
+ . msgList ( msgList)
+ . build ( ) ;
+
+ImportGroupMsgResult result = client. group. importGroupMsg ( request) ;
+
该 API 接口的作用是导入群组成员,不会触发回调、不会下发通知。 当 App 需要从其他即时通信系统迁移到即时通信 IM 时,使用该协议导入存量群成员数据。 说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)所适用的场景一般不需要导入成员,因此不支持导入群成员功能,对此类型的群组进行操作时会返回 10007 错误。
使用示例:
MemberItem item = MemberItem . builder ( )
+ . memberAccount ( "doocs" )
+ . joinTime ( 1628062005 )
+ . role ( MemberRole . ADMIN )
+ . unreadMsgNum ( 1 )
+ . build ( ) ;
+List < MemberItem > members = Collections . singletonList ( item) ;
+ImportGroupMemberRequest request = ImportGroupMemberRequest . builder ( )
+ . groupId ( "groupName" )
+ . memberList ( members)
+ . build ( ) ;
+
+ImportGroupMemberResult result = client. group. importGroupMember ( request) ;
+
App 管理员使用该接口设置群组成员未读消息数,不会触发回调、不会下发通知。 当 App 需要从其他即时通信系统迁移到即时通信 IM 时,使用该协议设置群成员的未读消息计数。 说明
该文档仅限迁移用户使用,线上用户不能使用。
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
ChatRoom 和 AVChatroom(直播群)的客户端不支持未读消息计数,所以对这两种类型的群组成员设置未读消息计数是无效的(但是不会返回错误)。
使用示例:
SetUnreadMsgNumRequest result = SetUnreadMsgNumRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . memberAccount ( "doocs" )
+ . unreadMsgNum ( 1 )
+ . build ( ) ;
+
+SetUnreadMsgNumResult result = client. group. setUnreadMsgNum ( request) ;
+
该 API 接口的作用是撤回最近 1000 条消息中指定用户发送的消息。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持历史消息存储(此处撤回消息指撤回历史消息存储中的消息),对这此类型群组中的用户撤回消息是无效的(但是不会返回错误)。 该接口目前只支持静默撤回,在服务端对该消息打上撤回标记,并不会通知到客户端,只有拉漫游时才知道该消息被撤回。 使用示例:
DeleteGroupMsgBySenderRequest request = DeleteGroupMsgBySenderRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . senderAccount ( "doocs" )
+ . build ( ) ;
+
+DeleteGroupMsgBySenderResult result = client. group. deleteGroupMsgBySender ( request) ;
+
App 管理员可以通过该接口拉取群组的历史消息。
背景说明:
即时通信 IM 的群消息是按 Seq 排序的,按照 server 收到群消息的顺序分配 Seq,先发的群消息 Seq 小,后发的 Seq 大。 如果用户想拉取一个群的全量消息,首次拉取时不用填拉取 Seq,Server 会自动返回最新的消息,以后拉取时拉取 Seq 填上次返回的最小 Seq 减 1。 如果返回消息的 IsPlaceMsg 为 1,表示这个 Seq 的消息或者过期、或者存储失败、或者被删除了。 说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群) 不支持历史消息存储,所以不支持调用此接口。
使用示例:
GroupMsgGetSimpleRequest request = GroupMsgGetSimpleRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . reqMsgNumber ( 1 )
+ . reqMsgNumber ( 20 )
+ . build ( ) ;
+
+GroupMsgGetSimpleResult result = client. group. groupMsgGetSimple ( request) ;
+
App 管理员可以根据群组 ID 获取直播群在线人数。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
注意
在线人数总体更新粒度为 10s。 当群人数大于等于 300 或群内有 Web 端用户的时候,出现群成员上下线或者进退群的时候,由于当前 10s 周期内已经统计了用户在线状态的原因,会在下一个 10s 周期才会统计到剔除状态用户变更的在线人数,所以会出现调用接口 10s - 20s 才会更新的现象。 当群人数小于 300 人且群内没有 Web 端用户的时候,用户进退群会触发即时更新在线人数。 使用示例:
GetOnlineMemberNumRequest request = new GetOnlineMemberNumRequest ( "MyFirstAVChatRoom" ) ;
+
+GetOnlineMemberNumResult result = client. group. getOnlineMemberNum ( request) ;
+
App 管理员可以根据群组 ID 获取直播群在线列表。
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。 :::
注意
此功能需 旗舰版套餐 ,并且已开通“直播群在线成员列表”功能(控制台“群功能配置”)。 在线列表总体更新粒度为 10s。 当直播群中超过 1000 人时,接口仅返回最新进群并且在线的 1000 人。 当群人数大于等于 300 或群内有 Web 端用户的时候,出现群成员上下线或者进退群的时候,由于当前 10s 周期内已经统计了用户在线状态的原因,会在下一个 10s 周期才会统计到剔除状态用户变更的在线人数,所以会出现调用接口 10s - 20s 才会更新的现象。 当群人数小于 300 人且群内没有 Web 端用户的时候,用户进退群会触发即时更新在线人数。 使用示例:
GetMembersRequest request = GetMembersRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . timestamp ( 0 )
+ . build ( ) ;
+
+GetMembersResult result = client. group. getMembers ( request) ;
+
App 管理员和群主可以对直播群成员设置不同的标记以区分不同类型的群成员。该功能需旗舰版,并且在 IM 控制台“群功能配置”中开通“直播群在线成员列表”功能。其他套餐版本调用该 API 将返回失败。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
ModifyGroupUserInfoRequest request = new ModifyGroupUserInfoRequest ( ) ;
+request. setCommandType ( 1 ) ;
+GroupMemberItem item = new GroupMemberItem ( ) ;
+item. setMarks ( Arrays . asList ( 1001 , 1002 ) ) ;
+item. setMemberAccount ( "test1" ) ;
+request. setMemberList ( Collections . singletonList ( item) ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+
+ModifyGroupUserInfoResult result = client. group. modifyGroupUserInfo ( request) ;
+
App 管理员可以通过该接口获取群自定义属性。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetGroupAttrRequest request = new GetGroupAttrRequest ( "MyFirstGroup" ) ;
+
+GetGroupAttrResult result = client. group. getGroupAttr ( request) ;
+
App 管理员可以通过该接口修改群自定义属性。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GroupAttr groupAttr = new GroupAttr ( ) ;
+groupAttr. setKey ( "isOpen" ) ;
+groupAttr. setValue ( "yes" ) ;
+List < GroupAttr > groupAttrs = Collections . singletonList ( groupAttr) ;
+ModifyGroupAttrRequest request = ModifyGroupAttrRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . groupAttrs ( groupAttrs)
+ . build ( ) ;
+
+ModifyGroupAttrResult result = client. group. modifyGroupAttr ( request) ;
+
App 管理员可以通过该接口清空群自定义属性。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持 Community 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
ClearGroupAttrRequest request = new ClearGroupAttrRequest ( "MyFirstGroup" ) ;
+
+ClearGroupAttrResult result = client. group. clearGroupAttr ( request) ;
+
App 管理员可以通过该接口重置群自定义属性。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持 Public 支持 ChatRoom 支持 AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
SetGroupAttrRequest request = new SetGroupAttrRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+GroupAttr groupAttr = new GroupAttr ( ) ;
+groupAttr. setKey ( "isOpen" ) ;
+groupAttr. setValue ( "yes" ) ;
+List < GroupAttr > groupAttrs = Collections . singletonList ( groupAttr) ;
+request. setGroupAttrs ( groupAttrs) ;
+
+SetGroupAttrResult result = client. group. setGroupAttr ( request) ;
+
管理员修改群聊历史消息 可以单独修改消息中的 MsgBody 或 CloudCustomData 字段,也可以同时修改这两个字段。以请求中指定的字段值覆盖历史消息对应的字段。 不支持修改直播群的历史消息 注意
使用该接口修改消息后,被修改的消息不能恢复,请谨慎调用该接口。
使用示例:
ModifyGroupMsgRequest request = new ModifyGroupMsgRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setMsgSeq ( 123L ) ;
+TIMTextMsgElement msg = new TIMTextMsgElement ( "hello world" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+request. setMsgBody ( msgBody) ;
+request. setMsgBody ( msgBody) ;
+
+ModifyGroupMsgResult result = client. group. modifyGroupMsg ( request) ;
+
App 管理员可以通过该接口向所有直播群下发广播消息。
注意
直播群广播消息功能支持需要终端 SDK 6.5.2803 增强版及以上版本、Web SDK v2.21.0 及以上版本,需 购买旗舰版套餐包 并在 控制台 >群功能配置>群功能配置>直播群广播消息 打开开关后方可使用。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持,发给所有直播群 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
SendBroadcastMsgRequest request = new SendBroadcastMsgRequest ( ) ;
+request. setFromAccount ( "test1" ) ;
+TIMTextMsgElement msg = new TIMTextMsgElement ( "hello world" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+request. setMsgBody ( msgBody) ;
+request. setRandom ( 1223L ) ;
+
+SendBroadcastMsgResult result = client. group. sendBroadcastMsg ( request) ;
+
App 管理员可以通过该接口拉取群消息已读回执信息。
注意
该功能仅对旗舰版客户开放,需 购买旗舰版套餐包 并在 控制台 >登录与消息>群消息已读回执 打开开关后方可使用。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 不支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetGroupMsgReceiptRequest request = new GetGroupMsgReceiptRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+MsgSeqItem seqItem = new MsgSeqItem ( ) ;
+seqItem. setMsgSeq ( 123L ) ;
+request. setMsgSeqList ( Collections . singletonList ( seqItem) ) ;
+
+GetGroupMsgReceiptResult result = client. group. getGroupMsgReceipt ( request) ;
+
App 管理员可以通过该接口拉取群消息已读或未读成员列表。
注意
该功能仅对旗舰版客户开放,需 购买旗舰版套餐包 并在 控制台 >登录与消息>群消息已读回执 打开开关后方可使用。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 不支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetGroupMsgReceiptDetailRequest request = new GetGroupMsgReceiptDetailRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setMsgSeq ( 123L ) ;
+request. setNum ( 12 ) ;
+request. setCursor ( "" ) ;
+request. setFlag ( 12 ) ;
+
+GetGroupMsgReceiptDetailResult result = client. group. getGroupMsgReceiptDetail ( request) ;
+
App 管理员可以通过该接口创建话题。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持 Public 不支持 ChatRoom 不支持 AVChatRoom 不支持 Community(社群) 只有支持话题的社群才适用此 API
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
CreateGroupTopicRequest request = new CreateGroupTopicRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setTopicName ( "test" ) ;
+request. setFaceUrl ( "" ) ;
+
+CreateGroupTopicResult result = client. group. createGroupTopic ( request) ;
+
App 管理员可以通过该接口获取话题资料。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持 Public 不支持 ChatRoom 不支持 AVChatRoom 不支持 Community(社群) 只有支持话题的社群才适用此 API
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetGroupTopicRequest request = new GetGroupTopicRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setFromAccount ( "1400187352" ) ;
+
+GetGroupTopicResult result = client. group. getGroupTopic ( request) ;
+
App 管理员可以通过该接口修改话题资料。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持 Public 不支持 ChatRoom 不支持 AVChatRoom 不支持 Community(社群) 只有支持话题的社群才适用此 API
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
ModifyGroupTopicRequest request = new ModifyGroupTopicRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setTopicName ( "test" ) ;
+request. setFaceUrl ( "" ) ;
+
+ModifyGroupTopicResult result = client. group. modifyGroupTopic ( request) ;
+
App 管理员可以通过该接口导入话题,不会触发回调、不会下发通知;当 App 需要从其他即时通信系统迁移到即时通信 IM 时,使用该协议导入存量话题数据。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持 Public 不支持 ChatRoom 不支持 AVChatRoom 不支持 Community(社群) 只有支持话题的社群才适用此 API
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
ImportGroupTopicRequest request = new ImportGroupTopicRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setTopicName ( "test" ) ;
+request. setFromAccount ( "123" ) ;
+
+ImportGroupTopicResult result = client. group. importGroupTopic ( request) ;
+
App 管理员可以通过该接口解散话题。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持 Public 不支持 ChatRoom 不支持 AVChatRoom 不支持 Community(社群) 只有支持话题的社群才适用此 API
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
DestroyGroupTopicRequest request = new DestroyGroupTopicRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+
+DestroyGroupTopicResult result = client. group. destroyGroupTopic ( request) ;
+
App 管理员可以通过该接口获取对应直播群的封禁成员列表。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetGroupBanMemberRequest request = new GetGroupBanMemberRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setLimit ( 10 ) ;
+request. setOffset ( 0 ) ;
+
+GetGroupBanMemberResult result = client. group. getGroupBanMember ( request) ;
+
App 管理员可以通过该接口向直播群封禁成员,封禁后成员无法接收消息,并且封禁时间内无法再次进群。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
BanGroupMemberRequest request = new BanGroupMemberRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setDuration ( 1000L ) ;
+request. setMembersAccount ( Arrays . asList ( "test1" , "bingo" ) ) ;
+request. setDescription ( "test" ) ;
+
+BanGroupMemberResult result = client. group. banGroupMember ( request) ;
+
App 管理员可以通过该接口向直播群解封成员,解封后,之前封禁的成员可重新进群获取消息。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
UnbanGroupMemberRequest request = new UnbanGroupMemberRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setMembersAccount ( Arrays . asList ( "test1" , "bingo" ) ) ;
+
+UnbanGroupMemberResult result = client. group. unbanGroupMember ( request) ;
+
App 管理员和群成员可以拉取消息扩展,消息扩展为一组自定义的键值对。
注意
此功能需 旗舰版套餐,并且已开通“消息扩展功能”功能(控制台“登录与消息”配置)。 单条群消息可设置的最大键值对数量为 300 条。 被设置的群消息需要在发送时指定“支持消息扩展”,参见 在群组中发送普通消息 。 使用示例:
GroupGetKeyValuesRequest request = GroupGetKeyValuesRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . msgSeq ( 1L )
+ . build ( ) ;
+
+GroupGetKeyValuesResult result = client. group. groupGetKeyValues ( request) ;
+
App 管理员和群成员可以为群聊普通消息设置消息扩展,消息扩展为一组自定义的键值对。
注意
此功能需 旗舰版套餐,并且已开通“消息扩展功能”功能(控制台“登录与消息”配置)。 单条群消息可设置的最大键值对数量为 300 条。 被设置的群消息需要在发送时指定“支持消息扩展”,参见 在群组中发送普通消息 。 使用示例:
GroupSetKeyValuesRequest request = GroupSetKeyValuesRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . msgSeq ( 1L )
+ . extensionList ( Collections . singletonList ( KeyValueSeq . builder ( )
+ . key ( "test" )
+ . value ( "test" )
+ . build ( ) ) )
+ . build ( ) ;
+
+GroupSetKeyValuesResult result = client. group. groupSetKeyValues ( request) ;
+
App 管理员可以通过该接口获取群计数器。
使用示例:
GetGroupCounterRequest request = GetGroupCounterRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . build ( ) ;
+
+GetGroupCounterResult result = client. group. getGroupCounter ( request) ;
+
App 管理员可以通过该接口更新(设置、递增、递减)群计数器。
使用示例:
List < GroupCounterItem > groupCounter = new ArrayList < > ( ) ;
+GroupCounterItem item = new GroupCounterItem ( ) ;
+item. setKey ( "x" ) ;
+item. setValue ( 1L ) ;
+groupCounter. add ( item) ;
+UpdateGroupCounterRequest request = UpdateGroupCounterRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . groupCounter ( groupCounter)
+ . mode ( GroupCounterMode . SET )
+ . build ( ) ;
+
+UpdateGroupCounterResult result = client. group. updateGroupCounter ( request) ;
+
App 管理员可以通过该接口删除群计数器。
使用示例:
DeleteGroupCounterRequest request = DeleteGroupCounterRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . build ( ) ;
+
+DeleteGroupCounterResult result = client. group. deleteGroupCounter ( request) ;
+
App 管理员可以为直播群设置和取消管理员,当设置管理员时,被设置的账号可以不需要在直播群里,被设置为管理员之后,该账号即使离开直播群再重新进群也仍然是管理员。需要取消管理员身份时,需要调用本接口取消该用户的管理员身份。该功能需旗舰版,并且在 IM 控制台“群功能配置”中开通“直播群在线成员列表”功能。
使用示例:
ModifyAdminRequest request = ModifyAdminRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . commandType ( 1 )
+ . adminAccount ( Arrays . asList ( "test1" , "bingo" ) )
+ . build ( ) ;
+
+ModifyAdminResult result = client. group. modifyAdmin ( request) ;
+
App 管理员可以根据群组 ID 获取直播群管理员列表。该功能仅限旗舰版用户在 IM 控制台“群功能配置”中开启“直播群在线成员列表”后方可使用。
使用示例:
GetAdminListRequest request = GetAdminListRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . build ( ) ;
+
+GetAdminListResult result = client. group. getAdminList ( request) ;
+
App 管理员可以根据群组 ID 查询一批用户是否在直播群内。该功能需旗舰版,并且在 IM 控制台“群功能配置”中开通“直播群在线成员列表”功能。
使用示例:
CheckMembersRequest request = CheckMembersRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . memberAccount ( Arrays . asList ( "test1" , "bingo" ) )
+ . build ( ) ;
+
+CheckMembersResult result = client. group. checkMembers ( request) ;
+
`,262)]))}const i=s(e,[["render",o],["__file","group.html.vue"]]),u=JSON.parse('{"path":"/guide/group.html","title":"群组管理","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"获取 App 中的所有群组","slug":"获取-app-中的所有群组","link":"#获取-app-中的所有群组","children":[]},{"level":2,"title":"创建群组","slug":"创建群组","link":"#创建群组","children":[]},{"level":2,"title":"获取群详细资料","slug":"获取群详细资料","link":"#获取群详细资料","children":[]},{"level":2,"title":"获取群成员详细资料","slug":"获取群成员详细资料","link":"#获取群成员详细资料","children":[]},{"level":2,"title":"获取指定群成员详细资料","slug":"获取指定群成员详细资料","link":"#获取指定群成员详细资料","children":[]},{"level":2,"title":"修改群基础资料","slug":"修改群基础资料","link":"#修改群基础资料","children":[]},{"level":2,"title":"增加群成员","slug":"增加群成员","link":"#增加群成员","children":[]},{"level":2,"title":"删除群成员","slug":"删除群成员","link":"#删除群成员","children":[]},{"level":2,"title":"修改群成员资料","slug":"修改群成员资料","link":"#修改群成员资料","children":[]},{"level":2,"title":"解散群组","slug":"解散群组","link":"#解散群组","children":[]},{"level":2,"title":"获取用户所加入的群组","slug":"获取用户所加入的群组","link":"#获取用户所加入的群组","children":[]},{"level":2,"title":"查询用户在群组中的身份","slug":"查询用户在群组中的身份","link":"#查询用户在群组中的身份","children":[]},{"level":2,"title":"批量禁言和取消禁言","slug":"批量禁言和取消禁言","link":"#批量禁言和取消禁言","children":[]},{"level":2,"title":"获取被禁言群成员列表","slug":"获取被禁言群成员列表","link":"#获取被禁言群成员列表","children":[]},{"level":2,"title":"在群组中发送普通消息","slug":"在群组中发送普通消息","link":"#在群组中发送普通消息","children":[]},{"level":2,"title":"在群组中发送系统通知","slug":"在群组中发送系统通知","link":"#在群组中发送系统通知","children":[]},{"level":2,"title":"转让群主","slug":"转让群主","link":"#转让群主","children":[]},{"level":2,"title":"撤回群消息","slug":"撤回群消息","link":"#撤回群消息","children":[]},{"level":2,"title":"导入群基础资料","slug":"导入群基础资料","link":"#导入群基础资料","children":[]},{"level":2,"title":"导入群消息","slug":"导入群消息","link":"#导入群消息","children":[]},{"level":2,"title":"导入群成员","slug":"导入群成员","link":"#导入群成员","children":[]},{"level":2,"title":"设置成员未读消息计数","slug":"设置成员未读消息计数","link":"#设置成员未读消息计数","children":[]},{"level":2,"title":"删除指定用户发送的消息","slug":"删除指定用户发送的消息","link":"#删除指定用户发送的消息","children":[]},{"level":2,"title":"拉取群历史消息","slug":"拉取群历史消息","link":"#拉取群历史消息","children":[]},{"level":2,"title":"获取直播群在线人数","slug":"获取直播群在线人数","link":"#获取直播群在线人数","children":[]},{"level":2,"title":"获取直播群在线列表","slug":"获取直播群在线列表","link":"#获取直播群在线列表","children":[]},{"level":2,"title":"设置直播群成员标记","slug":"设置直播群成员标记","link":"#设置直播群成员标记","children":[]},{"level":2,"title":"获取群自定义属性","slug":"获取群自定义属性","link":"#获取群自定义属性","children":[]},{"level":2,"title":"修改群自定义属性","slug":"修改群自定义属性","link":"#修改群自定义属性","children":[]},{"level":2,"title":"清空群自定义属性","slug":"清空群自定义属性","link":"#清空群自定义属性","children":[]},{"level":2,"title":"重置群自定义属性","slug":"重置群自定义属性","link":"#重置群自定义属性","children":[]},{"level":2,"title":"修改群聊历史消息","slug":"修改群聊历史消息","link":"#修改群聊历史消息","children":[]},{"level":2,"title":"直播群广播消息","slug":"直播群广播消息","link":"#直播群广播消息","children":[]},{"level":2,"title":"拉取群消息已读回执信息","slug":"拉取群消息已读回执信息","link":"#拉取群消息已读回执信息","children":[]},{"level":2,"title":"拉取群消息已读回执详情","slug":"拉取群消息已读回执详情","link":"#拉取群消息已读回执详情","children":[]},{"level":2,"title":"创建话题","slug":"创建话题","link":"#创建话题","children":[]},{"level":2,"title":"获取话题资料","slug":"获取话题资料","link":"#获取话题资料","children":[]},{"level":2,"title":"修改话题资料","slug":"修改话题资料","link":"#修改话题资料","children":[]},{"level":2,"title":"导入话题基础资料","slug":"导入话题基础资料","link":"#导入话题基础资料","children":[]},{"level":2,"title":"解散话题","slug":"解散话题","link":"#解散话题","children":[]},{"level":2,"title":"获取封禁群成员列表","slug":"获取封禁群成员列表","link":"#获取封禁群成员列表","children":[]},{"level":2,"title":"群成员封禁","slug":"群成员封禁","link":"#群成员封禁","children":[]},{"level":2,"title":"群成员解封","slug":"群成员解封","link":"#群成员解封","children":[]},{"level":2,"title":"拉取群消息扩展","slug":"拉取群消息扩展","link":"#拉取群消息扩展","children":[]},{"level":2,"title":"设置群消息扩展","slug":"设置群消息扩展","link":"#设置群消息扩展","children":[]},{"level":2,"title":"获取群计数器","slug":"获取群计数器","link":"#获取群计数器","children":[]},{"level":2,"title":"更新群计数器","slug":"更新群计数器","link":"#更新群计数器","children":[]},{"level":2,"title":"删除群计数器","slug":"删除群计数器","link":"#删除群计数器","children":[]},{"level":2,"title":"设置/取消直播群管理员","slug":"设置-取消直播群管理员","link":"#设置-取消直播群管理员","children":[]},{"level":2,"title":"获取直播群管理员列表","slug":"获取直播群管理员列表","link":"#获取直播群管理员列表","children":[]},{"level":2,"title":"查询用户是否在直播群内","slug":"查询用户是否在直播群内","link":"#查询用户是否在直播群内","children":[]}],"git":{"updatedTime":1733187428000,"contributors":[{"name":"Libin YANG","email":"szuyanglb@outlook.com","commits":2,"url":"https://github.com/Libin YANG"},{"name":"Joel","email":"34619326+joelcho@users.noreply.github.com","commits":1,"url":"https://github.com/Joel"},{"name":"hongyiheng","email":"hongyihengg@gmail.com","commits":2,"url":"https://github.com/hongyiheng"},{"name":"Yang Libin","email":"szuyanglb@outlook.com","commits":19,"url":"https://github.com/Yang Libin"},{"name":"yanglbme","email":"szuyanglb@outlook.com","commits":3,"url":"https://github.com/yanglbme"},{"name":"怡蘅","email":"hongyihengg@gmail.com","commits":3,"url":"https://github.com/怡蘅"}]},"filePathRelative":"guide/group.md"}');export{i as comp,u as data};
diff --git a/assets/index.html-CdRdMOnY.js b/assets/index.html-CdRdMOnY.js
new file mode 100644
index 00000000..d4858f99
--- /dev/null
+++ b/assets/index.html-CdRdMOnY.js
@@ -0,0 +1 @@
+import{_ as o,c as r,a as t,b as a,d as i,e as l,o as s,r as c}from"./app-DZZ4xOJ4.js";const d="/qcloud-im-server-sdk-java/assets/create_identifier-DkS_S2BP.png",m={};function p(h,e){const n=c("Badge");return s(),r("div",null,[e[2]||(e[2]=t("h1",{id:"介绍",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#介绍"},[t("span",null,"介绍")])],-1)),t("p",null,[e[0]||(e[0]=a("本文档基于腾讯云 IM Server SDK Java ")),i(n,{type:"tip",text:"v0.4.10",vertical:"top"}),e[1]||(e[1]=a(" 编写。"))]),e[3]||(e[3]=l('说明
“App 管理员”是对 App 具有最高管理权限的角色,可调用 REST API 接口 ,进行创建/解散群组、发送全员推送消息等操作。每个应用最多支持配置 10 个管理员。
SDK 源码请参见 GitHub 。
',9))])}const g=o(m,[["render",p],["__file","index.html.vue"]]),b=JSON.parse('{"path":"/guide/","title":"介绍","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"前提条件","slug":"前提条件","link":"#前提条件","children":[]},{"level":2,"title":"SDK 环境依赖","slug":"sdk-环境依赖","link":"#sdk-环境依赖","children":[]},{"level":2,"title":"SDK 源码","slug":"sdk-源码","link":"#sdk-源码","children":[]},{"level":2,"title":"项目贡献者","slug":"项目贡献者","link":"#项目贡献者","children":[]}],"git":{"updatedTime":1733187428000,"contributors":[{"name":"Libin YANG","email":"szuyanglb@outlook.com","commits":6,"url":"https://github.com/Libin YANG"},{"name":"yanglbme","email":"szuyanglb@outlook.com","commits":18,"url":"https://github.com/yanglbme"},{"name":"Antenbabby","email":"18116874+Antenbabby@users.noreply.github.com","commits":2,"url":"https://github.com/Antenbabby"},{"name":"hongyiheng","email":"hongyihengg@gmail.com","commits":2,"url":"https://github.com/hongyiheng"},{"name":"acbin","email":"44314231+acbin@users.noreply.github.com","commits":1,"url":"https://github.com/acbin"},{"name":"Yang Libin","email":"szuyanglb@outlook.com","commits":46,"url":"https://github.com/Yang Libin"},{"name":"yu","email":"502400992@qq.com","commits":1,"url":"https://github.com/yu"},{"name":"怡蘅","email":"hongyihengg@gmail.com","commits":2,"url":"https://github.com/怡蘅"}]},"filePathRelative":"guide/README.md"}');export{g as comp,b as data};
diff --git a/assets/index.html-QdMgkfu-.js b/assets/index.html-QdMgkfu-.js
new file mode 100644
index 00000000..be613748
--- /dev/null
+++ b/assets/index.html-QdMgkfu-.js
@@ -0,0 +1 @@
+import{_ as t,c as e,o as i}from"./app-DZZ4xOJ4.js";const a={};function l(o,n){return i(),e("div")}const m=t(a,[["render",l],["__file","index.html.vue"]]),c=JSON.parse('{"path":"/","title":"首页","lang":"zh-CN","frontmatter":{"home":true,"title":"首页","heroImage":"https://avatars.githubusercontent.com/u/43716716","tagline":null,"actions":[{"text":"快速上手","link":"/guide/quickstart.html","type":"primary"},{"text":"项目简介","link":"/guide/","type":"secondary"}],"features":[{"title":"账号管理","details":"导入、删除、查询账号等"},{"title":"单聊消息","details":"发送、查询、撤回、已读消息等"},{"title":"全员推送","details":"设置、获取应用属性、用户属性、用户标签等"},{"title":"资料管理","details":"设置、拉取资料"},{"title":"关系链管理","details":"添加、导入、更新、删除、校验好友等"},{"title":"最近联系人","details":"拉取、删除会话等"},{"title":"群组管理","details":"管理群组、群成员、群消息通知等"},{"title":"全局禁言管理","details":"设置、查询全局禁言等"},{"title":"机器人","details":"创建、删除、拉取机器人等"},{"title":"内容审核","details":"本地审核、云端审核等"},{"title":"公众号管理","details":"创建、销毁、修改公众号等"}],"footer":"Apache-2.0 Licensed | Copyright © 2021-present Doocs"},"headers":[],"git":{"updatedTime":1704879157000,"contributors":[{"name":"Libin YANG","email":"szuyanglb@outlook.com","commits":1,"url":"https://github.com/Libin YANG"},{"name":"hongyiheng","email":"hongyihengg@gmail.com","commits":1,"url":"https://github.com/hongyiheng"},{"name":"acbin","email":"44314231+acbin@users.noreply.github.com","commits":1,"url":"https://github.com/acbin"},{"name":"Yang Libin","email":"szuyanglb@outlook.com","commits":1,"url":"https://github.com/Yang Libin"},{"name":"yanglbme","email":"szuyanglb@outlook.com","commits":2,"url":"https://github.com/yanglbme"}]},"filePathRelative":"README.md"}');export{m as comp,c as data};
diff --git a/assets/member.html-BZ4QMk5x.js b/assets/member.html-BZ4QMk5x.js
new file mode 100644
index 00000000..2f83ec6e
--- /dev/null
+++ b/assets/member.html-BZ4QMk5x.js
@@ -0,0 +1,70 @@
+import{_ as n,c as a,e as t,o as p}from"./app-DZZ4xOJ4.js";const e={};function c(l,s){return p(),a("div",null,s[0]||(s[0]=[t(`全员推送,用户运营利器,不仅支持全员发送特定内容,还可根据标签、属性,针对特定用户群体发送个性化内容,如会员活动、区域通知等,助力拉新、转化、促活等各个阶段运营工作的有效进行。
支持全员推送。 支持按用户属性推送。 支持按用户标签推送。 管理员推送消息,接收方看到消息发送者是管理员。 管理员指定某一账号向其他账号推送消息,接收方看到发送者不是管理员,而是管理员指定的账号。 支持消息离线存储,不支持漫游。 由于全员推送需要下发的账号数量巨大,下发完全部账号需要一定时间(根据账号总数而定,一般在一分钟内)。 支持只推在线用户,需要将 MsgLifeTime 参数设置为 0。 使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "hi, beauty" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+ImPushRequest request = ImPushRequest . builder ( )
+ . msgRandom ( 9312457L )
+ . msgBody ( msgBody)
+ . fromAccount ( "admin" )
+ . msgLifeTime ( 120 )
+ . build ( ) ;
+
+ImPushResult result = client. member. imPush ( request) ;
+
每个应用可以设置自定义的用户属性,最多可以有 10 个。通过本接口可以设置每个属性的名称,设置完成后,即可用于按用户属性推送等。
使用示例:
Map < String , String > attrNames = new HashMap < > ( 3 ) ;
+attrNames. put ( "0" , "sex" ) ;
+attrNames. put ( "1" , "city" ) ;
+attrNames. put ( "2" , "country" ) ;
+ImSetAttrNameRequest request = new ImSetAttrNameRequest ( attrNames) ;
+
+ImSetAttrNameResult result = client. member. imSetAttrName ( request) ;
+
管理员获取应用属性名称。使用前请先 设置应用属性名称 。
使用示例:
ImGetAttrNameRequest request = new ImGetAttrNameRequest ( ) ;
+
+ImGetAttrNameResult result = client. member. imGetAttrName ( request) ;
+
获取用户属性(必须以管理员账号调用);每次最多只能获取 100 个用户的属性。使用前请先 设置应用属性名称 。
使用示例:
List < String > toAccount = Arrays . asList ( "test1" , "test2" ) ;
+ImGetAttrRequest request = new ImGetAttrRequest ( toAccount) ;
+
+ImGetAttrResult result = client. member. imGetAttr ( request) ;
+
管理员给用户设置属性。每次最多只能给 100 个用户设置属性。使用前请先 设置应用属性名称 。
使用示例:
Map < String , Object > attrs = new HashMap < > ( ) ;
+attrs. put ( "sex" , "attr1" ) ;
+attrs. put ( "city" , "attr2" ) ;
+UserAttrItem item = new UserAttrItem ( "test1" , attrs) ;
+List < UserAttrItem > userAttrs = Collections . singletonList ( item) ;
+ImSetAttrRequest request = new ImSetAttrRequest ( userAttrs) ;
+
+ImSetAttrResult result = client. member. imSetAttr ( request) ;
+
管理员给用户删除属性。注意每次最多只能给 100 个用户删除属性。使用前请先 设置应用属性名称 。
使用示例:
Map < String , Object > attrs = new HashMap < > ( ) ;
+attrs. put ( "sex" , "attr1" ) ;
+attrs. put ( "city" , "attr2" ) ;
+UserAttrItem item = UserAttrItem . builder ( )
+ . toAccount ( "test1" )
+ . attrs ( attrs)
+ . build ( ) ;
+List < UserAttrItem > userAttrs = Collections . singletonList ( item) ;
+ImRemoveAttrRequest request = new ImRemoveAttrRequest ( userAttrs) ;
+
+ImRemoveAttrResult result = client. member. imRemoveAttr ( request) ;
+
获取用户标签(必须以管理员账号调用)。每次最多只能获取 100 个用户的标签。
使用示例:
List < String > toAccount = Arrays . asList ( "test1" , "test2" ) ;
+ImGetTagRequest request = new ImGetTagRequest ( toAccount) ;
+
+ImGetTagResult result = client. member. imGetTag ( request) ;
+
管理员给用户添加标签。
注意
每次请求最多只能给 100 个用户添加标签,请求体中单个用户添加标签数最多为 10 个。 单个用户可设置最大标签数为 100 个,若用户当前标签超过 100,则添加新标签之前请先删除旧标签。 单个标签最大长度为 50 字节。 使用示例:
List < String > tags = Arrays . asList ( "a" , "b" ) ;
+UserTagItem item = UserTagItem . builder ( )
+ . toAccount ( "test1" )
+ . tags ( tags)
+ . build ( ) ;
+List < UserTagItem > userTags = Collections . singletonList ( item) ;
+ImAddTagRequest request = new ImAddTagRequest ( userTags) ;
+
+ImAddTagResult result = client. member. imAddTag ( request) ;
+
管理员给用户删除标签。注意每次最多只能给 100 个用户删除标签。
使用示例:
List < String > tags = Arrays . asList ( "a" , "b" ) ;
+UserTagItem item = UserTagItem . builder ( )
+ . toAccount ( "test1" )
+ . tags ( tags)
+ . build ( ) ;
+List < UserTagItem > userTags = Collections . singletonList ( item) ;
+ImRemoveTagRequest request = new ImRemoveTagRequest ( userTags) ;
+
+ImRemoveTagResult result = client. member. imRemoveTag ( request) ;
+
管理员给用户删除所有标签。注意每次最多只能给 100 个用户删除所有标签。
使用示例:
List < String > toAccount = Arrays . asList ( "test1" , "test2" ) ;
+ImRemoveAllTagsRequest request = new ImRemoveAllTagsRequest ( toAccount) ;
+
+ImRemoveAllTagsResult result = client. member. imRemoveAllTags ( request) ;
+
`,44)]))}const i=n(e,[["render",c],["__file","member.html.vue"]]),u=JSON.parse('{"path":"/guide/member.html","title":"全员推送","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"全员推送","slug":"全员推送-1","link":"#全员推送-1","children":[]},{"level":2,"title":"设置应用属性名称","slug":"设置应用属性名称","link":"#设置应用属性名称","children":[]},{"level":2,"title":"获取应用属性名称","slug":"获取应用属性名称","link":"#获取应用属性名称","children":[]},{"level":2,"title":"获取用户属性","slug":"获取用户属性","link":"#获取用户属性","children":[]},{"level":2,"title":"设置用户属性","slug":"设置用户属性","link":"#设置用户属性","children":[]},{"level":2,"title":"删除用户属性","slug":"删除用户属性","link":"#删除用户属性","children":[]},{"level":2,"title":"获取用户标签","slug":"获取用户标签","link":"#获取用户标签","children":[]},{"level":2,"title":"添加用户标签","slug":"添加用户标签","link":"#添加用户标签","children":[]},{"level":2,"title":"删除用户标签","slug":"删除用户标签","link":"#删除用户标签","children":[]},{"level":2,"title":"删除所有用户标签","slug":"删除所有用户标签","link":"#删除所有用户标签","children":[]}],"git":{"updatedTime":1696847753000,"contributors":[{"name":"acbin","email":"44314231+acbin@users.noreply.github.com","commits":1,"url":"https://github.com/acbin"},{"name":"yanglbme","email":"szuyanglb@outlook.com","commits":1,"url":"https://github.com/yanglbme"},{"name":"Yang Libin","email":"szuyanglb@outlook.com","commits":4,"url":"https://github.com/Yang Libin"},{"name":"怡蘅","email":"hongyihengg@gmail.com","commits":1,"url":"https://github.com/怡蘅"},{"name":"hongyiheng","email":"hongyihengg@gmail.com","commits":1,"url":"https://github.com/hongyiheng"}]},"filePathRelative":"guide/member.md"}');export{i as comp,u as data};
diff --git a/assets/message.html-BJmlazXr.js b/assets/message.html-BJmlazXr.js
new file mode 100644
index 00000000..cdeedf0b
--- /dev/null
+++ b/assets/message.html-BJmlazXr.js
@@ -0,0 +1,122 @@
+import{_ as s,c as a,e as t,o as p}from"./app-DZZ4xOJ4.js";const e={};function c(l,n){return p(),a("div",null,n[0]||(n[0]=[t(`管理员向账号发消息,接收方看到消息发送者是管理员。 管理员指定某一账号向其他账号发消息,接收方看到发送者不是管理员,而是管理员指定的账号。 该接口不会检查发送者和接收者的好友关系(包括黑名单),同时不会检查接收者是否被禁言。 该接口默认不会检查接收者对发送者是否设置了免打扰,如需检查,请在"SendMsgControl"字段填上"WithMuteNotifications"。 单聊消息 MsgSeq 字段的作用及说明:该字段在发送消息时由用户自行指定,该值可以重复,非后台生成,非全局唯一。与群聊消息的 MsgSeq 字段不同,群聊消息的 MsgSeq 由后台生成,每个群都维护一个 MsgSeq,从 1 开始严格递增。单聊消息历史记录对同一个会话的消息先以时间戳排序,同秒内的消息再以 MsgSeq 排序。 使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "hello world" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+SendMsgRequest request = SendMsgRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( "test2" )
+ . msgRandom ( 123L )
+ . msgBody ( msgBody)
+ . syncOtherMachine ( SyncOtherMachine . YES )
+ . msgTimeStamp ( 1631934058 )
+ . msgLifeTime ( 604800 )
+ . build ( ) ;
+
+SendMsgResult result = client. message. sendMsg ( request) ;
+
支持一次对最多 500 个用户进行单发消息。 与单发消息相比,该接口更适用于营销类消息、系统通知 tips 等时效性较强的消息。 若消息不需要计入未读数,也不需要存储聊天记录,则可将 MsgLifeTime 字段设置为 0,这样可以带来更快的消息下发速度。 管理员指定某一账号向目标账号批量发消息,接收方看到发送者不是管理员,而是管理员指定的账号。 该接口不触发回调请求。 该接口不会检查发送者和接收者的好友关系(包括黑名单),同时不会检查接收者是否被禁言。 该接口默认不会检查接收者对发送者是否设置了免打扰,如需检查,请在"SendMsgControl"字段填上"WithMuteNotifications"。 单聊消息 MsgSeq 字段的作用及说明:该字段在发送消息时由用户自行指定,该值可以重复,非后台生成,非全局唯一。与群聊消息的 MsgSeq 字段不同,群聊消息的 MsgSeq 由后台生成,每个群都维护一个 MsgSeq,从 1 开始严格递增。单聊消息历史记录对同一个会话的消息先以时间戳排序,同秒内的消息再以 MsgSeq 排序。 使用示例:
List < String > toAccount = Arrays . asList ( "test1" , "test2" ) ;
+TIMTextMsgElement msg = new TIMTextMsgElement ( "hi bingo" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+BatchSendMsgRequest request = BatchSendMsgRequest
+ . builder ( )
+ . toAccount ( toAccount)
+ . msgRandom ( 123L )
+ . msgBody ( msgBody)
+ . syncOtherMachine ( SyncOtherMachine . NO )
+ . msgSeq ( 28460L )
+ . build ( ) ;
+
+BatchSendMsgResult result = client. message. batchSendMsg ( request) ;
+
导入历史单聊消息到即时通信 IM。 平滑过渡期间,将原有即时通信实时单聊消息导入到即时通信 IM。 该接口会更新会话。 该接口不会触发回调。 对于同一个单聊会话的消息,该接口会根据 MsgSeq , MsgRandom , MsgTimeStamp 字段的值对导入的消息进行去重。仅当这三个字段的值都对应相同时,才判定消息是重复的,消息是否重复与消息内容本身无关。 另外,若两条消息的 MsgSeq , MsgRandom , MsgTimeStamp 字段对应相同,而 from_account 和 to_account 相反,则这两条消息也认为是重复的。 重复导入的消息不会覆盖之前已导入的消息(即消息内容以首次导入的为准)。 单聊消息 MsgSeq 字段的作用及说明:该字段在发送消息时由用户自行指定,该值可以重复,非后台生成,非全局唯一。与群聊消息的 MsgSeq 字段不同,群聊消息的 MsgSeq 由后台生成,每个群都维护一个 MsgSeq,从 1 开始严格递增。单聊消息历史记录对同一个会话的消息先以时间戳排序,同秒内的消息再以 MsgSeq 排序。 使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "hello bingo" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+ImportMsgRequest request = ImportMsgRequest . builder ( )
+ . fromAccount ( "bingo" )
+ . toAccount ( "test1" )
+ . msgRandom ( 122L )
+ . msgTimeStamp ( 1557387418 )
+ . msgBody ( msgBody)
+ . build ( ) ;
+
+ImportMsgResult result = client. message. importMsg ( request) ;
+
管理员按照时间范围查询某单聊会话的消息记录。 查询的单聊会话由请求中的 From_Account 和 To_Account 指定。查询结果包含会话双方互相发送的消息,具体每条消息的发送方和接收方由每条消息里的 From_Account 和 To_Account 指定。 一般情况下,请求中的 From_Account 和 To_Account 字段值互换,查询结果不变。但通过 单发单聊消息 或 批量发单聊消息 接口发送的消息,如果指定 SyncOtherMachine 值为 2,则需要指定正确的 From_Account 和 To_Account 字段值才能查询到该消息。 例如,通过 单发单聊消息 接口指定账号 A 给账号 B 发一条消息,同时指定 SyncOtherMachine 值为 2。则调用本接口时,From_Account 必须设置为账号 B,To_Account 必须设置为账号 A 才能查询到该消息。 查询结果包含被撤回的消息,由消息里的 MsgFlagBits 字段标识。 若想通过 撤回单聊消息 接口撤回某条消息,可先用本接口查询出该消息的 MsgKey,然后再调用撤回接口进行撤回。 可查询的消息记录的时间范围取决于漫游消息存储时长,默认是 7 天。支持在控制台修改消息漫游时长,延长消息漫游时长是增值服务。具体请参考 漫游消息存储 。 若请求时间段内的消息总大小超过应答包体大小限制(目前为 13K)时,则需要续拉。您可以通过应答中的 Complete 字段查看是否已拉取请求的全部消息。 使用示例:
AdminGetRoamMsgRequest request = AdminGetRoamMsgRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( "test2" )
+ . maxCnt ( 123 )
+ . minTime ( 1631934000 )
+ . maxTime ( 1631934060 )
+ . build ( ) ;
+
+AdminRoamMsgResult result = client. message. getRoamMsg ( request) ;
+
+List < MsgListItem > msgList = result. getMsgList ( ) ;
+if ( msgList != null && msgList. size ( ) > 0 ) {
+ for ( MsgListItem item : msgList) {
+ List < TIMMsgElement > msgBody = item. getMsgBody ( ) ;
+ if ( msgBody != null && msgList. size ( ) > 0 ) {
+ for ( TIMMsgElement msgElement : msgBody) {
+
+ if ( Objects . equals ( msgElement. getMsgType ( ) , MsgType . TIM_CUSTOM_ELEM ) ) {
+ TIMCustomMsgElement t = ( TIMCustomMsgElement ) msgElement;
+ System . out. println ( t. getMsgContent ( ) . getDesc ( ) ) ;
+ } else if ( Objects . equals ( msgElement. getMsgType ( ) , MsgType . TIM_TEXT_ELEM ) ) {
+ TIMTextMsgElement t = ( TIMTextMsgElement ) msgElement;
+ System . out. println ( t. getMsgContent ( ) . getText ( ) ) ;
+ }
+ }
+ }
+ }
+}
+
管理员撤回单聊消息。 该接口可以撤回所有单聊消息,包括客户端发出的单聊消息,由 单发 和 批量发 接口发出的单聊消息。 若需要撤回由客户端发出的单聊消息,您可以开通 发单聊消息之前回调 或 发单聊消息之后回调 ,通过该回调接口记录每条单聊消息的 MsgKey ,然后填在本接口的 MsgKey 字段进行撤回。您也可以通过 查询单聊消息 查询出待撤回的单聊消息的 MsgKey 后,填在本接口的 MsgKey 字段进行撤回。 若需要撤回由 单发 和 批量发 接口发出的单聊消息,需要记录这些接口回包里的 MsgKey 字段以进行撤回。 调用该接口撤回消息后,该条消息的离线、漫游存储,以及消息发送方和接收方的客户端的本地缓存都会被撤回。 该接口可撤回的单聊消息没有时间限制,即可以撤回任何时间的单聊消息。 注意
使用该接口撤回单聊消息后,被撤回的消息不能恢复,请谨慎调用该接口。
使用示例:
AdminMsgWithdrawRequest request = AdminMsgWithdrawRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( "bingo" )
+ . msgKey ( "31906_833502_1572869830" )
+ . build ( ) ;
+
+AdminMsgWithdrawResult result = client. message. msgWithdraw ( request) ;
+
使用示例:
AdminSetMsgReadRequest request = AdminSetMsgReadRequest . builder ( )
+ . reportAccount ( "test1" )
+ . peerAccount ( "test2" )
+ . build ( ) ;
+
+AdminSetMsgReadResult result = client. message. setMsgRead ( request) ;
+
App 后台可以通过该接口查询特定账号的单聊总未读数(包含所有的单聊会话)或者单个单聊会话的未读数。
使用示例:
GetC2cUnreadMsgRequest request = new GetC2cUnreadMsgRequest ( "test2" ) ;
+List < String > peerAccount = Arrays . asList ( "test1" , "bingo" ) ;
+request. setPeerAccount ( peerAccount) ;
+
+C2cUnreadMsgNumResult result = client. message. getC2cUnreadMsgNum ( request) ;
+
管理员修改单聊历史消息。 可以单独修改消息中的 MsgBody 或 CloudCustomData 字段,也可以同时修改这两个字段。以请求中指定的字段值覆盖历史消息对应的字段。 待修改的单聊消息的 MsgKey 可通过以下方式获取: 注意
使用该接口修改消息后,被修改的消息不能恢复,请谨慎调用该接口。
使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "test modify c2c msg" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+ModifyC2cMsgRequest request = ModifyC2cMsgRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( "test2" )
+ . msgKey ( "1353691732_123_1653995506" )
+ . msgBody ( msgBody)
+ . build ( ) ;
+
+ModifyC2cMsgResult result = client. message. modifyC2cMsg ( request) ;
+
App 管理员和会话成员可以拉取消息扩展,消息扩展为一组自定义的键值对。
注意
此功能需 旗舰版套餐,并且已开通“消息扩展功能”功能(控制台“登录与消息”配置)。 单条单聊消息可设置的最大键值对数量为 300 条。 被设置的单聊消息需要在发送时指定“支持消息扩展”,参见 单发单聊消息 。 使用示例:
GetKeyValuesRequest request = GetKeyValuesRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( "bingo" )
+ . msgKey ( "1353691732_123_1653995506" )
+ . startSeq ( 1L )
+ . build ( ) ;
+
+GetKeyValuesResult result = client. message. getKeyValues ( request) ;
+
App 管理员和会话成员可以为单聊普通消息设置消息扩展,消息扩展为一组自定义的键值对。
注意
此功能需 旗舰版套餐,并且已开通“消息扩展功能”功能(控制台“登录与消息”配置)。 单条单聊消息可设置的最大键值对数量为 300 条。 被设置的单聊消息需要在发送时指定“支持消息扩展”,参见 单发单聊消息 。 使用示例:
SetKeyValuesRequest request = SetKeyValuesRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( "bingo" )
+ . msgKey ( "1353691732_123_1653995506" )
+ . build ( ) ;
+
+SetKeyValuesResult result = client. message. setKeyValues ( request) ;
+
App 管理员调用该接口单向删除一个单聊会话的多条消息。 只能以消息的发送方或接收方的身份去删除单聊会话的历史消息。 只能单向删除(以会话其中一方的身份去删除某条消息后,自己看不到这条消息,会话的对方仍然可以看到这条消息) 使用示例:
DeleteC2cMsgRambleRequest request = DeleteC2cMsgRambleRequest . builder ( )
+ . operatorAccount ( "test1" )
+ . peerAccount ( "test2" )
+ . msgKeyList ( Collections . singletonList ( "1353691732_123_1653995506" ) )
+ . build ( ) ;
+
+DeleteC2cMsgRambleResult result = client. message. deleteC2cMsgRamble ( request) ;
+
该 API 接口的作用是清空群聊中用户发送的历史消息。
此接口通过打标记实现 SDK 无法拉取的效果,并没有真的执行删除操作,Admin 用户仍然可以通过“拉取群聊历史消息”接口拉取已清空的历史消息。
使用示例:
ClearGroupMsgRequest request = ClearGroupMsgRequest . builder ( )
+ . groupId ( "test_group" )
+ . msgSeq ( 123L )
+ . build ( ) ;
+
+ClearGroupMsgResult result = client. message. clearGroupMsg ( request) ;
+
`,54)]))}const i=s(e,[["render",c],["__file","message.html.vue"]]),u=JSON.parse('{"path":"/guide/message.html","title":"单聊消息","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"单发单聊消息","slug":"单发单聊消息","link":"#单发单聊消息","children":[]},{"level":2,"title":"批量发单聊消息","slug":"批量发单聊消息","link":"#批量发单聊消息","children":[]},{"level":2,"title":"导入单聊消息","slug":"导入单聊消息","link":"#导入单聊消息","children":[]},{"level":2,"title":"查询单聊消息","slug":"查询单聊消息","link":"#查询单聊消息","children":[]},{"level":2,"title":"撤回单聊消息","slug":"撤回单聊消息","link":"#撤回单聊消息","children":[]},{"level":2,"title":"设置单聊消息已读","slug":"设置单聊消息已读","link":"#设置单聊消息已读","children":[]},{"level":2,"title":"查询单聊未读消息计数","slug":"查询单聊未读消息计数","link":"#查询单聊未读消息计数","children":[]},{"level":2,"title":"修改单聊历史消息","slug":"修改单聊历史消息","link":"#修改单聊历史消息","children":[]},{"level":2,"title":"拉取单聊消息扩展","slug":"拉取单聊消息扩展","link":"#拉取单聊消息扩展","children":[]},{"level":2,"title":"设置单聊消息扩展","slug":"设置单聊消息扩展","link":"#设置单聊消息扩展","children":[]},{"level":2,"title":"单向删除单聊历史消息","slug":"单向删除单聊历史消息","link":"#单向删除单聊历史消息","children":[]},{"level":2,"title":"清空群聊历史消息","slug":"清空群聊历史消息","link":"#清空群聊历史消息","children":[]}],"git":{"updatedTime":1704879157000,"contributors":[{"name":"Libin YANG","email":"szuyanglb@outlook.com","commits":1,"url":"https://github.com/Libin YANG"},{"name":"hongyiheng","email":"hongyihengg@gmail.com","commits":2,"url":"https://github.com/hongyiheng"},{"name":"acbin","email":"44314231+acbin@users.noreply.github.com","commits":1,"url":"https://github.com/acbin"},{"name":"Yang Libin","email":"szuyanglb@outlook.com","commits":9,"url":"https://github.com/Yang Libin"},{"name":"怡蘅","email":"hongyihengg@gmail.com","commits":1,"url":"https://github.com/怡蘅"}]},"filePathRelative":"guide/message.md"}');export{i as comp,u as data};
diff --git a/assets/official_account.html-B04Jw4h6.js b/assets/official_account.html-B04Jw4h6.js
new file mode 100644
index 00000000..af38feb5
--- /dev/null
+++ b/assets/official_account.html-B04Jw4h6.js
@@ -0,0 +1,66 @@
+import{_ as n,c as a,e as t,o as e}from"./app-DZZ4xOJ4.js";const p={};function c(l,s){return e(),a("div",null,s[0]||(s[0]=[t(`App 管理员可以通过该接口创建公众号。
使用示例:
CreateOfficialAccountRequest request = new CreateOfficialAccountRequest ( ) ;
+request. setOwnerAccount ( "test" ) ;
+request. setName ( "test_official_account" ) ;
+
+CreateOfficialAccountResult result = client. officialAccount. createOfficialAccount ( request) ;
+
App 管理员可以通过该接口销毁公众号。
使用示例:
DestroyOfficialAccountRequest request = new DestroyOfficialAccountRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+
+DestroyOfficialAccountResult result = client. officialAccount. destroyOfficialAccount ( request) ;
+
App 管理员可以通过该接口修改公众号的相关信息,如公众号的名称、头像、简介等
使用示例:
ModifyOfficialAccountBaseInfoRequest request = new ModifyOfficialAccountBaseInfoRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setName ( "test_official_account2" ) ;
+
+ModifyOfficialAccountBaseInfoResult result = client. officialAccount. modifyOfficialAccountBaseInfo ( request) ;
+
App 管理员可以通过该接口获取公众号的相关资料信息。
使用示例:
GetOfficialAccountInfoRequest request = new GetOfficialAccountInfoRequest ( ) ;
+request. setOfficialAccountIdList ( Collections . singletonList ( new OfficialAccountItem ( "test_official_account_user_id" ) ) ) ;
+
+GetOfficialAccountInfoResult result = client. officialAccount. getOfficialAccountInfo ( request) ;
+
App 管理员可以通过该接口获取订阅某个公众号的所有用户信息.
使用示例:
GetSubscriberInfoRequest request = new GetSubscriberInfoRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setLimit ( 10 ) ;
+request. setNext ( "" ) ;
+
+GetSubscriberInfoResult result = client. officialAccount. getSubscriberInfo ( request) ;
+
App 管理员可以通过该接口使用户订阅某个公众号,成为公众号的订阅成员。
使用示例:
AddSubscriberRequest request = new AddSubscriberRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setSubscriberList ( Collections . singletonList ( new OfficialAccountItem ( "test_subscriber_id" ) ) ) ;
+
+AddSubscriberResult result = client. officialAccount. addSubscriber ( request) ;
+
App 管理员可以通过该接口使用户取消订阅某个公众号,从公众号的订阅成员中移除。
使用示例:
DeleteSubscriberRequest request = new DeleteSubscriberRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setSubscriberToDelAccount ( Collections . singletonList ( "test_subscriber_id" ) ) ;
+
+DeleteSubscriberResult result = client. officialAccount. deleteSubscriber ( request) ;
+
App 管理员可以通过该接口修改订阅者的相关资料信息。
使用示例:
ModifySubscriberInfoRequest request = new ModifySubscriberInfoRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setSubscriberAccount ( "test_subscriber_id" ) ;
+request. setCustomString ( "test_custom_string" ) ;
+
+ModifySubscriberInfoResult result = client. officialAccount. modifySubscriberInfo ( request) ;
+
App 管理员可以通过该接口获取用户订阅的所有公众号列表信息。
使用示例:
GetSubscribedOfficialAccountListRequest request = new GetSubscribedOfficialAccountListRequest ( ) ;
+request. setSubscriberAccount ( "test_subscriber_id" ) ;
+
+GetSubscribedOfficialAccountListResult result = client. officialAccount. getSubscribedOfficialAccountList ( request) ;
+
App 管理员可以通过该接口向关注公众号的所有订阅者发送普通消息。 单个公众号的发送频率上限为1条/秒,每小时最多可发布2条广播消息。 如果5分钟内两条消息的内容相同,后面的消息将被当做重复消息而丢弃。 使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "hello world" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+SendOfficialAccountMsgRequest request = SendOfficialAccountMsgRequest . builder ( )
+ . officialAccount ( "test_official_account_user_id" )
+ . random ( 123 )
+ . msgBody ( msgBody)
+ . build ( ) ;
+
+SendOfficialAccountMsgResult result = client. officialAccount. sendOfficialAccountMsg ( request) ;
+
即时通信 IM 的公众号消息是按 Seq 排序的,按照 server 收到公众号消息的顺序分配 Seq,先发的公众号消息 Seq 小,后发的 Seq 大。 即时通信 IM 会给每条公众号消息生成一个 MsgKey,格式为 "Seq_1_ServerTime"。 如果用户想拉取一个公众号的全量消息,需要填写消息的 LastMsgKey,首次拉取时不用填拉取 LastMsgKey,Server 会自动返回最新的消息,以后拉取时拉取 LastMsgKey 填上次请求返回 LastMsgKey。 如果返回消息的 IsPlaceMsg 为1,表示这个 Seq 的消息或者过期、或者存储失败、或者被删除了。 使用示例:
OfficialAccountMsgGetSimpleRequest request = new OfficialAccountMsgGetSimpleRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setLastMsgKey ( "msg_key" ) ;
+request. setReqMsgNumber ( 10 ) ;
+request. setWithRecalledMsg ( 1 ) ;
+
+OfficialAccountMsgGetSimpleResult result = client. officialAccount. msgGetSimple ( request) ;
+
管理员撤回公众号消息。 该接口可以撤回所有漫游有效期内的公众号消息,包括客户端发出的公众号消息,由 REST API 接口发出的公众号消息。 若需要撤回由客户端发出的公众号消息,您可以开通 发公众号消息之后回调 ,通过该回调接口记录每条公众号消息的 MsgKey,然后填在本接口的 MsgKeyList 参数里进行撤回。您也可以通过 拉取公众号用户历史消息 查询出待撤回的公众号消息的相关信息后,使用本接口进行撤回。 若需要撤回由 REST API 公众号用户发送广播消息 接口发出的公众号消息,需要记录这些接口回包里的 MsgKey 字段以进行撤回。 调用该接口撤回消息后,该条消息的接收方的客户端的本地缓存都会被撤回。 该接口可撤回的公众号消息没有时间限制,即可以撤回任何时间的公众号消息,但是公众号消息的漫游时间需要在有效期内。 使用示例:
OfficialAccountMsgRecallRequest request = new OfficialAccountMsgRecallRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setMsgKeyList ( Collections . singletonList ( "msg_key" ) ) ;
+
+OfficialAccountMsgRecallResult result = client. officialAccount. msgRecall ( request) ;
+
`,49)]))}const o=n(p,[["render",c],["__file","official_account.html.vue"]]),u=JSON.parse('{"path":"/guide/official_account.html","title":"公众号管理","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"创建公众号","slug":"创建公众号","link":"#创建公众号","children":[]},{"level":2,"title":"销毁公众号","slug":"销毁公众号","link":"#销毁公众号","children":[]},{"level":2,"title":"修改公众号资料","slug":"修改公众号资料","link":"#修改公众号资料","children":[]},{"level":2,"title":"获取公众号详细资料","slug":"获取公众号详细资料","link":"#获取公众号详细资料","children":[]},{"level":2,"title":"获取公众号的订阅成员资料","slug":"获取公众号的订阅成员资料","link":"#获取公众号的订阅成员资料","children":[]},{"level":2,"title":"添加订阅者","slug":"添加订阅者","link":"#添加订阅者","children":[]},{"level":2,"title":"删除订阅者","slug":"删除订阅者","link":"#删除订阅者","children":[]},{"level":2,"title":"修改订阅者资料","slug":"修改订阅者资料","link":"#修改订阅者资料","children":[]},{"level":2,"title":"获取订阅的公众号列表","slug":"获取订阅的公众号列表","link":"#获取订阅的公众号列表","children":[]},{"level":2,"title":"公众号用户发送广播消息","slug":"公众号用户发送广播消息","link":"#公众号用户发送广播消息","children":[]},{"level":2,"title":"拉取公众号用户历史消息","slug":"拉取公众号用户历史消息","link":"#拉取公众号用户历史消息","children":[]},{"level":2,"title":"撤回公众号消息","slug":"撤回公众号消息","link":"#撤回公众号消息","children":[]}],"git":{"updatedTime":1704879157000,"contributors":[{"name":"Libin YANG","email":"szuyanglb@outlook.com","commits":1,"url":"https://github.com/Libin YANG"},{"name":"hongyiheng","email":"hongyihengg@gmail.com","commits":1,"url":"https://github.com/hongyiheng"}]},"filePathRelative":"guide/official_account.md"}');export{o as comp,u as data};
diff --git a/assets/operation_1.html-Cl_vumCv.js b/assets/operation_1.html-Cl_vumCv.js
new file mode 100644
index 00000000..5f19ed2d
--- /dev/null
+++ b/assets/operation_1.html-Cl_vumCv.js
@@ -0,0 +1,11 @@
+import{_ as s,c as a,e,o as t}from"./app-DZZ4xOJ4.js";const p={};function i(l,n){return t(),a("div",null,n[0]||(n[0]=[e(`设置账号的单聊消息全局禁言。 设置账号的群组消息全局禁言。 使用示例:
SetNoSpeakingRequest request = SetNoSpeakingRequest . builder ( )
+ . setAccount ( "test1" )
+ . msgNoSpeakingTime ( NoSpeakingTime . NEVER )
+ . groupMsgNoSpeakingTime ( NoSpeakingTime . FOREVER )
+ . build ( ) ;
+
+SetNoSpeakingResult result = client. operation. setNoSpeaking ( request) ;
+
查询账号的单聊消息全局禁言。 查询账号的群组消息全局禁言。 使用示例:
GetNoSpeakingRequest request = new GetNoSpeakingRequest ( "test1" ) ;
+
+GetNoSpeakingResult result = client. operation. getNoSpeaking ( request) ;
+
`,9)]))}const c=s(p,[["render",i],["__file","operation_1.html.vue"]]),u=JSON.parse('{"path":"/guide/operation_1.html","title":"全局禁言管理","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"设置全局禁言","slug":"设置全局禁言","link":"#设置全局禁言","children":[]},{"level":2,"title":"查询全局禁言","slug":"查询全局禁言","link":"#查询全局禁言","children":[]}],"git":{"updatedTime":1696847753000,"contributors":[{"name":"acbin","email":"44314231+acbin@users.noreply.github.com","commits":1,"url":"https://github.com/acbin"},{"name":"Yang Libin","email":"szuyanglb@outlook.com","commits":2,"url":"https://github.com/Yang Libin"},{"name":"hongyiheng","email":"hongyihengg@gmail.com","commits":1,"url":"https://github.com/hongyiheng"}]},"filePathRelative":"guide/operation_1.md"}');export{c as comp,u as data};
diff --git a/assets/operation_2.html-SwgSrwAt.js b/assets/operation_2.html-SwgSrwAt.js
new file mode 100644
index 00000000..8c1d738a
--- /dev/null
+++ b/assets/operation_2.html-SwgSrwAt.js
@@ -0,0 +1,34 @@
+import{_ as s,c as a,e as t,o as e}from"./app-DZZ4xOJ4.js";const p={};function l(c,n){return e(),a("div",null,n[0]||(n[0]=[t(`App 管理员可以通过该接口拉取最近 30 天的运营数据,可拉取的字段见下文可拉取的运营字段。
使用示例:
GetAppInfoRequest request = new GetAppInfoRequest ( ) ;
+List < String > requestFields = Arrays . asList ( "ChainIncrease" , "ChainDecrease" ) ;
+request. setRequestField ( requestFields) ;
+
+GetAppInfoResult result = client. operation. getAppInfo ( request) ;
+
App 管理员可以通过该接口获取 App 中最近 7 天中某天某小时的所有单发或群组消息记录的下载地址。
注意
下载消息记录里的图片、语音、文件和短视频,此功能仅适用于 4.X 版本 IM SDK,可通过聊天记录中的 URL 字段进行下载。如您使用 2.X 或 3.X 版本的 IM SDK,您将无法通过该方法获取到以上信息,如您需要此功能,请您升级至 4.X 版本。 消息记录以日志文件形式保存并使用 GZip 压缩,通过该接口获取到下载地址后,请自行下载并处理;消息记录文件每小时产生一次,例如 0 点(00:00~00:59)的数据在 01:00 后开始处理,一般 1 小时内处理完毕(消息较多则处理时间较长);文件有效期 7 天,无论是否下载过,都会在 7 天后删除,被删除后不支持重新导出;获取到的下载地址存在有效期,请在过期前进行下载,若地址失效,请通过该接口重新获取。 此接口仅用于下载最近 7 天的聊天记录文件,用于备份或数据统计等。不建议使用该接口用于线上实时业务。 使用示例:
GetHistoryRequest request = GetHistoryRequest . builder ( )
+ . chatType ( ChatType . C2C )
+ . msgTime ( "2015120121" )
+ . build ( ) ;
+
+GetHistoryResult result = client. operation. getHistory ( request) ;
+
基于安全等考虑,您可能需要获知服务器的 IP 地址列表,以便进行相关限制。App 管理员可以通过该接口获得 SDK、第三方回调所使用到的服务器 IP 地址列表或 IP 网段信息。
注意
此接口仅支持获取中国大陆地区的所有 IM 接入方式的 IP 地址或 IP 网段信息。
使用示例:
GetIpListRequest request = new GetIpListRequest ( ) ;
+
+GetIpListResult result = client. op~ eration. getIpList ( request) ;
+
本接口用于封禁聊天消息中的富媒体文件。
说明
仅针对富媒体消息中使用 IM SDK 上传的文件有效,为了确保功能正常使用,请将终端 SDK 更新至 4.9.x 版本及以上,Web SDK 更新至 v2.0.0 版本及以上。
使用示例:
ForbidIllegalObjectRequest request = ForbidIllegalObjectRequest . builder ( )
+ . rawUrl ( "https://cos.ap-shanghai.myqcloud.com/005f-shanghai-360-shared-01-1256635546/76aa-1400152839/2f3b-2273451635034382/699eb4ee5ffa9aeb70627958766f2927-142072.jpg" )
+ . build ( ) ;
+
+ForbidIllegalObjectResult result = client. operation. forbidIllegalObject ( request) ;
+
本接口用于解封聊天消息中的富媒体文件。
说明
仅针对富媒体消息中使用 IM SDK 上传的文件有效,为了确保功能正常使用,请将终端 SDK 更新至 4.9.x 版本及以上,Web SDK 更新至 v2.0.0 版本及以上。
AllowBannedObjectRequest request = AllowBannedObjectRequest . builder ( )
+ . rawUrl ( "https://cos.ap-shanghai.myqcloud.com/005f-shanghai-360-shared-01-1256635546/76aa-1400152839/2f3b-2273451635034382/699eb4ee5ffa9aeb70627958766f2927-142072.jpg" )
+ . build ( ) ;
+
+AllowBannedObjectResult result = client. operation. allowBannedObject ( request) ;
+
本接口用于获取聊天消息中的富媒体文件 FULL_CONTROL 权限的 URL 签名以及文件状态信息,默认有效期 15 分钟。一般 SDK 下发的文件 URL 为普通账号签名,违规封禁后,可以使用 FULL_CONTROL 权限的 URL 签名来查看封禁的资源。
说明
仅针对富媒体消息中使用 IM SDK 上传的文件有效,为了确保功能正常使用,请将终端 SDK 更新至 4.9.x 版本及以上,Web SDK 更新至 v2.0.0 版本及以上。
RawUrlItem item = new RawUrlItem ( ) ;
+item. setRawUrl ( "https://cos.ap-shanghai.myqcloud.com/98ec-shanghai-007-privatev2-01-1256635546/0345-1400187352/0612-yyy/9a0f4c42d208ccfb5aa47c29284aefc6.png" ) ;
+item. setResourceId ( 1 ) ;
+List < RawUrlItem > rawUrls = Collections . singletonList ( item) ;
+GetCosSigRequest request = GetCosSigRequest . builder ( )
+ . rawUrls ( rawUrls)
+ . build ( ) ;
+
+GetCosSigResult result = client. operation. getCosSig ( request) ;
+
`,28)]))}const o=s(p,[["render",l],["__file","operation_2.html.vue"]]),u=JSON.parse('{"path":"/guide/operation_2.html","title":"运营管理","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"拉取运营数据","slug":"拉取运营数据","link":"#拉取运营数据","children":[]},{"level":2,"title":"下载最近消息记录","slug":"下载最近消息记录","link":"#下载最近消息记录","children":[]},{"level":2,"title":"获取服务器 IP 地址","slug":"获取服务器-ip-地址","link":"#获取服务器-ip-地址","children":[]},{"level":2,"title":"聊天文件封禁","slug":"聊天文件封禁","link":"#聊天文件封禁","children":[]},{"level":2,"title":"聊天文件解封","slug":"聊天文件解封","link":"#聊天文件解封","children":[]},{"level":2,"title":"聊天文件签名","slug":"聊天文件签名","link":"#聊天文件签名","children":[]}],"git":{"updatedTime":1684979652000,"contributors":[{"name":"Yang Libin","email":"szuyanglb@outlook.com","commits":6,"url":"https://github.com/Yang Libin"},{"name":"怡蘅","email":"hongyihengg@gmail.com","commits":1,"url":"https://github.com/怡蘅"},{"name":"hongyiheng","email":"hongyihengg@gmail.com","commits":1,"url":"https://github.com/hongyiheng"}]},"filePathRelative":"guide/operation_2.md"}');export{o as comp,u as data};
diff --git a/assets/profile.html-dXRqAu3k.js b/assets/profile.html-dXRqAu3k.js
new file mode 100644
index 00000000..9cac973f
--- /dev/null
+++ b/assets/profile.html-dXRqAu3k.js
@@ -0,0 +1,20 @@
+import{_ as s,c as a,e as t,o as e}from"./app-DZZ4xOJ4.js";const p={};function c(o,n){return e(),a("div",null,n[0]||(n[0]=[t(`支持 标配资料字段 和 自定义资料字段 的设置。
使用示例:
ProfileItem profileItem = ProfileItem . builder ( )
+ . tag ( TagProfile . IM_NICK )
+ . value ( "MyNickName" )
+ . build ( ) ;
+List < ProfileItem > profiles = Collections . singletonList ( profileItem) ;
+PortraitSetRequest request = PortraitSetRequest . builder ( )
+ . fromAccount ( "test1" )
+ . profileItemList ( profiles)
+ . build ( ) ;
+
+PortraitSetResult result = client. profile. portraitSet ( request) ;
+
支持拉取好友和非好友的资料字段。 支持拉取 标配资料字段 和 自定义资料字段 。 建议每次拉取的用户数不超过 100,避免因回包数据量太大导致回包失败。 请确保请求中的所有账号都已导入即时通信 IM,如果请求中含有未导入即时通信 IM 的账号,即时通信 IM 后台将会提示错误。 使用示例:
List < String > tagList = Collections . singletonList ( TagProfile . IM_NICK ) ;
+List < String > toAccount = Collections . singletonList ( "test1" ) ;
+PortraitGetRequest request = PortraitGetRequest . builder ( )
+ . tagList ( tagList)
+ . toAccount ( toAccount)
+ . build ( ) ;
+
+PortraitGetResult result = client. profile. portraitGet ( request) ;
+
`,9)]))}const i=s(p,[["render",c],["__file","profile.html.vue"]]),u=JSON.parse('{"path":"/guide/profile.html","title":"资料管理","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"设置资料","slug":"设置资料","link":"#设置资料","children":[]},{"level":2,"title":"拉取资料","slug":"拉取资料","link":"#拉取资料","children":[]}],"git":{"updatedTime":1696847753000,"contributors":[{"name":"acbin","email":"44314231+acbin@users.noreply.github.com","commits":1,"url":"https://github.com/acbin"},{"name":"Yang Libin","email":"szuyanglb@outlook.com","commits":2,"url":"https://github.com/Yang Libin"},{"name":"hongyiheng","email":"hongyihengg@gmail.com","commits":1,"url":"https://github.com/hongyiheng"}]},"filePathRelative":"guide/profile.md"}');export{i as comp,u as data};
diff --git a/assets/quickstart.html-1lSs-POk.js b/assets/quickstart.html-1lSs-POk.js
new file mode 100644
index 00000000..2987704a
--- /dev/null
+++ b/assets/quickstart.html-1lSs-POk.js
@@ -0,0 +1,34 @@
+import{_ as e,c as p,e as a,a as l,b as s,d as c,f as o,r as i,o as u}from"./app-DZZ4xOJ4.js";const d={};function r(m,n){const t=i("RouteLink");return u(),p("div",null,[n[3]||(n[3]=a(`在项目的 pom.xml
的 dependencies 中引入以下依赖:
< dependency>
+ < groupId> io.github.doocs</ groupId>
+ < artifactId> im-server-sdk-java</ artifactId>
+ < version> 0.4.10</ version>
+</ dependency>
+
implementation group: 'io.github.doocs' , name: 'im-server-sdk-java' , version: '0.4.10'
+
Maven 中央仓库
在使用腾讯云即时 IM 服务端 REST API 之前, 需要先通过 appId
, userId
, key
获取到一个 ImClient
实例:
+long appId = 1400554812 ;
+
+
+String userId = "test" ;
+
+
+String key = "60c6c5925f3ae52c7325ac5a8ec78e44c056d1dd84d54e12ffa39911267a2a70" ;
+
+
+ImClient client = ImClient . getInstance ( appId, userId, key) ;
+
+
+ImClient client = ImClient . getInstance ( appId, userId, key, Domain . SINGAPORE ) ;
+
+
+ClientConfiguration config = new ClientConfiguration ( ) ;
+config. setExpireTime ( 7 * 24 * 60 * 60L ) ;
+config. setAutoRenewSig ( false ) ;
+ImClient client = ImClient . getInstance ( appId, userId, key, config) ;
+
ClientConfiguration
支持对以下参数进行自定义配置:
字段 类型 说明 默认值 maxRetries
int HTTP 最大重试次数 3 connectTimeout
long HTTP 连接超时(毫秒) 10_000 readTimeout
long HTTP 读超时(毫秒) 10_000 writeTimeout
long HTTP 写超时(毫秒) 10_000 callTimeout
long 一个完整的 HTTP 调用的时间限制。这包括解析 DNS、连接、写入请求正文、服务器处理以及读取响应正文。(毫秒) 30_000 expireTime
long UserSig 签名有效时长(秒) 86400 autoRenewSig
boolean 是否自动进行 UserSig 签名续期 true userAgent
string User-Agent connectionPool
object HTTP 连接池
获取到 ImClient
实例后,就可以方便地进行 REST API 调用了。
`,16)),l("p",null,[n[1]||(n[1]=s("我们以 ")),c(t,{to:"/guide/account.html#%E5%AF%BC%E5%85%A5%E5%8D%95%E4%B8%AA%E8%B4%A6%E5%8F%B7"},{default:o(()=>n[0]||(n[0]=[s("账号管理-导入单个账号")])),_:1}),n[2]||(n[2]=s(" 为例:"))]),n[4]||(n[4]=a(`AccountImportRequest request = AccountImportRequest . builder ( )
+ . identifier ( "admin" )
+ . faceUrl ( "https://avatars.githubusercontent.com/u/43716716?s=200&v=4" )
+ . nick ( "doocs" )
+ . build ( ) ;
+
+AccountImportResult result = client. account. accountImport ( request) ;
+
`,1))])}const g=e(d,[["render",r],["__file","quickstart.html.vue"]]),v=JSON.parse('{"path":"/guide/quickstart.html","title":"快速上手","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"安装","slug":"安装","link":"#安装","children":[{"level":3,"title":"Maven","slug":"maven","link":"#maven","children":[]},{"level":3,"title":"Gradle","slug":"gradle","link":"#gradle","children":[]},{"level":3,"title":"下载 JAR","slug":"下载-jar","link":"#下载-jar","children":[]}]},{"level":2,"title":"初始化","slug":"初始化","link":"#初始化","children":[]},{"level":2,"title":"使用示例","slug":"使用示例","link":"#使用示例","children":[]}],"git":{"updatedTime":1733187428000,"contributors":[{"name":"Libin YANG","email":"szuyanglb@outlook.com","commits":6,"url":"https://github.com/Libin YANG"},{"name":"yanglbme","email":"szuyanglb@outlook.com","commits":17,"url":"https://github.com/yanglbme"},{"name":"Antenbabby","email":"18116874+Antenbabby@users.noreply.github.com","commits":2,"url":"https://github.com/Antenbabby"},{"name":"hongyiheng","email":"hongyihengg@gmail.com","commits":2,"url":"https://github.com/hongyiheng"},{"name":"acbin","email":"44314231+acbin@users.noreply.github.com","commits":1,"url":"https://github.com/acbin"},{"name":"Yang Libin","email":"szuyanglb@outlook.com","commits":46,"url":"https://github.com/Yang Libin"},{"name":"怡蘅","email":"hongyihengg@gmail.com","commits":2,"url":"https://github.com/怡蘅"},{"name":"yu","email":"502400992@qq.com","commits":1,"url":"https://github.com/yu"}]},"filePathRelative":"guide/quickstart.md"}');export{g as comp,v as data};
diff --git a/assets/recent_contact.html-IVYUNhUE.js b/assets/recent_contact.html-IVYUNhUE.js
new file mode 100644
index 00000000..0f6d06d5
--- /dev/null
+++ b/assets/recent_contact.html-IVYUNhUE.js
@@ -0,0 +1,79 @@
+import{_ as s,c as a,e as t,o as p}from"./app-DZZ4xOJ4.js";const e={};function c(o,n){return p(),a("div",null,n[0]||(n[0]=[t(`支持分页拉取会话列表。
使用示例:
GetRecentContactListRequest request = GetRecentContactListRequest . builder ( )
+ . fromAccount ( "doocs" )
+ . timestamp ( 0 )
+ . startIndex ( 0 )
+ . topTimestamp ( 0 )
+ . topStartIndex ( 0 )
+ . assistFlags ( AssistFlags . BIT_0 )
+ . build ( ) ;
+
+GetRecentContactListResult result = client. recentContact. recentContactList ( request) ;
+
删除指定会话,支持同步清理漫游消息。
使用示例:
DeleteRecentContactRequest request = DeleteRecentContactRequest . builder ( )
+ . fromAccount ( "doocs_1" )
+ . type ( RecentContactType . C2C )
+ . toAccount ( "doocs_2" )
+ . clearRamble ( ClearRamble . YES )
+ . build ( ) ;
+
+DeleteRecentContactResult result = client. recentContact. deleteRecentContact ( request) ;
+
会话分组标记数据独立于最近联系人,RestAPI 支持会话分组、会话标准标记、会话自定义标记等字段增删改查。会话分组标记最多支持 1000 个会话,而一个用户最多支持 20 个会话分组。本接口支持会话分组数据的创建,仅旗舰版支持会话分组数据操作。
使用示例:
List < GroupContactItem > items = new ArrayList < > ( ) ;
+GroupContactItem item = new GroupContactItem ( ) ;
+item. setGroupName ( "groupName" ) ;
+
+List < ContactItem > contactItems = new ArrayList < > ( ) ;
+ContactItem contactItem = new ContactItem ( ) ;
+contactItem. setToAccount ( "ccc" ) ;
+contactItem. setToGroupId ( "group1" ) ;
+contactItem. setType ( 1 ) ;
+contactItems. add ( contactItem) ;
+item. setContactItem ( contactItems) ;
+items. add ( item) ;
+CreateContactGroupRequest request = CreateContactGroupRequest . builder ( )
+ . fromAccount ( "test1" )
+ . groupContactItem ( items) . build ( ) ;
+
+CreateContactGroupResult result = client. recentContact. createContactGroup ( request) ;
+
会话分组标记数据独立于最近联系人,RestAPI 支持会话分组、会话标准标记、会话自定义标记等字段增删改查。会话分组标记数据最多支持 1000 个会话。本接口支持会话分组数据的更新,仅旗舰版支持会话分组数据操作。
使用示例:
UpdateGroup updateGroup = UpdateGroup . builder ( ) . updateGroupType ( 1 )
+ . newGroupName ( "hh" ) . oldGroupName ( "cc" ) . build ( ) ;
+UpdateContactGroupRequest request = UpdateContactGroupRequest . builder ( )
+ . updateType ( 1 )
+ . fromAccount ( "test1" )
+ . updateGroup ( updateGroup)
+ . build ( ) ;
+
+UpdateContactGroupResult result = client. recentContact. updateContactGroup ( request) ;
+
本接口支持删除用户的会话分组数据,仅旗舰版支持会话分组数据操作。
使用示例:
List < String > groupName = new ArrayList < > ( ) ;
+groupName. add ( "hh" ) ;
+DelContactGroupRequest request = DelContactGroupRequest . builder ( )
+ . groupName ( groupName)
+ . fromAccount ( "test1" )
+ . build ( ) ;
+
+DelContactGroupResult result = client. recentContact. delContactGroup ( request) ;
+
会话分组标记数据独立于最近联系人,RestAPI 支持会话分组、会话标准标记、会话自定义标记等字段增删改查。会话分组标记最多支持 1000 个会话。本接口支持会话标准标记以及会话自定义标记的创建或更新,仅旗舰版支持会话标准标记数据操作,自定义会话标记数据无限制。
使用示例:
List < MarkContactItem > items = new ArrayList < > ( ) ;
+MarkContactItem item = new MarkContactItem ( ) ;
+item. setClearMark ( Collections . singletonList ( 1 ) ) ;
+item. setSetMark ( Collections . singletonList ( 2 ) ) ;
+item. setOptType ( 1 ) ;
+items. add ( item) ;
+MarkContactRequest request = MarkContactRequest . builder ( )
+ . fromAccount ( "test1" )
+ . markItem ( items)
+ . build ( ) ;
+
+MarkContactResult result = client. recentContact. markContact ( request) ;
+
本接口根据指定的会话来查询对应会话分组标记数据。
使用示例:
SearchContactGroupRequest request = new SearchContactGroupRequest ( ) ;
+request. setFromAccount ( "test1" ) ;
+ContactItem contactItem = new ContactItem ( ) ;
+contactItem. setType ( 1 ) ;
+contactItem. setToAccount ( "test2" ) ;
+contactItem. setToGroupId ( "123" ) ;
+request. setContactItem ( Collections . singletonList ( contactItem) ) ;
+
+SearchContactGroupResult result = client. recentContact. searchContactGroup ( request) ;
+
本接口支持批量获取用户的会话分组标记数据。
使用示例:
GetContactGroupRequest request = new GetContactGroupRequest ( ) ;
+request. setFromAccount ( "test1" ) ;
+request. setStartIndex ( 1 ) ;
+
+GetContactGroupResult result = client. recentContact. getContactGroup ( request) ;
+
`,33)]))}const u=s(e,[["render",c],["__file","recent_contact.html.vue"]]),i=JSON.parse('{"path":"/guide/recent_contact.html","title":"最近联系人","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"拉取会话列表","slug":"拉取会话列表","link":"#拉取会话列表","children":[]},{"level":2,"title":"删除单个会话","slug":"删除单个会话","link":"#删除单个会话","children":[]},{"level":2,"title":"创建会话分组数据","slug":"创建会话分组数据","link":"#创建会话分组数据","children":[]},{"level":2,"title":"更新会话分组数据","slug":"更新会话分组数据","link":"#更新会话分组数据","children":[]},{"level":2,"title":"删除会话分组数据","slug":"删除会话分组数据","link":"#删除会话分组数据","children":[]},{"level":2,"title":"创建或更新会话标记数据","slug":"创建或更新会话标记数据","link":"#创建或更新会话标记数据","children":[]},{"level":2,"title":"搜索会话分组标记","slug":"搜索会话分组标记","link":"#搜索会话分组标记","children":[]},{"level":2,"title":"拉取会话分组标记数据","slug":"拉取会话分组标记数据","link":"#拉取会话分组标记数据","children":[]}],"git":{"updatedTime":1684979652000,"contributors":[{"name":"Yang Libin","email":"szuyanglb@outlook.com","commits":3,"url":"https://github.com/Yang Libin"},{"name":"hongyiheng","email":"hongyihengg@gmail.com","commits":1,"url":"https://github.com/hongyiheng"}]},"filePathRelative":"guide/recent_contact.md"}');export{u as comp,i as data};
diff --git a/assets/robot.html-t6RgkL27.js b/assets/robot.html-t6RgkL27.js
new file mode 100644
index 00000000..f556fcc8
--- /dev/null
+++ b/assets/robot.html-t6RgkL27.js
@@ -0,0 +1,14 @@
+import{_ as s,c as a,e as t,o as e}from"./app-DZZ4xOJ4.js";const p={};function l(o,n){return e(),a("div",null,n[0]||(n[0]=[t(`本接口用于创建一个机器人账号,机器人是一种特殊账号,userid 必须以 @RBT#
开头,创建机器人时可以指定设置昵称、头像和签名。
说明
同一个机器人账号 userid 重复创建仅会创建 1 个机器人。 每个 IM 账号只能创建最多 20 个机器人账号。 使用示例:
CreateRobotRequest request = new CreateRobotRequest ( ) ;
+request. setNick ( "bingo" ) ;
+request. setFaceUrl ( "https://avatars.githubusercontent.com/u/2784452?v=4" ) ;
+request. setSelfSignature ( "hah" ) ;
+request. setUserId ( "@RBT#1233232" ) ;
+
+CreateRobotResult result = client. robot. createRobot ( request) ;
+
本接口用于将一个机器人账号设置为无效,机器人是一种特殊账号,userid 必须以 @RBT#
开头。
说明
本接口将一个机器人账号设置为无效。 机器人账号 UserID 本身不会被删除。 使用示例:
DeleteRobotRequest request = DeleteRobotRequest . builder ( ) . robotAccount ( "@RBT#1233232" ) . build ( ) ;
+
+DeleteRobotResult result = client. robot. deleteRobot ( request) ;
+
本接口用于拉取所有的机器人账号列表,机器人是一种特殊账号,userid 必须以 @RBT#
开头。
使用示例:
GetAllRobotsRequest request = new GetAllRobotsRequest ( ) ;
+
+GetAllRobotsResult result = client. robot. getAllRobots ( request) ;
+
`,15)]))}const i=s(p,[["render",l],["__file","robot.html.vue"]]),u=JSON.parse('{"path":"/guide/robot.html","title":"机器人","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"创建机器人","slug":"创建机器人","link":"#创建机器人","children":[]},{"level":2,"title":"删除机器人","slug":"删除机器人","link":"#删除机器人","children":[]},{"level":2,"title":"拉取所有机器人","slug":"拉取所有机器人","link":"#拉取所有机器人","children":[]}],"git":{"updatedTime":1690371416000,"contributors":[{"name":"Yang Libin","email":"szuyanglb@outlook.com","commits":1,"url":"https://github.com/Yang Libin"}]},"filePathRelative":"guide/robot.md"}');export{i as comp,u as data};
diff --git a/assets/setupDevtools-7MC2TMWH-Dzf6GPbz.js b/assets/setupDevtools-7MC2TMWH-Dzf6GPbz.js
new file mode 100644
index 00000000..3f6ca519
--- /dev/null
+++ b/assets/setupDevtools-7MC2TMWH-Dzf6GPbz.js
@@ -0,0 +1 @@
+import{s as T,w as E}from"./app-DZZ4xOJ4.js";var l="org.vuejs.vuepress",v="VuePress",I=v,r=l,N=v,i="client-data",a="Client Data",g=(p,n)=>{T({app:p,id:l,label:v,packageName:"@vuepress/client",homepage:"https://vuepress.vuejs.org",logo:"https://vuepress.vuejs.org/images/hero.png",componentStateTypes:[I]},t=>{const c=Object.entries(n),u=Object.keys(n),d=Object.values(n);t.on.inspectComponent(e=>{e.instanceData.state.push(...c.map(([s,o])=>({type:I,editable:!1,key:s,value:o.value})))}),t.addInspector({id:r,label:N,icon:"article"}),t.on.getInspectorTree(e=>{e.inspectorId===r&&(e.rootNodes=[{id:i,label:a,children:u.map(s=>({id:s,label:s}))}])}),t.on.getInspectorState(e=>{e.inspectorId===r&&(e.nodeId===i&&(e.state={[a]:c.map(([s,o])=>({key:s,value:o.value}))}),u.includes(e.nodeId)&&(e.state={[a]:[{key:e.nodeId,value:n[e.nodeId].value}]}))}),E(d,()=>{t.notifyComponentUpdate(),t.sendInspectorState(r)})})};export{g as setupDevtools};
diff --git a/assets/sns.html-CLlw_7qx.js b/assets/sns.html-CLlw_7qx.js
new file mode 100644
index 00000000..4d565ed5
--- /dev/null
+++ b/assets/sns.html-CLlw_7qx.js
@@ -0,0 +1,137 @@
+import{_ as s,c as a,e as t,o as p}from"./app-DZZ4xOJ4.js";const e={};function c(l,n){return p(),a("div",null,n[0]||(n[0]=[t(`添加好友,支持批量添加好友。
使用示例:
AddFriendItem addFriendItem = AddFriendItem . builder ( )
+ . toAccount ( "test2" )
+ . addSource ( "AddSource_Type_XXXXXXXX" )
+ . remark ( "Mr.A" )
+ . groupName ( "schoolmate" )
+ . addWording ( "Hi" )
+ . build ( ) ;
+List < AddFriendItem > addFriendItemList = Collections . singletonList ( addFriendItem) ;
+FriendAddRequest request = FriendAddRequest . builder ( )
+ . fromAccount ( "test1" )
+ . addFriendItemList ( addFriendItemList)
+ . addType ( AddType . BOTH )
+ . forceAddFlags ( ForceAddFlags . FORCE )
+ . build ( ) ;
+
+FriendAddResult result = client. sns. friendAdd ( request) ;
+
支持批量导入单向好友。 往同一个用户导入好友时建议采用批量导入的方式,避免并发写导致的写冲突。 使用示例:
ImportFriendItem importFriendItem = ImportFriendItem . builder ( )
+ . toAccount ( "test2" )
+ . addSource ( "AddSource_Type_XXXXXXXX" )
+ . build ( ) ;
+List < ImportFriendItem > importFriendItems = Collections . singletonList ( importFriendItem) ;
+FriendImportRequest request = FriendImportRequest . builder ( )
+ . fromAccount ( "test1" )
+ . importFriendItemList ( importFriendItems)
+ . build ( ) ;
+
+FriendImportResult result = client. sns. friendImport ( request) ;
+
支持批量更新同一用户的多个好友的关系链数据。 更新一个用户多个好友时,建议采用批量方式,避免并发写导致的写冲突。 使用示例:
SnsItem snsItem = SnsItem . builder ( )
+ . tag ( "Tag_SNS_Custom_testTag" )
+ . value ( TagSns . IM_ADD_WORDING )
+ . build ( ) ;
+List < SnsItem > snsItems = Collections . singletonList ( snsItem) ;
+UpdateItem updateItem = UpdateItem . builder ( )
+ . toAccount ( "test2" )
+ . snsItemList ( snsItems)
+ . build ( ) ;
+List < UpdateItem > updateItems = Collections . singletonList ( updateItem) ;
+FriendUpdateRequest request = FriendUpdateRequest . builder ( )
+ . fromAccount ( "test1" )
+ . updateItemList ( updateItems)
+ . build ( ) ;
+
+FriendUpdateResult result = client. sns. friendUpdate ( request) ;
+
删除好友,支持单向删除好友和双向删除好友。
使用示例:
List < String > toAccount = Collections . singletonList ( "test2" ) ;
+FriendDeleteRequest request = FriendDeleteRequest . builder ( )
+ . deleteType ( DeleteType . BOTH )
+ . fromAccount ( "test1" )
+ . toAccount ( toAccount)
+ . build ( ) ;
+
+FriendDeleteResult result = client. sns. friendDelete ( request) ;
+
清除指定用户的标配好友数据和自定义好友数据。
使用示例:
FriendDeleteAllRequest request = FriendDeleteAllRequest . builder ( )
+ . deleteType ( DeleteType . BOTH )
+ . fromAccount ( "test1" )
+ . build ( ) ;
+
+FriendDeleteAllResult result = client. sns. friendDeleteAll ( request) ;
+
支持批量校验好友关系。
使用示例:
List < String > toAccount = Collections . singletonList ( "test2" ) ;
+FriendCheckRequest request = FriendCheckRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( toAccount)
+ . checkType ( CheckResultType . BOTH )
+ . build ( ) ;
+
+FriendCheckResult result = client. sns. friendCheck ( request) ;
+
分页拉取全量好友数据。 不支持资料数据的拉取。 不需要指定请求拉取的字段,默认返回全量的标配好友数据和自定义好友数据。 使用示例:
FriendGetRequest request = FriendGetRequest . builder ( )
+ . fromAccount ( "test1" )
+ . startIndex ( 0 )
+ . standardSequence ( 0 )
+ . customSequence ( 0 )
+ . build ( ) ;
+
+FriendGetResult result = client. sns. friendGet ( request) ;
+
支持拉取指定好友的好友数据和资料数据。 建议每次拉取的好友数不超过 100,避免因数据量太大导致回包失败。 使用示例:
List < String > toAccount = Collections . singletonList ( "test2" ) ;
+List < String > tagList = Arrays . asList ( TagProfile . IM_ADMIN_FORBID_TYPE , TagProfile . IM_ALLOW_TYPE ) ;
+FriendGetListRequest request = FriendGetListRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( toAccount)
+ . tagList ( tagList)
+ . build ( ) ;
+
+FriendGetListResult result = client. sns. friendGetList ( request) ;
+
添加黑名单,支持批量添加黑名单。
注意
如果用户 A 与用户 B 之间存在好友关系,拉黑时会解除双向好友关系。 如果用户 A 与用户 B 之间存在黑名单关系,二者之间无法发起加好友请求。 如果用户 A 的黑名单中有用户 B 且用户 B 的黑名单中有用户 A,二者之间无法发起会话。 如果用户 A 的黑名单中有用户 B 但用户 B 的黑名单中没有用户 A,那么用户 A 可以给用户 B 发消息,用户 B 不能给用户 A 发消息。 使用示例:
List < String > toAccount = Collections . singletonList ( "test2" ) ;
+BlackListAddRequest request = BlackListAddRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( toAccount)
+ . build ( ) ;
+
+BlackListAddResult result = client. sns. blackListAdd ( request) ;
+
删除指定黑名单。
使用示例:
List < String > toAccount = Collections . singletonList ( "test2" ) ;
+BlackListDeleteRequest request = BlackListDeleteRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( toAccount)
+ . build ( ) ;
+
+BlackListDeleteResult result = client. sns. blackListDelete ( request) ;
+
支持分页拉取所有黑名单。
使用示例:
BlackListGetRequest request = BlackListGetRequest . builder ( )
+ . fromAccount ( "test1" )
+ . startIndex ( 0 )
+ . maxLimited ( 10 )
+ . lastSequence ( 0 )
+ . build ( ) ;
+
+BlackListGetResult result = client. sns. blackListGet ( request) ;
+
支持批量校验黑名单。
使用示例:
List < String > toAccount = Collections . singletonList ( "test2" ) ;
+BlackListCheckRequest request = BlackListCheckRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( toAccount)
+ . checkType ( BlackCheckResultType . BOTH )
+ . build ( ) ;
+
+BlackListCheckResult result = client. sns. blackListCheck ( request) ;
+
添加分组,支持批量添加分组,并将指定好友加入到新增分组中。
使用示例:
List < String > groupName = Collections . singletonList ( "classmate" ) ;
+List < String > toAccount = Collections . singletonList ( "test2" ) ;
+GroupAddRequest request = GroupAddRequest . builder ( )
+ . fromAccount ( "test1" )
+ . groupName ( groupName)
+ . toAccount ( toAccount)
+ . build ( ) ;
+
+GroupAddResult result = client. sns. groupAdd ( request) ;
+
删除指定分组。
使用示例:
List < String > groupName = Collections . singletonList ( "classmate" ) ;
+GroupDeleteRequest request = GroupDeleteRequest . builder ( )
+ . fromAccount ( "test1" )
+ . groupName ( groupName)
+ . build ( ) ;
+
+GroupDeleteResult result = client. sns. groupDelete ( request) ;
+
拉取分组,支持指定分组以及拉取分组下的好友列表。
使用示例:
List < String > groupName = Collections . singletonList ( "classmate" ) ;
+GroupGetRequest request = GroupGetRequest . builder ( )
+ . fromAccount ( "test1" )
+ . groupName ( groupName)
+ . needFriend ( NeedFriendType . YES )
+ . build ( ) ;
+
+GroupGetResult result = client. sns. groupGet ( request) ;
+
`,62)]))}const i=s(e,[["render",c],["__file","sns.html.vue"]]),u=JSON.parse('{"path":"/guide/sns.html","title":"关系链管理","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"添加好友","slug":"添加好友","link":"#添加好友","children":[]},{"level":2,"title":"导入好友","slug":"导入好友","link":"#导入好友","children":[]},{"level":2,"title":"更新好友","slug":"更新好友","link":"#更新好友","children":[]},{"level":2,"title":"删除好友","slug":"删除好友","link":"#删除好友","children":[]},{"level":2,"title":"删除所有好友","slug":"删除所有好友","link":"#删除所有好友","children":[]},{"level":2,"title":"校验好友","slug":"校验好友","link":"#校验好友","children":[]},{"level":2,"title":"拉取好友","slug":"拉取好友","link":"#拉取好友","children":[]},{"level":2,"title":"拉取指定好友","slug":"拉取指定好友","link":"#拉取指定好友","children":[]},{"level":2,"title":"添加黑名单","slug":"添加黑名单","link":"#添加黑名单","children":[]},{"level":2,"title":"删除黑名单","slug":"删除黑名单","link":"#删除黑名单","children":[]},{"level":2,"title":"拉取黑名单","slug":"拉取黑名单","link":"#拉取黑名单","children":[]},{"level":2,"title":"校验黑名单","slug":"校验黑名单","link":"#校验黑名单","children":[]},{"level":2,"title":"添加分组","slug":"添加分组","link":"#添加分组","children":[]},{"level":2,"title":"删除分组","slug":"删除分组","link":"#删除分组","children":[]},{"level":2,"title":"拉取分组","slug":"拉取分组","link":"#拉取分组","children":[]}],"git":{"updatedTime":1643080656000,"contributors":[{"name":"Yang Libin","email":"szuyanglb@outlook.com","commits":4,"url":"https://github.com/Yang Libin"},{"name":"怡蘅","email":"hongyihengg@gmail.com","commits":1,"url":"https://github.com/怡蘅"},{"name":"hongyiheng","email":"hongyihengg@gmail.com","commits":1,"url":"https://github.com/hongyiheng"}]},"filePathRelative":"guide/sns.md"}');export{i as comp,u as data};
diff --git a/assets/style-DC-5J3SW.css b/assets/style-DC-5J3SW.css
new file mode 100644
index 00000000..b12758ba
--- /dev/null
+++ b/assets/style-DC-5J3SW.css
@@ -0,0 +1 @@
+.vp-back-to-top-button{position:fixed!important;inset-inline-end:1rem;bottom:4rem;z-index:100;width:48px;height:48px;padding:12px;border-width:0;border-radius:50%;background:var(--back-to-top-c-bg);color:var(--back-to-top-c-accent-bg);box-shadow:2px 2px 10px 4px var(--back-to-top-c-shadow);cursor:pointer}@media (max-width: 959px){.vp-back-to-top-button{transform:scale(.8);transform-origin:100% 100%}}@media print{.vp-back-to-top-button{display:none}}.vp-back-to-top-button:hover{color:var(--back-to-top-c-accent-hover)}.vp-back-to-top-button .back-to-top-icon{overflow:hidden;width:24px;height:24px;margin:0 auto;background:var(--back-to-top-c-icon);-webkit-mask-image:var(--back-to-top-icon);mask-image:var(--back-to-top-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:cover;mask-size:cover}.vp-scroll-progress{position:absolute;right:-2px;bottom:-2px;width:52px;height:52px}.vp-scroll-progress svg{width:100%;height:100%}.vp-scroll-progress circle{opacity:.9;transform:rotate(-90deg);transform-origin:50% 50%}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .3s}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0}:root{--back-to-top-z-index: 5;--back-to-top-icon: url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2048%2048'%3e%3cpath%20fill='none'%20stroke='currentColor'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='4'%20d='M24.008%2014.1V42M12%2026l12-12l12%2012M12%206h24'%20/%3e%3c/svg%3e");--back-to-top-c-bg: var(--vp-c-bg);--back-to-top-c-accent-bg: var(--vp-c-accent-bg);--back-to-top-c-accent-hover: var(--vp-c-accent-hover);--back-to-top-c-shadow: var(--vp-c-shadow);--back-to-top-c-icon: currentcolor}.vp-copy-code-button{position:absolute;top:.5em;right:.5em;z-index:5;width:2.5rem;height:2.5rem;padding:0;border-width:0;border-radius:.5rem;background:#0000;outline:none;opacity:0;cursor:pointer;transition:opacity .4s}@media print{.vp-copy-code-button{display:none}}.vp-copy-code-button:before{content:"";display:inline-block;width:1.25rem;height:1.25rem;padding:.625rem;background:currentcolor;color:var(--copy-code-c-text);font-size:1.25rem;-webkit-mask-image:var(--code-copy-icon);mask-image:var(--code-copy-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.vp-copy-code-button:focus,.vp-copy-code-button.copied{opacity:1}.vp-copy-code-button:hover,.vp-copy-code-button.copied{background:var(--copy-code-c-hover)}.vp-copy-code-button.copied:before{-webkit-mask-image:var(--code-copied-icon);mask-image:var(--code-copied-icon)}.vp-copy-code-button.copied:after{content:attr(data-copied);position:absolute;top:0;right:calc(100% + .25rem);display:block;height:1.25rem;padding:.625rem;border-radius:.5rem;background:var(--copy-code-c-hover);color:var(--copy-code-c-text);font-weight:500;line-height:1.25rem;white-space:nowrap}.no-copy-code .vp-copy-code-button{display:none}body:not(.no-copy-code) div[class*=language-]:hover:before{display:none}body:not(.no-copy-code) div[class*=language-]:hover .vp-copy-code-button{opacity:1}:root{--code-copy-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2'%3e%3cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2' /%3e%3c/svg%3e");--code-copied-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2'%3e%3cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4' /%3e%3c/svg%3e");--copy-code-c-text: var(--code-c-line-number);--copy-code-c-hover: var(--code-c-highlight-bg)}.hint-container{position:relative;background:var(--hint-c-soft);transition:background var(--vp-t-color),color var(--vp-t-color)}@media print{.hint-container{page-break-inside:avoid}}.hint-container>.hint-container-title{color:var(--hint-c-title)}.hint-container :not(pre)>code{background:var(--hint-c-soft)}.hint-container .hint-container-title{position:relative;margin-block:.75em;font-weight:600;line-height:1.25}.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning,.hint-container.caution{margin-block:.75rem;padding:.25em 1em;border-radius:.5em;color:inherit;font-size:var(--hint-font-size)}@media print{.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning,.hint-container.caution{border-inline-start-width:.25em;border-inline-start-style:solid}}.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title,.hint-container.caution .hint-container-title{padding-inline-start:1.75em}@media print{.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title,.hint-container.caution .hint-container-title{padding-inline-start:0}}.hint-container.important .hint-container-title:before,.hint-container.info .hint-container-title:before,.hint-container.note .hint-container-title:before,.hint-container.tip .hint-container-title:before,.hint-container.warning .hint-container-title:before,.hint-container.caution .hint-container-title:before{content:" ";position:absolute;inset-inline-start:0;top:calc(50% - .6125em);width:1.25em;height:1.25em;font-size:1.25em}@media print{.hint-container.important .hint-container-title:before,.hint-container.info .hint-container-title:before,.hint-container.note .hint-container-title:before,.hint-container.tip .hint-container-title:before,.hint-container.warning .hint-container-title:before,.hint-container.caution .hint-container-title:before{display:none}}.hint-container.important p,.hint-container.info p,.hint-container.note p,.hint-container.tip p,.hint-container.warning p,.hint-container.caution p{line-height:1.5}.hint-container.important a,.hint-container.info a,.hint-container.note a,.hint-container.tip a,.hint-container.warning a,.hint-container.caution a{color:var(--vp-c-accent)}.hint-container.important{--hint-c-accent: var(--important-c-accent);--hint-c-title: var(--important-c-text);--hint-c-soft: var(--important-c-soft)}.hint-container.important>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M512 981.333a84.992 84.992 0 0 1-84.907-84.906h169.814A84.992 84.992 0 0 1 512 981.333zm384-128H128v-42.666l85.333-85.334v-256A298.325 298.325 0 0 1 448 177.92V128a64 64 0 0 1 128 0v49.92a298.325 298.325 0 0 1 234.667 291.413v256L896 810.667v42.666zm-426.667-256v85.334h85.334v-85.334h-85.334zm0-256V512h85.334V341.333h-85.334z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M512 981.333a84.992 84.992 0 0 1-84.907-84.906h169.814A84.992 84.992 0 0 1 512 981.333zm384-128H128v-42.666l85.333-85.334v-256A298.325 298.325 0 0 1 448 177.92V128a64 64 0 0 1 128 0v49.92a298.325 298.325 0 0 1 234.667 291.413v256L896 810.667v42.666zm-426.667-256v85.334h85.334v-85.334h-85.334zm0-256V512h85.334V341.333h-85.334z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.info{--hint-c-accent: var(--info-c-accent);--hint-c-title: var(--info-c-text);--hint-c-soft: var(--info-c-soft)}.hint-container.info>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.note{--hint-c-accent: var(--note-c-accent);--hint-c-title: var(--note-c-text);--hint-c-soft: var(--note-c-soft)}.hint-container.note>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.tip{--hint-c-accent: var(--tip-c-accent);--hint-c-title: var(--tip-c-text);--hint-c-soft: var(--tip-c-soft)}.hint-container.tip>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.warning{--hint-c-accent: var(--warning-c-accent);--hint-c-title: var(--warning-c-text);--hint-c-soft: var(--warning-c-soft)}.hint-container.warning>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Cpath d='M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.caution{--hint-c-accent: var(--caution-c-accent);--hint-c-title: var(--caution-c-text);--hint-c-soft: var(--caution-c-soft)}.hint-container.caution>.hint-container-title:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.hint-container.details{position:relative;display:block;margin-block:.75rem;padding:1.25rem 1rem;border-radius:.5rem;background:var(--detail-c-bg);transition:background var(--vp-t-transform),color var(--vp-t-transform)}.hint-container.details h4{margin-top:0}.hint-container.details figure:last-child,.hint-container.details p:last-child{margin-bottom:0;padding-bottom:0}.hint-container.details a{color:var(--vp-c-accent)}.hint-container.details :not(pre)>code{background:var(--detail-c-soft)}.hint-container.details summary{position:relative;margin:-1rem;padding-block:1em;padding-inline:3em 1.5em;list-style:none;font-size:var(--hint-font-size);cursor:pointer}.hint-container.details summary::-webkit-details-marker{display:none}.hint-container.details summary::marker{color:#0000;font-size:0}.hint-container.details summary:before{background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;content:" ";position:absolute;inset-inline-start:.8em;top:calc(50% - .5em);width:1em;height:1em;font-size:1.25rem;line-height:normal;transition:color,var(--vp-t-color),transform var(--vp-t-transform);transform:rotate(90deg)}.hint-container.details[open]>summary{margin-bottom:.5em}.hint-container.details[open]>summary:before{transform:rotate(180deg)}:root{--hint-font-size: .92rem;--important-c-accent: var(--vp-c-purple-bg);--important-c-text: var(--vp-c-purple-text);--important-c-soft: var(--vp-c-purple-soft);--info-c-accent: var(--vp-c-blue-bg);--info-c-text: var(--vp-c-blue-text);--info-c-soft: var(--vp-c-blue-soft);--note-c-accent: var(--vp-c-grey-bg);--note-c-text: var(--vp-c-grey-text);--note-c-soft: var(--vp-c-grey-soft);--tip-c-accent: var(--vp-c-green-bg);--tip-c-text: var(--vp-c-green-text);--tip-c-soft: var(--vp-c-green-soft);--warning-c-accent: var(--vp-c-yellow-bg);--warning-c-text: var(--vp-c-yellow-text);--warning-c-soft: var(--vp-c-yellow-soft);--caution-c-accent: var(--vp-c-red-bg);--caution-c-text: var(--vp-c-red-text);--caution-c-soft: var(--vp-c-red-soft);--detail-c-bg: var(--vp-c-control);--detail-c-icon: var(--vp-c-border);--detail-c-soft: var(--vp-c-grey-soft)}:root{--medium-zoom-z-index: 100;--medium-zoom-c-bg: var(--vp-c-bg-elv, #fff);--medium-zoom-opacity: 1}.medium-zoom-overlay{z-index:var(--medium-zoom-z-index);background-color:var(--medium-zoom-c-bg)!important}.medium-zoom-overlay~img{z-index:calc(var(--medium-zoom-z-index) + 1)}.medium-zoom--opened .medium-zoom-overlay{opacity:var(--medium-zoom-opacity)}:root{--nprogress-c: var(--vp-c-accent);--nprogress-z-index: 1031}#nprogress{pointer-events:none}#nprogress .bar{position:fixed;top:0;left:0;z-index:var(--nprogress-z-index);width:100%;height:2px;background:var(--nprogress-c)}:root{--code-padding-x: 1.25rem;--code-padding-y: 1rem;--code-border-radius: 6px;--code-line-height: 1.6;--code-font-size: 14px;--code-font-family: consolas, monaco, "Andale Mono", "Ubuntu Mono", monospace}div[class*=language-]{position:relative;border-radius:var(--code-border-radius);background-color:var(--code-c-bg)}div[class*=language-]:before{content:attr(data-title);position:absolute;top:.8em;right:1em;z-index:3;color:var(--code-c-text);font-size:.75rem}div[class*=language-] pre{position:relative;z-index:1;overflow-x:auto;margin:0;border-radius:var(--code-border-radius);font-size:var(--code-font-size);font-family:var(--code-font-family);line-height:var(--code-line-height)}div[class*=language-] pre code{display:block;box-sizing:border-box;width:-moz-fit-content;width:fit-content;min-width:100%;padding:var(--code-padding-y) var(--code-padding-x);background-color:#0000!important;color:var(--code-c-text);overflow-wrap:unset;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}:root{--code-c-text: #f8f8f2;--code-c-bg: #2e3440;--code-c-highlight-bg: rgb(51.6454545455, 60.5484848485, 78.3545454545);--code-c-line-number: rgba(248, 248, 242, .67)}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#636f88}.token.punctuation{color:#81a1c1}.namespace{opacity:.7}.token.property,.token.tag,.token.constant,.token.symbol,.token.deleted{color:#81a1c1}.token.number{color:#b48ead}.token.boolean{color:#81a1c1}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#a3be8c}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable{color:#81a1c1}.token.atrule,.token.attr-value,.token.function,.token.class-name{color:#88c0d0}.token.keyword{color:#81a1c1}.token.regex,.token.important{color:#ebcb8b}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}:root{--code-line-number-width: 3rem}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;top:0;left:0;width:var(--code-line-number-width);height:100%;border-right:1px solid var(--code-c-highlight-bg, var(--code-c-text));border-radius:var(--code-border-radius) 0 0 var(--code-border-radius);transition:border var(--vp-t-color)}div[class*=language-].line-numbers-mode pre{vertical-align:middle;margin-left:var(--code-line-number-width)}div[class*=language-].line-numbers-mode code{padding-left:1rem}div[class*=language-].line-numbers-mode .line-numbers{counter-reset:line-number;position:absolute;top:0;width:var(--code-line-number-width);padding-top:var(--code-padding-y);color:var(--code-c-line-number, var(--code-c-text));font-size:var(--code-font-size);line-height:var(--code-line-height);text-align:center}div[class*=language-].line-numbers-mode .line-number{position:relative;z-index:3;font-family:var(--code-font-family);-webkit-user-select:none;-moz-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-number:before{content:counter(line-number);counter-increment:line-number}div[class*=language-] .line.highlighted{display:inline-block;width:100%;margin:0 calc(-1*var(--code-padding-x));padding:0 var(--code-padding-x);background-color:var(--code-c-highlight-bg)}div[class*=language-].has-collapsed-lines.collapsed{overflow-y:hidden;height:calc(var(--vp-collapsed-lines)*var(--code-line-height)*var(--code-font-size) + var(--code-padding-y) + 28px)}div[class*=language-].has-collapsed-lines .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg);position:absolute;right:0;bottom:0;left:0;z-index:4;display:flex;align-items:center;justify-content:center;height:28px;background:linear-gradient(to bottom,transparent 0%,var(--vp-collapsed-lines-bg) 55%,var(--vp-collapsed-lines-bg) 100%);cursor:pointer;transition:--vp-collapsed-lines-bg var(--vp-t-color)}div[class*=language-].has-collapsed-lines .collapsed-lines:hover{--vp-collapsed-lines-bg: rgb(0 0 0 / 10%) !important}div[class*=language-].has-collapsed-lines[data-highlighter=shiki] .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg, var(--shiki-light-bg))}[data-theme=dark] div[class*=language-].has-collapsed-lines[data-highlighter=shiki] .collapsed-lines{--vp-collapsed-lines-bg: var(--code-c-bg, var(--shiki-dark-bg))}div[class*=language-].has-collapsed-lines .collapsed-lines:before{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1em' height='1em' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='m18 12l-6 6l-6-6m12-6l-6 6l-6-6'/%3E%3C/svg%3E");--vp-collapsed-lines-rotate: 0deg;content:"";display:inline-block;width:24px;height:24px;background-color:var(--code-c-text);-webkit-mask-image:var(--icon);mask-image:var(--icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:20px;mask-size:20px;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;pointer-events:none;animation:code-collapsed-lines 1.2s infinite alternate-reverse ease-in-out}div[class*=language-].has-collapsed-lines:not(.collapsed) code{padding-bottom:max(var(--code-padding-y),28px)}div[class*=language-].has-collapsed-lines:not(.collapsed) .collapsed-lines:hover{--vp-collapsed-lines-bg: transparent !important}div[class*=language-].has-collapsed-lines:not(.collapsed) .collapsed-lines:before{--vp-collapsed-lines-rotate: 180deg}@property --vp-collapsed-lines-bg{inherits:false;initial-value:#fff;syntax:""}@keyframes code-collapsed-lines{0%{opacity:.3;transform:translateY(-2px) rotate(var(--vp-collapsed-lines-rotate))}to{opacity:1;transform:translateY(2px) rotate(var(--vp-collapsed-lines-rotate))}}.vp-code-tabs-nav{overflow-x:auto;margin:.75rem 0 -.75rem;padding:0;border-radius:6px 6px 0 0;background:var(--code-tabs-c-bg);list-style:none;white-space:nowrap;transition:background var(--vp-t-color)}@media print{.vp-code-tabs-nav{display:none}}@media (max-width: 419px){.vp-code-tabs-nav{margin-inline:-1.5rem;border-radius:0}}.vp-code-tab-nav{position:relative;min-width:3rem;margin:0;padding:6px 12px;border-width:0;border-radius:6px 6px 0 0;background:#0000;color:var(--code-tabs-c-text);font-weight:600;font-size:.875em;line-height:1.4;cursor:pointer;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-code-tab-nav:hover{background:var(--code-tabs-c-hover)}.vp-code-tab-nav:before,.vp-code-tab-nav:after{content:" ";position:absolute;bottom:0;z-index:1;width:6px;height:6px}.vp-code-tab-nav:before{right:100%}.vp-code-tab-nav:after{left:100%}.vp-code-tab-nav.active{background:var(--code-c-bg, var(--vp-c-bg-alt))}.vp-code-tab-nav.active:before{background:radial-gradient(12px at left top,transparent 50%,var(--code-c-bg) 50%)}.vp-code-tab-nav.active:after{background:radial-gradient(12px at right top,transparent 50%,var(--code-c-bg) 50%)}.vp-code-tab-nav:first-child:before{display:none}[dir=rtl] .vp-code-tab-nav:first-child:before{display:block}[dir=rtl] .vp-code-tab-nav:first-child:after{display:none}.vp-code-tab{display:none}@media print{.vp-code-tab{display:block}}.vp-code-tab.active{display:block}.vp-code-tab div[class*=language-]{border-top-left-radius:0;border-top-right-radius:0}@media (max-width: 419px){.vp-code-tab div[class*=language-]{margin:.75rem -1.5rem;border-radius:0}}.vp-code-tab div[class*=language-].line-numbers-mode:after{border-top-left-radius:0}.vp-code-tab div[class*=language-] pre{border-top-left-radius:0;border-top-right-radius:0}@media (max-width: 419px){.vp-code-tab div[class*=language-] pre{border-radius:0}}@media print{.vp-code-tab div[class*=language-] code{white-space:pre-wrap}}.vp-code-tab-title{display:none;font-weight:500}@media print{.vp-code-tab-title{display:block}}.vp-tabs{margin:1.5rem 0;border:1px solid var(--vp-c-border);border-radius:8px}@media (max-width: 419px){[vp-content]>.vp-tabs{margin-inline:-1.5rem;border:none;border-bottom:1px solid var(--vp-c-border);border-radius:0}}.vp-tabs-nav{overflow-x:auto;margin:0;padding:0;border-radius:.5rem .5rem 0 0;background:var(--tab-c-bg-nav);list-style:none;white-space:nowrap;transition:background var(--vp-t-color)}@media print{.vp-tabs-nav{display:none}}@media (max-width: 419px){.vp-tabs-nav{border-radius:0}}.vp-tab-nav{position:relative;min-width:4rem;margin:0;padding:.5em 1em;border:none;border-radius:.5rem .5rem 0 0;background:#0000;color:var(--tab-c-nav);font-weight:600;font-size:.875em;line-height:1.75;cursor:pointer;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-tab-nav:hover{background:var(--tab-c-bg-nav-hover)}.vp-tab-nav:before,.vp-tab-nav:after{content:" ";position:absolute;bottom:0;z-index:1;width:8px;height:8px}.vp-tab-nav:before{right:100%}.vp-tab-nav:after{left:100%}.vp-tab-nav.active{background:var(--tab-c-bg)}.vp-tab-nav.active:before{background:radial-gradient(16px at left top,transparent 50%,var(--tab-c-bg) 50%)}.vp-tab-nav.active:after{background:radial-gradient(16px at right top,transparent 50%,var(--tab-c-bg) 50%)}.vp-tab-nav:first-child:before{display:none}.vp-tab{display:none;padding:1rem .75rem;border-radius:0 0 .5rem .5rem;background:var(--tab-c-bg);transition:background var(--vp-t-color)}@media print{.vp-tab{display:block;padding:.5rem}}.vp-tab.active{display:block}.vp-tab:nth-child(n+2) .vp-tab-title{border-top:none}.vp-tab-title{display:none;padding:.25rem 0;border-top:1px solid var(--vp-c-border);font-weight:500}@media print{.vp-tab-title{display:block}}:root{--code-tabs-c-text: var(--code-c-text);--code-tabs-c-bg: var(--code-c-highlight-bg);--code-tabs-c-hover: var(--code-c-bg, var(--vp-c-bg-alt));--tab-c-bg: var(--vp-c-bg);--tab-c-nav: var(--vp-c-text);--tab-c-bg-nav: var(--vp-c-grey-bg);--tab-c-bg-nav-hover: var(--vp-c-control-hover)}.vp-badge{display:inline-block;vertical-align:top;height:18px;padding:0 6px;border-radius:3px;background:var(--vp-c-accent-soft);color:var(--vp-c-accent);font-size:14px;line-height:18px;transition:background var(--vp-t-color),color var(--vp-t-color)}.vp-badge+.vp-badge{margin-inline-start:5px}.vp-badge.tip{background:var(--badge-c-tip-bg);color:var(--badge-c-tip-text)}.vp-badge.warning{background:var(--badge-c-warning-bg);color:var(--badge-c-warning-text)}.vp-badge.danger{background:var(--badge-c-danger-bg);color:var(--badge-c-danger-text)}.vp-badge.important{background:var(--badge-c-important-bg);color:var(--badge-c-important-text)}.vp-badge.info{background:var(--badge-c-info-bg);color:var(--badge-c-info-text)}.vp-badge.note{background:var(--badge-c-note-bg);color:var(--badge-c-note-text)}.vp-features{display:flex;flex-wrap:wrap;place-content:stretch space-between;align-items:flex-start;margin-top:2.5rem;padding:1.2rem 0;border-top:1px solid var(--vp-c-gutter);transition:border-color var(--vp-t-color)}@media (max-width: 719px){.vp-features{flex-direction:column}}.vp-feature{flex-grow:1;flex-basis:30%;max-width:30%}@media (max-width: 719px){.vp-feature{max-width:100%;padding:0 2.5rem}}.vp-feature h2{padding-bottom:0;border-bottom:none;font-weight:500;font-size:1.4rem}@media (max-width: 419px){.vp-feature h2{font-size:1.25rem}}.vp-feature p{color:var(--vp-c-text-mute)}.vp-footer{padding:2.5rem;border-top:1px solid var(--vp-c-border);color:var(--vp-c-text-mute);text-align:center;transition:border-color var(--vp-t-color)}.vp-hero{text-align:center}.vp-hero-image{display:block;max-width:100%;max-height:280px;margin:3rem auto 1.5rem}@media (max-width: 419px){.vp-hero-image{max-height:210px;margin:2rem auto 1.2rem}}#main-title{font-size:3rem}@media (max-width: 419px){#main-title{font-size:2rem}}#main-title,.vp-hero-description,.vp-hero-actions{margin:1.8rem auto}@media (max-width: 419px){#main-title,.vp-hero-description,.vp-hero-actions{margin:1.2rem auto}}.vp-hero-actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.vp-hero-description{max-width:35rem;color:var(--vp-c-text-mute);font-size:1.6rem;line-height:1.3}@media (max-width: 419px){.vp-hero-description{font-size:1.2rem}}.vp-hero-action-button{display:inline-block;box-sizing:border-box;padding:.8rem 1.6rem;border:2px solid var(--vp-c-accent-bg);border-radius:4px;background-color:var(--vp-c-bg);color:var(--vp-c-accent);font-size:1.2rem;transition:background-color border-color color var(--vp-t-color)}@media (max-width: 419px){.vp-hero-action-button{padding:.6rem 1.2rem;font-size:1rem}}.vp-hero-action-button:hover{color:var(--vp-c-accent-text)}.vp-hero-action-button.primary{background-color:var(--vp-c-accent-bg);color:var(--vp-c-accent-text)}.vp-hero-action-button.primary:hover{border-color:var(--vp-c-accent-hover);background-color:var(--vp-c-accent-hover)}.vp-home{display:block;max-width:var(--homepage-width);margin:0 auto;padding:var(--navbar-height) 2rem 0}@media (max-width: 419px){.vp-home{padding-right:1.5rem;padding-left:1.5rem}}.vp-home .theme-default-content{margin:0;padding:0}.vp-site-logo{vertical-align:top;height:var(--navbar-line-height);margin-right:var(--navbar-padding-v)}.vp-site-name{position:relative;color:var(--vp-c-text);font-weight:600;font-size:1.3rem}@media screen and (max-width: 719px){.vp-site-name{display:block;overflow:hidden;width:calc(100vw - 11rem);text-overflow:ellipsis;white-space:nowrap}}.vp-dropdown-enter-from,.vp-dropdown-leave-to{height:0!important}.vp-navbar-dropdown-wrapper{cursor:pointer}.vp-navbar-dropdown-wrapper:not(.mobile){height:1.8rem}.vp-navbar-dropdown-wrapper:not(.mobile):hover .vp-navbar-dropdown,.vp-navbar-dropdown-wrapper:not(.mobile).open .vp-navbar-dropdown{display:block!important}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown{overflow:hidden;transition:height .1s ease-out;padding-top:.5rem}.vp-navbar-dropdown-wrapper:not(.mobile) .vp-navbar-dropdown{position:absolute;top:100%;right:0;display:none;overflow-y:auto;box-sizing:border-box;height:auto!important;max-height:calc(100vh - 2.7rem);margin:0;padding:.6rem 0;border:1px solid var(--vp-c-gutter);border-radius:.5rem;background-color:var(--vp-c-bg-elv);text-align:left;white-space:nowrap}.vp-navbar-dropdown-title{display:block;padding:inherit;border:none;background:transparent;color:var(--vp-c-text);font-weight:500;font-size:.9rem;font-family:inherit;line-height:1.4rem;cursor:inherit}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-title{display:none}.vp-navbar-dropdown-title:hover{border-color:transparent}.vp-navbar-dropdown-title-mobile{display:none;padding:inherit;border:none;background:transparent;color:var(--vp-c-text);font-weight:600;font-size:inherit;font-family:inherit;line-height:1.4rem;cursor:inherit}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-title-mobile{display:block}.vp-navbar-dropdown-title-mobile:hover{color:var(--vp-c-accent)}.vp-navbar-dropdown-item{color:inherit;line-height:1.7rem}.vp-navbar-dropdown-item a{position:relative;display:block;margin-bottom:0;padding:0 1.5rem 0 1.25rem;border-bottom:none;font-weight:400;line-height:1.7rem}.vp-navbar-dropdown-item a:hover,.vp-navbar-dropdown-item a.route-link-active{color:var(--vp-c-accent)}.vp-navbar-dropdown-item a.route-link-active:after{content:"";position:absolute;top:calc(50% - 2px);left:9px;width:0;height:0;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:5px solid var(--vp-c-accent)}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-item>a{font-size:15px;line-height:2rem}.vp-navbar-dropdown-subtitle{margin:.45rem 0 0;padding:1rem 0 .45rem;border-top:1px solid var(--vp-c-gutter);font-size:.9rem}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-subtitle{margin-top:0;padding-top:0;padding-bottom:0;border-top:0;font-size:15px;line-height:2rem}.vp-navbar-dropdown-item:first-child .vp-navbar-dropdown-subtitle{margin-top:0;padding-top:0;border-top:0}.vp-navbar-dropdown-subtitle>span{padding:0 1.5rem 0 1.25rem}.vp-navbar-dropdown-subtitle>a{font-weight:inherit}.vp-navbar-dropdown-subtitle>a.route-link-active:after{display:none}.vp-navbar-dropdown-subitem-wrapper{padding:0;list-style:none}.vp-navbar-dropdown-subitem{font-size:.9em}.vp-navbar-dropdown-wrapper.mobile .vp-navbar-dropdown-subitem{padding-left:1rem;font-size:14px}.vp-navbar-items{display:inline-block}@media print{.vp-navbar-items{display:none}}.vp-navbar-items a{display:inline-block;color:inherit;line-height:1.4rem}.vp-navbar-items a:hover,.vp-navbar-items a.route-link-active{color:var(--vp-c-text)}.vp-navbar-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:var(--navbar-line-height)}@media (max-width: 719px){.vp-navbar-item{margin-left:0}}.vp-navbar-item:first-child{margin-left:0}.vp-navbar-item a:hover,.vp-navbar-item a.route-link-active{color:var(--vp-c-accent)}.vp-navbar-item>a:hover,.vp-navbar-item>a.route-link-active{margin-bottom:-2px;border-bottom:2px solid var(--vp-c-accent)}@media (max-width: 719px){.vp-navbar-item>a:hover,.vp-navbar-item>a.route-link-active{margin-bottom:0;border-bottom:none}}.vp-toggle-color-mode-button{display:flex;margin:auto;margin-left:1rem;border:0;background:none;color:var(--vp-c-text);opacity:.8;cursor:pointer}@media print{.vp-toggle-color-mode-button{display:none}}.vp-toggle-color-mode-button:hover{opacity:1}.vp-toggle-color-mode-button .light-icon,.vp-toggle-color-mode-button .dark-icon{width:1.25rem;height:1.25rem}.vp-toggle-sidebar-button{position:absolute;top:.6rem;left:1rem;display:none;padding:.6rem;cursor:pointer}@media screen and (max-width: 719px){.vp-toggle-sidebar-button{display:block}}.vp-toggle-sidebar-button .icon{display:flex;flex-direction:column;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;cursor:inherit}.vp-toggle-sidebar-button .icon span{display:inline-block;width:100%;height:2px;border-radius:2px;background-color:var(--vp-c-text);transition:transform var(--vp-t-transform)}.vp-toggle-sidebar-button .icon span:nth-child(2){margin:6px 0}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(1){transform:rotate(45deg) translate3d(5.5px,5.5px,0)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(2){transform:scale3d(0,1,1)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(3){transform:rotate(-45deg) translate3d(6px,-6px,0)}.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(1),.vp-theme-container.sidebar-open .vp-toggle-sidebar-button .icon span:nth-child(3){transform-origin:center}.vp-navbar{--navbar-line-height: calc( var(--navbar-height) - 2 * var(--navbar-padding-v) );position:fixed;top:0;right:0;left:0;z-index:20;box-sizing:border-box;height:var(--navbar-height);padding:var(--navbar-padding-v) var(--navbar-padding-h);border-bottom:1px solid var(--vp-c-border);background-color:var(--vp-navbar-c-bg);line-height:var(--navbar-line-height);transition:background-color var(--vp-t-color),border-color var(--vp-t-color)}@media screen and (max-width: 719px){.vp-navbar{padding-left:4rem}}.vp-navbar-items-wrapper{position:absolute;top:var(--navbar-padding-v);right:var(--navbar-padding-h);display:flex;box-sizing:border-box;height:var(--navbar-line-height);padding-left:var(--navbar-padding-h);font-size:.9rem;white-space:nowrap}.vp-page-meta{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-page-meta{padding:2rem}}@media (max-width: 419px){.vp-page-meta{padding:1.5rem}}.vp-page-meta{display:flex;flex-wrap:wrap;justify-content:space-between;overflow:auto;padding-top:.75rem;padding-bottom:.75rem}@media print{.vp-page-meta{margin:0!important;padding-right:0!important;padding-left:0!important}}@media (max-width: 719px){.vp-page-meta{display:block}}.vp-page-meta .vp-meta-item{flex-grow:1}.vp-page-meta .vp-meta-item .vp-meta-label{font-weight:500}.vp-page-meta .vp-meta-item .vp-meta-label:not(a){color:var(--vp-c-text-mute)}.vp-page-meta .vp-meta-item .vp-meta-info{color:var(--vp-c-text-mute);font-weight:400}.vp-page-meta .git-info{text-align:end}.vp-page-meta .edit-link{margin-top:.25rem;margin-right:.5rem;margin-bottom:.25rem;font-size:14px}@media print{.vp-page-meta .edit-link{display:none}}.vp-page-meta .edit-link .edit-icon{position:relative;bottom:-.125em;width:1em;height:1em;margin-right:.25em}.vp-page-meta .last-updated,.vp-page-meta .contributors{margin-top:.25rem;margin-bottom:.25rem;font-size:14px}@media (max-width: 719px){.vp-page-meta .last-updated,.vp-page-meta .contributors{font-size:13px;text-align:start}}.vp-page-nav{display:flex;flex-wrap:wrap;max-width:var(--content-width, 740px);min-height:2rem;margin-top:0;margin-right:auto;margin-left:auto;padding:1rem 2rem 0;border-top:1px solid var(--vp-c-gutter);transition:border-top var(--vp-t-color)}@media (max-width: 959px){.vp-page-nav{padding-right:1rem;padding-left:1rem}}@media print{.vp-page-nav{display:none}}.vp-page-nav .route-link{display:inline-block;flex-grow:1;margin:.25rem;padding:.25rem .5rem;border:1px solid var(--vp-c-gutter);border-radius:.25rem}.vp-page-nav .route-link:hover{background:var(--vp-c-control)}.vp-page-nav .route-link .hint{color:var(--vp-c-text-mute);font-size:.875rem;line-height:2}.vp-page-nav .prev{text-align:start}.vp-page-nav .next{text-align:end}.vp-page{display:block;padding-top:var(--navbar-height);padding-bottom:2rem;padding-left:var(--sidebar-width)}@media (max-width: 959px){.vp-page{padding-left:var(--sidebar-width-mobile)}}@media (max-width: 719px){.vp-page{padding-left:0}}.vp-page .theme-default-content{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-page .theme-default-content{padding:2rem}}@media (max-width: 419px){.vp-page .theme-default-content{padding:1.5rem}}.vp-page .theme-default-content{padding-top:0}.vp-sidebar-item{border-left:.25rem solid transparent;color:var(--vp-c-text);cursor:default}.vp-sidebar-item:focus-visible{outline-width:1px;outline-offset:-1px}.vp-sidebar-item.vp-sidebar-heading{box-sizing:border-box;width:100%;margin:0;padding:.35rem 1.5rem .35rem 1.25rem;font-weight:700;font-size:1.1em;transition:color .15s ease}.vp-sidebar-item.vp-sidebar-heading+.vp-sidebar-children{overflow:hidden;transition:height .1s ease-out;margin-bottom:.75rem}.vp-sidebar-item.collapsible{cursor:pointer}.vp-sidebar-item:not(.vp-sidebar-heading){display:inline-block;box-sizing:border-box;width:100%;margin:0;padding:.35rem 1rem .35rem 2rem;font-weight:400;font-size:1em;line-height:1.4}.vp-sidebar-item:not(.vp-sidebar-heading)+.vp-sidebar-children{padding-left:1rem;font-size:.95em}.vp-sidebar-children .vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading){padding:.25rem 1rem .25rem 1.75rem}.vp-sidebar-children .vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading).active{border-left-color:transparent;font-weight:500}a.vp-sidebar-heading+.vp-sidebar-children .vp-sidebar-item:not(.vp-sidebar-heading).active{border-left-color:transparent}.vp-sidebar-item.active:not(p.vp-sidebar-heading){border-left-color:var(--vp-c-accent);color:var(--vp-c-accent);font-weight:600}a.vp-sidebar-item{cursor:pointer}a.vp-sidebar-item:hover{color:var(--vp-c-accent)}.vp-sidebar-items{margin:0;padding:1.5rem 0;list-style-type:none}@media (max-width: 719px){.vp-sidebar-items{padding:1rem 0}}.vp-sidebar-items ul{margin:0;padding:0;list-style-type:none}.vp-sidebar-items a{display:inline-block}.vp-sidebar{position:fixed;top:var(--navbar-height);bottom:0;left:0;z-index:10;overflow-y:auto;box-sizing:border-box;width:var(--sidebar-width);margin:0;border-right:1px solid var(--vp-c-border);background-color:var(--vp-sidebar-c-bg);font-size:16px;transition:transform var(--vp-t-transform),background-color var(--vp-t-color),border-color var(--vp-t-color);scrollbar-color:var(--vp-c-accent-bg) var(--vp-c-gutter);scrollbar-width:thin}@media (max-width: 959px){.vp-sidebar{width:var(--sidebar-width-mobile);font-size:15px}}@media (max-width: 719px){.vp-sidebar{top:0;padding-top:var(--navbar-height);transform:translate(-100%)}}.vp-sidebar::-webkit-scrollbar{width:7px}.vp-sidebar::-webkit-scrollbar-track{background-color:var(--vp-c-gutter)}.vp-sidebar::-webkit-scrollbar-thumb{background-color:var(--vp-c-accent-bg)}.vp-sidebar .vp-navbar-items{display:none;padding:.5rem 0 .75rem;border-bottom:1px solid var(--vp-c-gutter);transition:border-color var(--vp-t-color)}@media (max-width: 719px){.vp-sidebar .vp-navbar-items{display:block}.vp-sidebar .vp-navbar-items .vp-navbar-dropdown-item a.route-link-active:after{top:calc(1rem - 2px)}}.vp-sidebar .vp-navbar-items ul{margin:0;padding:0;list-style-type:none}.vp-sidebar .vp-navbar-items a{font-weight:600}.vp-sidebar .vp-navbar-item{display:block;padding:.5rem 0 .5rem 1.5rem;font-size:1.1em;line-height:1.25rem}.vp-sidebar-mask{position:fixed;top:0;left:0;z-index:9;display:none;width:100vw;height:100vh}.vp-theme-container.no-navbar .vp-sidebar{top:0}@media (max-width: 719px){.vp-theme-container.no-navbar .vp-sidebar{padding-top:0}}.vp-theme-container.no-navbar .vp-page{padding-top:0}.vp-theme-container.no-navbar .theme-default-content h1,.vp-theme-container.no-navbar .theme-default-content h2,.vp-theme-container.no-navbar .theme-default-content h3,.vp-theme-container.no-navbar .theme-default-content h4,.vp-theme-container.no-navbar .theme-default-content h5,.vp-theme-container.no-navbar .theme-default-content h6{margin-top:1.5rem;padding-top:0}.vp-theme-container.no-sidebar .vp-sidebar{display:none}@media (max-width: 719px){.vp-theme-container.no-sidebar .vp-sidebar{display:block}}.vp-theme-container.no-sidebar .vp-page{padding-left:0}@media (max-width: 719px){.vp-theme-container.sidebar-open .vp-sidebar{transform:translate(0)}.vp-theme-container.sidebar-open .vp-sidebar-mask{display:block}}.fade-slide-y-enter-active{transition:all .2s ease}.fade-slide-y-leave-active{transition:all .2s cubic-bezier(1,.5,.8,1)}.fade-slide-y-enter-from,.fade-slide-y-leave-to{opacity:0;transform:translateY(10px)}.vp-theme-container[data-v-67c08c1d]{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-theme-container[data-v-67c08c1d]{padding:2rem}}:root{--vp-c-white: #fff;--vp-c-black: #000;--vp-c-grey-text: #656869;--vp-c-grey-hover: #e4e4e9;--vp-c-grey-bg: #ebebef;--vp-c-grey-soft: rgb(142 150 170 / 14%);--vp-c-indigo-text: #3451b2;--vp-c-indigo-hover: #3a5ccc;--vp-c-indigo-bg: #5672cd;--vp-c-indigo-soft: rgb(100 108 255 / 14%);--vp-c-purple-text: #6f42c1;--vp-c-purple-hover: #7e4cc9;--vp-c-purple-bg: #8e5cd9;--vp-c-purple-soft: rgb(159 122 234 / 14%);--vp-c-blue-text: #2888a7;--vp-c-blue-hover: #2d98ba;--vp-c-blue-bg: #2fa1c5;--vp-c-blue-soft: rgb(27 178 229 / 14%);--vp-c-green-text: #18794e;--vp-c-green-hover: #299764;--vp-c-green-bg: #30a46c;--vp-c-green-soft: rgb(16 185 129 / 14%);--vp-c-yellow-text: #915930;--vp-c-yellow-hover: #946300;--vp-c-yellow-bg: #c28100;--vp-c-yellow-soft: rgb(234 179 8 / 14%);--vp-c-red-text: #b8272c;--vp-c-red-hover: #d5393e;--vp-c-red-bg: #e0575b;--vp-c-red-soft: rgb(244 63 94 / 14%)}[data-theme=dark]{--vp-c-white: #000;--vp-c-black: #fff;--vp-c-grey-text: #939499;--vp-c-grey-hover: #414853;--vp-c-grey-bg: #32363f;--vp-c-grey-soft: rgb(101 117 133 / 16%);--vp-c-indigo-text: #a8b1ff;--vp-c-indigo-hover: #5c73e7;--vp-c-indigo-bg: #3e63dd;--vp-c-indigo-soft: rgb(100 108 255 / 16%);--vp-c-blue-text: #c9e8f2;--vp-c-blue-hover: #a6d9ea;--vp-c-blue-bg: #2785a3;--vp-c-blue-soft: rgb(27 178 229 / 16%);--vp-c-purple-text: #c8abfa;--vp-c-purple-hover: #a879e6;--vp-c-purple-bg: #8e5cd9;--vp-c-purple-soft: rgb(159 122 234 / 16%);--vp-c-green-text: #3dd68c;--vp-c-green-hover: #30a46c;--vp-c-green-bg: #298459;--vp-c-green-soft: rgb(16 185 129 / 16%);--vp-c-yellow-text: #f9b44e;--vp-c-yellow-hover: #da8b17;--vp-c-yellow-bg: #a46a0a;--vp-c-yellow-soft: rgb(234 179 8 / 16%);--vp-c-red-text: #f66f81;--vp-c-red-hover: #f14158;--vp-c-red-bg: #b62a3c;--vp-c-red-soft: rgb(244 63 94 / 16%)}:root{color-scheme:light}[data-theme=dark]{color-scheme:dark}html,body{background:var(--vp-c-bg, #fff);accent-color:var(--vp-c-accent, #299764);transition:background-color var(--vp-t-color)}html{font-size:16px;font-display:optional;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none}@media print{html{font-size:12pt}}html[data-theme=dark]{color-scheme:dark}body{min-height:100vh;margin:0;padding:0;color:var(--vp-c-text, rgb(60, 60, 67));font-size:1rem;font-synthesis:style}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25;overflow-wrap:break-word}h1:focus-visible,h2:focus-visible,h3:focus-visible,h4:focus-visible,h5:focus-visible,h6:focus-visible{outline:none}h1{font-size:2rem}h2{padding-bottom:.3rem;border-bottom:1px solid var(--vp-c-gutter, #e2e2e3);font-size:1.65rem;transition:border-color var(--vp-t-color)}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}p,ul,ol{line-height:1.6;overflow-wrap:break-word}@media print{p,ul,ol{line-height:1.5}}ul,ol{padding-inline-start:1.2em}a{color:var(--vp-c-accent, #299764);font-weight:500;text-decoration:none;overflow-wrap:break-word}a.header-anchor{position:relative;color:inherit;text-decoration:none}a.header-anchor:before{content:"¶";position:absolute;top:.4167em;left:-.75em;display:none;color:var(--vp-c-accent, #299764);font-size:.75em}[dir=rtl] a.header-anchor:before{right:-.75em}a.header-anchor:hover:before{display:block}a.header-anchor:focus-visible{outline:none}a.header-anchor:focus-visible:before{display:block;outline:auto}strong{font-weight:600}blockquote{margin:1rem 0;padding:.25rem 0 .25rem 1rem;border-inline-start:.2rem solid var(--vp-c-border-hard, #b8b8ba);color:var(--vp-c-text-mute, rgba(60, 60, 67, .78));font-size:1rem;overflow-wrap:break-word;transition:border-color var(--vp-t-color),color var(--vp-t-color)}blockquote>p{margin:0}hr{border:0;border-bottom:1px solid var(--vp-c-gutter, #e2e2e3);transition:border-color var(--vp-t-color)}:not(pre)>code{margin:0;padding:3px 6px;border-radius:4px;background:var(--vp-c-grey-soft, rgba(142, 150, 170, .14));font-size:.875em;overflow-wrap:break-word;transition:background-color var(--vp-t-color),color var(--vp-t-color)}p a code{color:var(--vp-c-accent, #299764);font-weight:400}table code{padding:.1rem .4rem}kbd{display:inline-block;min-width:1em;margin-inline:.125rem;padding:.25em;border:1px solid var(--vp-c-border, #c2c2c4);border-radius:.25em;box-shadow:1px 1px 4px 0 var(--vp-c-shadow, rgba(0, 0, 0, .15));line-height:1;letter-spacing:-.1em;text-align:center}table{display:block;overflow-x:auto;margin:1rem 0;border-collapse:collapse}tbody tr:nth-child(odd){background:var(--vp-c-bg-alt, #f6f8fa);transition:background-color var(--vp-t-color)}th,td{padding:.6em 1em;border:1px solid var(--vp-c-border-hard, #d1d4d7);transition:border-color var(--vp-t-color)}pre{text-align:left;direction:ltr;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;overflow-wrap:unset;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}@media print{pre{white-space:pre-wrap}}pre code{padding:0;border-radius:0}@page{margin:2cm;font-size:12pt;size:a4}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}a{color:inherit;font-weight:inherit!important;font-size:inherit!important;text-decoration:underline}a.header-anchor{text-decoration:none}abbr[title]:after{content:" (" attr(title) ")"}pre{border:1px solid #eee;white-space:pre-wrap!important}pre>code{white-space:pre-wrap!important}blockquote{border-inline-start:.2rem solid #ddd;color:inherit}blockquote,pre{orphans:5;widows:5}img,tr,canvas{page-break-inside:avoid}}@media (prefers-reduced-motion: reduce){*,:before,:after{background-attachment:initial!important;scroll-behavior:auto!important;transition-delay:0s!important;transition-duration:0s!important;animation-duration:1ms!important;animation-delay:-1ms!important;animation-iteration-count:1!important}}:root{--vp-c-accent: #299764;--vp-c-accent-bg: #3eaf7c;--vp-c-accent-hover: #4abf8a;--vp-c-accent-text: var(--vp-c-white);--vp-c-accent-soft: rgb(16 185 129 / 14%);--vp-c-bg: #fff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #fff;--vp-c-text: rgb(60 60 67);--vp-c-text-mute: rgb(60 60 67 / 78%);--vp-c-text-subtle: rgb(60 60 67 / 56%);--vp-c-gutter: #e2e2e3;--vp-c-border: #c2c2c4;--vp-c-border-hard: #b8b8ba;--vp-c-shadow: rgb(0 0 0 / 15%);--vp-c-control: rgb(142 150 170 / 10%);--vp-c-control-hover: rgb(142 150 170 / 16%);--vp-c-control-disabled: #eaeaea;--vp-navbar-c-bg: var(--vp-c-bg);--vp-sidebar-c-bg: var(--vp-c-bg);--vp-c-code-tab-title: var(--code-c-text, rgb(255 255 255 / 90%));--vp-c-code-tab-bg: var(--code-bg-color, var(--code-c-bg));--vp-c-code-tab-active: var(--vp-c-accent);--badge-c-tip-text: var(--vp-c-green-text);--badge-c-tip-bg: var(--vp-c-green-soft);--badge-c-warning-text: var(--vp-c-yellow-text);--badge-c-warning-bg: var(--vp-c-yellow-soft);--badge-c-danger-text: var(--vp-c-red-text);--badge-c-danger-bg: var(--vp-c-red-soft);--badge-c-important-text: var(--vp-c-purple-text);--badge-c-important-bg: var(--vp-c-purple-soft);--badge-c-info-text: var(--vp-c-indigo-text);--badge-c-info-bg: var(--vp-c-indigo-soft);--badge-c-note-text: var(--vp-c-grey-text);--badge-c-note-bg: var(--vp-c-grey-soft);--font-family: -apple-system, "BlinkMacSystemFont", "Segoe UI", roboto, oxygen, ubuntu, cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--navbar-height: 3.6rem;--navbar-padding-v: .7rem;--navbar-padding-h: 1.5rem;--sidebar-width: 20rem;--sidebar-width-mobile: calc(var(--sidebar-width) * .82);--content-width: 740px;--homepage-width: 960px;--header-offset: var(--navbar-height);--vp-t-color: .3s ease;--vp-t-transform: .3s ease;--external-link-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0V0z' fill='none'/%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z'/%3E%3C/svg%3E");--external-link-c-icon: var(--vp-c-text-mute)}[data-theme=dark]{--vp-c-accent: #3dd68c;--vp-c-accent-bg: #3aa675;--vp-c-accent-hover: #349469;--vp-c-accent-soft: rgb(16 185 129 / 16%);--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-text: rgb(235 235 245 / 86%);--vp-c-text-mute: rgb(235 235 245 / 60%);--vp-c-text-subtle: rgb(235 235 245 / 38%);--vp-c-gutter: #000;--vp-c-border: #3c3f44;--vp-c-border-hard: #45484e;--vp-c-shadow: rgb(0 0 0 / 30%);--vp-c-control: rgb(101 117 133 / 12%);--vp-c-control-hover: rgb(101 117 133 / 18%);--vp-c-control-disabled: #363636}body{font-family:var(--font-family)}code{font-family:var(--code-font-family)}.theme-default-content h1,.theme-default-content h2,.theme-default-content h3,.theme-default-content h4,.theme-default-content h5,.theme-default-content h6{margin-top:calc(.5rem - var(--header-offset));margin-bottom:0;padding-top:calc(1rem + var(--header-offset))}.theme-default-content h1:first-child,.theme-default-content h2:first-child,.theme-default-content h3:first-child,.theme-default-content h4:first-child,.theme-default-content h5:first-child,.theme-default-content h6:first-child{margin-bottom:1rem}.theme-default-content h1:first-child+p,.theme-default-content h1:first-child+pre,.theme-default-content h1:first-child+.custom-container,.theme-default-content h2:first-child+p,.theme-default-content h2:first-child+pre,.theme-default-content h2:first-child+.custom-container,.theme-default-content h3:first-child+p,.theme-default-content h3:first-child+pre,.theme-default-content h3:first-child+.custom-container,.theme-default-content h4:first-child+p,.theme-default-content h4:first-child+pre,.theme-default-content h4:first-child+.custom-container,.theme-default-content h5:first-child+p,.theme-default-content h5:first-child+pre,.theme-default-content h5:first-child+.custom-container,.theme-default-content h6:first-child+p,.theme-default-content h6:first-child+pre,.theme-default-content h6:first-child+.custom-container{margin-top:2rem}@media (max-width: 419px){.theme-default-content h1{font-size:1.9rem}}.theme-default-content a:not(.header-anchor){text-decoration:underline}.theme-default-content img{max-width:100%}div[class*=language-]{margin:.75rem 0;transition:background-color var(--vp-t-color),color var(--vp-t-color)}@media (max-width: 419px){div[class*=language-]{--code-border-radius: 0;margin:.75rem -1.5rem}}div[class*=language-] .line.diff,div[class*=language-] .line.highlighted{transition:background-color var(--vp-t-color)}.table-of-contents .vp-badge{vertical-align:middle}.arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s}[data-theme=dark] .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z'/%3E%3C/svg%3E")}.arrow.down{transform:rotate(180deg)}.arrow.right{transform:rotate(90deg)}.arrow.left{transform:rotate(-90deg)}.vp-external-link-icon:after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-left:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}.external-link-icon .external-link:after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-left:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}.external-link-icon .theme-default-content a[href*="://"]:not(.no-external-link-icon):after,.external-link-icon .theme-default-content a[target=_blank]:not(.no-external-link-icon):after{content:"";display:inline-block;flex-shrink:0;width:11px;height:11px;margin-top:-1px;margin-left:4px;background:var(--external-link-c-icon);-webkit-mask-image:var(--external-link-icon);mask-image:var(--external-link-icon)}@media screen and (max-width: 719px){.vp-hide-mobile{display:none}}.vp-comment{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width: 959px){.vp-comment{padding:2rem}}@media (max-width: 419px){.vp-comment{padding:1.5rem}}.vp-navbar .DocSearch{transition:background-color var(--vp-t-color)}.vp-navbar .search-box{vertical-align:top;flex:0 0 auto}@media screen and (max-width: 719px){.hint-container{margin-inline:-.75rem}}:root{--search-c-bg: var(--vp-c-bg);--search-c-accent: var(--vp-c-accent);--search-c-text: var(--vp-c-text);--search-c-border: var(--vp-c-gutter);--search-c-item-text: var(--vp-c-text-subtle);--search-c-item-focus: var(--vp-c-bg-alt);--search-input-width: 8rem;--search-result-width: 20rem}.search-box{position:relative;display:inline-block;margin-left:1rem}@media print{.search-box{display:none}}.search-box input{display:inline-block;width:var(--search-input-width);height:2rem;padding:0 .5rem 0 2rem;border:1px solid var(--search-c-border);border-radius:2rem;background:var(--search-c-bg) url("data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='12'%20height='13'%3e%3cg%20stroke-width='2'%20stroke='%23aaa'%20fill='none'%3e%3cpath%20d='M11.29%2011.71l-4-4'/%3e%3ccircle%20cx='5'%20cy='5'%20r='4'/%3e%3c/g%3e%3c/svg%3e") .6rem .5rem no-repeat;background-size:1rem;color:var(--search-c-text);outline:none;font-size:.9rem;line-height:2rem;cursor:text;-webkit-appearance:none;-moz-appearance:none;appearance:none;transition:all ease .3s}@media (max-width: 719px){.search-box input{position:relative;width:0;border-color:#0000;cursor:pointer}}.search-box input:focus{border-color:var(--search-c-accent);cursor:auto}@media (max-width: 719px){.search-box input:focus{left:0;width:10rem;cursor:text}}@media (max-width: 419px){.search-box input:focus{width:8rem}}.search-box .suggestions{position:absolute;top:2rem;right:0;width:var(--search-result-width);padding:.4rem;border:1px solid var(--search-c-border);border-radius:6px;background:var(--search-c-bg);list-style-type:none}@media (max-width: 419px){.search-box .suggestions{right:-.5rem;width:calc(100vw - 4rem)}}.search-box .suggestion{padding:.4rem .6rem;border-radius:4px;line-height:1.4;cursor:pointer}.search-box .suggestion a{color:var(--search-c-item-text);white-space:normal}.search-box .suggestion.focus{background-color:var(--search-c-item-focus)}.search-box .suggestion.focus a{color:var(--search-c-accent)}.search-box .suggestion .page-title{font-weight:600}.search-box .suggestion .page-header{margin-left:.25em;font-size:.9em}
diff --git a/guide/account.html b/guide/account.html
new file mode 100644
index 00000000..58f1503a
--- /dev/null
+++ b/guide/account.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+ 账号管理 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ 本接口用于将 App 自有账号导入即时通信 IM 账号系统,为该账号创建一个对应的内部 ID,使该账号能够使用即时通信 IM 服务。
说明
同一个账号重复导入仅会创建 1 个内部 ID。
使用示例:
AccountImportRequest request = AccountImportRequest . builder ( )
+ . userId ( "admin" )
+ . faceUrl ( "https://avatars.githubusercontent.com/u/43716716?s=200&v=4" )
+ . nick ( "doocs" )
+ . build ( ) ;
+
+AccountImportResult result = client. account. accountImport ( request) ;
+
本接口用于批量将 App 自有账号导入即时通信 IM 账号系统,为该账号创建一个对应的内部 ID,使该账号能够使用即时通信 IM 服务。
注意: 本接口单次最多支持导入 100 个账号,且不支持导入账号的昵称和头像信息。请使用 资料管理-设置资料 设置其他信息。
使用示例:
List < String > accounts = new ArrayList < > ( ) ;
+accounts. add ( "user1" ) ;
+accounts. add ( "user2" ) ;
+MultiAccountImportRequest request = new MultiAccountImportRequest ( accounts) ;
+
+MultiAccountImportResult result = client. account. multiAccountImport ( request) ;
+
仅支持删除套餐包类型为 IM 体验版的账号,其他类型的账号(如:TRTC、白板、专业版、旗舰版)无法删除。 账号删除时,该用户的关系链、资料等数据也会被删除 账号删除后,该用户的数据将无法恢复 ,请谨慎使用该接口。 使用示例:
AccountDeleteItem item1 = AccountDeleteItem . builder ( ) . userId ( "user1" ) . build ( ) ;
+AccountDeleteItem item2 = AccountDeleteItem . builder ( ) . userId ( "user2" ) . build ( ) ;
+List < AccountDeleteItem > deleteItems = Arrays . asList ( item1, item2) ;
+AccountDeleteRequest request = new AccountDeleteRequest ( deleteItems) ;
+
+AccountDeleteResult result = client. account. accountDelete ( request) ;
+
用于查询自有账号是否已导入即时通信 IM, 支持批量查询。
使用示例:
AccountCheckItem item1 = new AccountCheckItem ( "user1" ) ;
+AccountCheckItem item2 = new AccountCheckItem ( "user2" ) ;
+List < AccountCheckItem > checkItems = Arrays . asList ( item1, item2) ;
+AccountCheckRequest request = new AccountCheckRequest ( checkItems) ;
+
+AccountCheckResult result = client. account. accountCheck ( request) ;
+
本接口适用于将 App 用户账号的登录状态(例如 UserSig)失效。
例如,开发者判断一个用户为恶意账号后,可以调用本接口将该用户当前的登录状态失效,这样用户使用历史 UserSig 登录即时通信 IM 会失败。
注意
支持一次失效一个账号,用户可以使用重新生成的 UserSig 登录即时通信 IM
使用示例:
KickRequest request = new KickRequest ( "user2" ) ;
+
+KickResult result = client. account. kick ( request) ;
+
获取用户当前的登录状态。
使用示例:
List < String > toAccount = Arrays . asList ( "user1" , "user2" ) ;
+QueryOnlineStatusRequest request = QueryOnlineStatusRequest . builder ( )
+ . toAccount ( toAccount)
+ . isNeedDetail ( IsNeedDetail . YES )
+ . build ( ) ;
+
+QueryOnlineStatusResult result = client. account. queryOnlineStatus ( request) ;
+
Prev
快速上手
Next
单聊消息
+
+
+
diff --git a/guide/audit.html b/guide/audit.html
new file mode 100644
index 00000000..cd5287a7
--- /dev/null
+++ b/guide/audit.html
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+ 内容审核 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ 开启本地审核后,在 App 后台可以主动调用 REST API 接口,增删改查本地审核相关词库。
使用示例:
LocalAuditWord word = new LocalAuditWord ( ) ;
+word. setFilterType ( AuditFilterType . REPLACE ) ;
+word. setWordType ( AuditWordType . SENSITIVE_WORDS ) ;
+word. setKeyword ( "caonima" ) ;
+word. setReplacedContent ( "****" ) ;
+AddLocalAuditKeywordsRequest request = AddLocalAuditKeywordsRequest . builder ( )
+ . sdkAppId ( 1400594307 )
+ . localAuditWords ( Collections . singletonList ( word) ) . build ( ) ;
+
+AddLocalAuditKeywordsResult result = client. audit. addLocalAuditKeywords ( request) ;
+
开启本地审核后,在 App 后台可以主动调用 REST API 接口,增删改查本地审核相关词库。
使用示例:
DeleteLocalAuditKeywordsRequest request = new DeleteLocalAuditKeywordsRequest ( ) ;
+request. setSdkAppId ( 1400594307 ) ;
+LocalAuditWord word = new LocalAuditWord ( ) ;
+word. setId ( 1L ) ;
+word. setReplacedContent ( "****" ) ;
+word. setKeyword ( "caonima" ) ;
+word. setWordType ( AuditWordType . SENSITIVE_WORDS ) ;
+word. setFilterType ( AuditFilterType . REPLACE ) ;
+request. setLocalAuditWords ( Collections . singletonList ( word) ) ;
+
+DeleteLocalAuditKeywordsResult result = client. audit. deleteLocalAuditKeywords ( request) ;
+
开启本地审核后,在 App 后台可以主动调用 REST API 接口,增删改查本地审核相关词库。
使用示例:
GetLocalAuditKeywordsRequest request = GetLocalAuditKeywordsRequest . builder ( ) . keyword ( "caonima" )
+ . filterType ( AuditFilterType . REPLACE )
+ . limit ( 1 ) . offset ( 0 ) . sdkAppId ( 1400594307 ) . build ( ) ;
+
+GetLocalAuditKeywordsResult result = client. audit. getLocalAuditKeywords ( request) ;
+
开启云端审核后,在 App 后台可以主动调用 REST API 接口,送审音视图文等相关内容,其中图文同步返回机审结果,音视频通过异步回调的形式返回机审结果。
使用示例:
ContentModerationRequest request = ContentModerationRequest . builder ( ) . content ( "122" )
+ . contentType ( AuditContentType . TEXT )
+ . auditName ( AuditNameType . C2C )
+ . build ( ) ;
+
+ContentModerationResult result = client. audit. contentModeration ( request) ;
+
开启云端审核后,在 App 后台可以主动调用 REST API 接口,批量送审图文等相关内容,音视频审核请查看主动审核接口。
使用示例:
BatchContentModerationRequest request = new BatchContentModerationRequest ( ) ;
+request. setAuditName ( AuditNameType . GROUP ) ;
+AuditContentItem item1 = new AuditContentItem ( ) ;
+item1. setContent ( "f*ck uuu" ) ;
+item1. setContentId ( 323245334 ) ;
+item1. setContentType ( AuditContentType . TEXT ) ;
+AuditContentItem item2 = AuditContentItem . builder ( )
+ . contentId ( 435545 )
+ . contentType ( AuditContentType . TEXT )
+ . content ( "cnm" ) . build ( ) ;
+request. setContents ( Arrays . asList ( item1, item2) ) ;
+
+BatchContentModerationResult result = client. audit. batchContentModeration ( request) ;
+
开启云端审核后,在 App 后台可以主动调用 REST API 接口,增删改查云端审核相关词库。
使用示例:
GetCloudAuditKeyWordsIdsRequest request = GetCloudAuditKeyWordsIdsRequest . builder ( )
+ . limit ( 1 )
+ . offset ( 0 )
+ . sdkAppId ( 1400594307 )
+ . build ( ) ;
+
+GetCloudAuditKeywordsIdsResult result = client. audit. getCloudAuditKeywordsIds ( request) ;
+
开启云端审核后,在 App 后台可以主动调用 REST API 接口,增删改查云端审核相关词库。
使用示例:
GetCloudAuditKeyWordsRequest request = GetCloudAuditKeyWordsRequest . builder ( )
+ . libId ( "fd" )
+ . limit ( 1 )
+ . offset ( 0 )
+ . sdkAppId ( 1400594307 )
+ . build ( ) ;
+
+GetCloudAuditKeywordsResult result = client. audit. getCloudAuditKeywords ( request) ;
+
开启云端审核后,在 App 后台可以主动调用 RESTA PI 接口,增删改查云端审核相关词库。
使用示例:
UserKeyword userKeyword = new UserKeyword ( ) ;
+userKeyword. setContent ( "caonima" ) ;
+userKeyword. setLabel ( ContentModerationLabel . COMPOSITE ) ;
+AddCloudAuditKeywordsRequest request = AddCloudAuditKeywordsRequest . builder ( )
+ . sdkAppId ( 1400594307 )
+ . libId ( "fd" )
+ . userKeywords ( Collections . singletonList ( userKeyword) )
+ . build ( ) ;
+
+AddCloudAuditKeywordsResult result = client. audit. addCloudAuditKeywords ( request) ;
+
开启云端审核后,在 App 后台可以主动调用 REST API 接口,增删改查云端审核相关词库。
使用示例:
DeleteCloudAuditKeywordsRequest request = DeleteCloudAuditKeywordsRequest . builder ( )
+ . sdkAppId ( 1400594307 )
+ . libId ( "fd" )
+ . keywords ( Arrays . asList ( "caonima" , "wtf" ) ) . build ( ) ;
+
+DeleteCloudAuditKeywordsResult result = client. audit. deleteCloudAuditKeywords ( request) ;
+
Prev
机器人
Next
公众号管理
+
+
+
diff --git a/guide/group.html b/guide/group.html
new file mode 100644
index 00000000..d86328fe
--- /dev/null
+++ b/guide/group.html
@@ -0,0 +1,400 @@
+
+
+
+
+
+
+
+
+ 群组管理 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ App 管理员可以通过该接口获取 App 中所有群组的 ID。
说明
即时通信 IM 内置多种群组类型,详情请参见 群组系统 。
使用示例:
GetAppIdGroupListRequest request = GetAppIdGroupListRequest . builder ( )
+ . limit ( 10 )
+ . groupType ( GroupType . PUBLIC )
+ . next ( 0 )
+ . build ( ) ;
+
+GetAppIdGroupListResult result = client. group. getAppIdGroupList ( request) ;
+
App 管理员可以通过该接口创建群组。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持,用户(包括群主)使用 AVChatroom(直播群)时必须操作 SDK 主动申请进群 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
CreateGroupRequest request = CreateGroupRequest . builder ( )
+ . type ( GroupType . PUBLIC )
+ . name ( "TestGroup" )
+ . ownerAccount ( "user1" )
+ . groupId ( "MyFirstGroup" )
+ . introduction ( "This is group Introduction" )
+ . notification ( "This is group Notification" )
+ . faceUrl ( "https://avatars.githubusercontent.com/u/43716716?s=200&v=4" )
+ . maxMemberCount ( 500 )
+ . applyJoinOption ( ApplyJoinOption . FREE_ACCESS )
+ . inviteJoinOption ( InviteJoinOption . DISABLE_INVITE )
+ . build ( ) ;
+
+CreateGroupResult result = client. group. createGroup ( request) ;
+
App 管理员可以根据群组 ID 获取群组的详细信息。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
List < String > groupIdList = Collections . singletonList ( "MyFirstGroup" ) ;
+GetGroupInfoRequest request = new GetGroupInfoRequest ( groupIdList) ;
+
+GetGroupInfoResult result = client. group. getGroupInfo ( request) ;
+
App 管理员可以根据群组 ID 获取群组成员的资料。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持,使用 Next 字段分批获取
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
因 Community(社群)人数较多,分页获取方式改用 Next 分批方法。
使用示例:
GetGroupMemberInfoRequest request = GetGroupMemberInfoRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . limit ( 100 )
+ . offset ( 0 )
+ . build ( ) ;
+
+GetGroupMemberInfoResult result = client. group. getGroupMemberInfo ( request) ;
+
App 管理员可根据群组 ID 与群内指定成员 UserID 列表等参数获取指定群组成员的资料。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetSpecifiedGroupMemberInfoRequest request = GetSpecifiedGroupMemberInfoRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . memberInfoFilter ( Collections . singletonList ( "bingo" ) )
+ . build ( ) ;
+
+GetSpecifiedGroupMemberInfoResult result = client. group. getSpecifiedGroupMemberInfo ( request) ;
+
App 管理员可以通过该接口修改指定群组的基础信息。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
ModifyGroupBaseInfoRequest request = ModifyGroupBaseInfoRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . name ( "groupName" )
+ . introduction ( "my first group" )
+ . notification ( "hello world!" )
+ . faceUrl ( "https://avatars.githubusercontent.com/u/43716716?s=200&v=4" )
+ . maxMemberNum ( 500 )
+ . applyJoinOption ( ApplyJoinOption . NEED_PERMISSION )
+ . muteAllMember ( MuteAllMember . OFF )
+ . build ( ) ;
+
+ModifyGroupBaseInfoResult result = client. group. modifyGroupBaseInfo ( request) ;
+
App 管理员可以通过该接口向指定的群中添加新成员。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持增加群成员,对此类型群组进行操作时会返回 10007 错误。用户加入此类型群组的唯一方式是用户申请加群。
使用示例:
MemberRequestItem item = new MemberRequestItem ( "user2" ) ;
+List < MemberRequestItem > memberList = Collections . singletonList ( item) ;
+AddGroupMemberRequest request = AddGroupMemberRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . memberList ( memberList)
+ . silence ( 1 )
+ . build ( ) ;
+
+AddGroupMemberResult result = client. group. addGroupMember ( request) ;
+
App 管理员可以通过该接口删除群成员。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持删除群成员,对这种类型的群组进行操作时会返回 10004 错误。如果管理员希望达到删除群成员的效果,可以通过设置 批量禁言和取消禁言 的方式实现。
使用示例:
List < String > toDelAccount = Collections . singletonList ( "user2" ) ;
+DeleteGroupMemberRequest request = DeleteGroupMemberRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . memberToDelAccount ( toDelAccount)
+ . build ( ) ;
+
+DeleteGroupMemberResult result = client. group. deleteGroupMember ( request) ;
+
App 管理员可以通过该接口修改群成员资料。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不存储群成员资料,所以不能修改成员资料。只能修改管理员和群主的成员资料,修改普通成员资料时会返回 10007 错误。
使用示例:
ModifyGroupMemberInfoRequest request = ModifyGroupMemberInfoRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . memberAccount ( "doocs" )
+ . nameCard ( "hello World!" )
+ . build ( ) ;
+
+ModifyGroupMemberInfoResult result = client. group. modifyGroupMemberInfo ( request) ;
+
App 管理员通过该接口解散群。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
DestroyGroupRequest request = new DestroyGroupRequest ( "MyFirstGroup" ) ;
+
+DestroyGroupResult result = client. group. destroyGroup ( request) ;
+
App 管理员可以通过本接口获取某一用户加入的群信息。默认不获取用户已加入但未激活好友工作群(Work)以及直播群(AVChatRoom)群信息。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群),但默认不返回已加入但未激活的此类型群信息 Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持,但默认不返回此类型群信息。如果指定拉取 AVChatRoom 类型群信息,获得的群信息可能不完整,AVChatRoom 并不存储所有的群成员资料。 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetJoinedGroupListRequest request = new GetJoinedGroupListRequest ( "doocs" ) ;
+
+GetJoinGroupListResult result = client. group. getJoinGroupList ( request) ;
+
App 管理员可以通过该接口获取一批用户在群内的身份,即“成员角色”。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持该接口,对此类型群组进行操作将返回 10007 错误;但可以通过 获取群组成员详细资料 达到查询“成员角色”的效果。
使用示例:
List < String > userAccount = Collections . singletonList ( "doocs" ) ;
+GetRoleInGroupRequest request = GetRoleInGroupRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . userAccount ( userAccount)
+ . build ( ) ;
+
+GetRoleInGroupResult result = client. group. getRoleInGroup ( request) ;
+
App 管理员禁止指定群组中某些用户在一段时间内发言。 App 管理员取消对某些用户的禁言。 被禁言用户退出群组之后再进入同一群组,禁言仍然有效。 说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
Private(即新版本中的 Work,好友工作群)类型不支持禁言。
使用示例:
List < String > membersAccount = Collections . singletonList ( "doocs" ) ;
+ForbidSendMsgRequest request = ForbidSendMsgRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . membersAccount ( membersAccount)
+ . muteTime ( 200L )
+ . build ( ) ;
+
+ForbidSendMsgResult result = client. group. forbidSendMsg ( request) ;
+
App 管理员可以根据群组 ID 获取群组中被禁言的用户列表。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetGroupMutedAccountRequest request = new GetGroupMutedAccountRequest ( "MyFirstGroup" ) ;
+
+GetGroupMutedAccountResult result = client. group. getGroupMutedAccount ( request) ;
+
App 管理员可以通过该接口在群组中发送普通消息。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "red packet" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+SendGroupMsgRequest request = SendGroupMsgRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . random ( 1314 )
+ . msgBody ( msgBody)
+ . onlineOnlyFlag ( OnlineOnlyFlag . YES )
+ . build ( ) ;
+
+SendGroupMsgResult result = client. group. sendGroupMsg ( request) ;
+
App 管理员可以通过该接口在群组中发送系统通知。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持,仅支持面向全员 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
非直播群支持向群组中的一部分指定成员发送系统通知,而 AVChatRoom(直播群)只支持向群组中所有成员发送系统通知。 客户端接收系统通知接口(V2TIMGroupListener.onReceiveRESTCustomData)请参见 Android 、iOS 。 使用示例:
List < String > toMembersAccount = Collections . singletonList ( "doocs" ) ;
+SendGroupSystemNotificationRequest request = SendGroupSystemNotificationRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . content ( "hello world" )
+ . toMembersAccount ( toMembersAccount)
+ . build ( ) ;
+
+SendGroupSystemNotificationResult result = client. group. sendGroupSystemNotification ( request) ;
+
App 管理员可以通过该接口将群主身份转移给他人。 没有群主的群,App 管理员可以通过此接口指定他人作为群主。 新群主必须为群内成员。 说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持(见说明) Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持转让群主,对该类型的群组进行操作时会返回 10007 错误。
使用示例:
ChangeGroupOwnerRequest request = ChangeGroupOwnerRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . newOwnerAccount ( "doocs" )
+ . build ( ) ;
+
+ChangeGroupOwnerResult result = client. group. changeGroupOwner ( request) ;
+
App 管理员通过该接口撤回指定群组的消息,消息需要在漫游有效期以内。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
List < MsgSeqItem > msgSeqList = Collections . singletonList ( new MsgSeqItem ( 0L ) ) ;
+GroupMsgRecallRequest request = GroupMsgRecallRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . msgSeqList ( msgSeqList)
+ . build ( ) ;
+
+GroupMsgRecallResult result = client. group. groupMsgRecall ( request) ;
+
App 管理员可以通过该接口导入群组,不会触发回调、不会下发通知; 当 App 需要从其他即时通信系统迁移到即时通信 IM 时,使用该协议导入存量群组数据。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持导入群基础资料,对此类型的群组进行操作时会返回 10007 错误;如果需要达到导入群组基础资料的效果,可以通过 创建群组 和 修改群基础资料 的方式实现。
使用示例:
ImportGroupRequest request = ImportGroupRequest . builder ( )
+ . type ( GroupType . PUBLIC )
+ . name ( "groupName" )
+ . build ( ) ;
+
+ImportGroupResult result = client. group. importGroup ( request) ;
+
该 API 接口的作用是导入群组的消息,不会触发回调、不会下发通知。 当 App 需要从其他即时通信系统迁移到即时通信 IM 时,使用该协议导入存量群消息数据。 说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持导入群消息,对此类型的群组进行操作时会返回 10007 错误;因为此类型群组所适用的场景不支持查看入群前的历史消息,所以没有提供这一功能。
使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "hello world" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+GroupMsgItem item = GroupMsgItem . builder ( )
+ . fromAccount ( "doocs" )
+ . sendTime ( 1628062005 )
+ . msgBody ( msgBody)
+ . build ( ) ;
+List < GroupMsgItem > msgList = Collections . singletonList ( item) ;
+ImportGroupMsgRequest request = ImportGroupMsgRequest . builder ( )
+ . groupId ( "newGroup" )
+ . msgList ( msgList)
+ . build ( ) ;
+
+ImportGroupMsgResult result = client. group. importGroupMsg ( request) ;
+
该 API 接口的作用是导入群组成员,不会触发回调、不会下发通知。 当 App 需要从其他即时通信系统迁移到即时通信 IM 时,使用该协议导入存量群成员数据。 说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)所适用的场景一般不需要导入成员,因此不支持导入群成员功能,对此类型的群组进行操作时会返回 10007 错误。
使用示例:
MemberItem item = MemberItem . builder ( )
+ . memberAccount ( "doocs" )
+ . joinTime ( 1628062005 )
+ . role ( MemberRole . ADMIN )
+ . unreadMsgNum ( 1 )
+ . build ( ) ;
+List < MemberItem > members = Collections . singletonList ( item) ;
+ImportGroupMemberRequest request = ImportGroupMemberRequest . builder ( )
+ . groupId ( "groupName" )
+ . memberList ( members)
+ . build ( ) ;
+
+ImportGroupMemberResult result = client. group. importGroupMember ( request) ;
+
App 管理员使用该接口设置群组成员未读消息数,不会触发回调、不会下发通知。 当 App 需要从其他即时通信系统迁移到即时通信 IM 时,使用该协议设置群成员的未读消息计数。 说明
该文档仅限迁移用户使用,线上用户不能使用。
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
ChatRoom 和 AVChatroom(直播群)的客户端不支持未读消息计数,所以对这两种类型的群组成员设置未读消息计数是无效的(但是不会返回错误)。
使用示例:
SetUnreadMsgNumRequest result = SetUnreadMsgNumRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . memberAccount ( "doocs" )
+ . unreadMsgNum ( 1 )
+ . build ( ) ;
+
+SetUnreadMsgNumResult result = client. group. setUnreadMsgNum ( request) ;
+
该 API 接口的作用是撤回最近 1000 条消息中指定用户发送的消息。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群)不支持历史消息存储(此处撤回消息指撤回历史消息存储中的消息),对这此类型群组中的用户撤回消息是无效的(但是不会返回错误)。 该接口目前只支持静默撤回,在服务端对该消息打上撤回标记,并不会通知到客户端,只有拉漫游时才知道该消息被撤回。 使用示例:
DeleteGroupMsgBySenderRequest request = DeleteGroupMsgBySenderRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . senderAccount ( "doocs" )
+ . build ( ) ;
+
+DeleteGroupMsgBySenderResult result = client. group. deleteGroupMsgBySender ( request) ;
+
App 管理员可以通过该接口拉取群组的历史消息。
背景说明:
即时通信 IM 的群消息是按 Seq 排序的,按照 server 收到群消息的顺序分配 Seq,先发的群消息 Seq 小,后发的 Seq 大。 如果用户想拉取一个群的全量消息,首次拉取时不用填拉取 Seq,Server 会自动返回最新的消息,以后拉取时拉取 Seq 填上次返回的最小 Seq 减 1。 如果返回消息的 IsPlaceMsg 为 1,表示这个 Seq 的消息或者过期、或者存储失败、或者被删除了。 说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群) AVChatRoom 不支持 Community(社群) 支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
AVChatRoom(直播群) 不支持历史消息存储,所以不支持调用此接口。
使用示例:
GroupMsgGetSimpleRequest request = GroupMsgGetSimpleRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . reqMsgNumber ( 1 )
+ . reqMsgNumber ( 20 )
+ . build ( ) ;
+
+GroupMsgGetSimpleResult result = client. group. groupMsgGetSimple ( request) ;
+
App 管理员可以根据群组 ID 获取直播群在线人数。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
注意
在线人数总体更新粒度为 10s。 当群人数大于等于 300 或群内有 Web 端用户的时候,出现群成员上下线或者进退群的时候,由于当前 10s 周期内已经统计了用户在线状态的原因,会在下一个 10s 周期才会统计到剔除状态用户变更的在线人数,所以会出现调用接口 10s - 20s 才会更新的现象。 当群人数小于 300 人且群内没有 Web 端用户的时候,用户进退群会触发即时更新在线人数。 使用示例:
GetOnlineMemberNumRequest request = new GetOnlineMemberNumRequest ( "MyFirstAVChatRoom" ) ;
+
+GetOnlineMemberNumResult result = client. group. getOnlineMemberNum ( request) ;
+
App 管理员可以根据群组 ID 获取直播群在线列表。
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。 :::
注意
此功能需 旗舰版套餐 ,并且已开通“直播群在线成员列表”功能(控制台“群功能配置”)。 在线列表总体更新粒度为 10s。 当直播群中超过 1000 人时,接口仅返回最新进群并且在线的 1000 人。 当群人数大于等于 300 或群内有 Web 端用户的时候,出现群成员上下线或者进退群的时候,由于当前 10s 周期内已经统计了用户在线状态的原因,会在下一个 10s 周期才会统计到剔除状态用户变更的在线人数,所以会出现调用接口 10s - 20s 才会更新的现象。 当群人数小于 300 人且群内没有 Web 端用户的时候,用户进退群会触发即时更新在线人数。 使用示例:
GetMembersRequest request = GetMembersRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . timestamp ( 0 )
+ . build ( ) ;
+
+GetMembersResult result = client. group. getMembers ( request) ;
+
App 管理员和群主可以对直播群成员设置不同的标记以区分不同类型的群成员。该功能需旗舰版,并且在 IM 控制台“群功能配置”中开通“直播群在线成员列表”功能。其他套餐版本调用该 API 将返回失败。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
ModifyGroupUserInfoRequest request = new ModifyGroupUserInfoRequest ( ) ;
+request. setCommandType ( 1 ) ;
+GroupMemberItem item = new GroupMemberItem ( ) ;
+item. setMarks ( Arrays . asList ( 1001 , 1002 ) ) ;
+item. setMemberAccount ( "test1" ) ;
+request. setMemberList ( Collections . singletonList ( item) ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+
+ModifyGroupUserInfoResult result = client. group. modifyGroupUserInfo ( request) ;
+
App 管理员可以通过该接口获取群自定义属性。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetGroupAttrRequest request = new GetGroupAttrRequest ( "MyFirstGroup" ) ;
+
+GetGroupAttrResult result = client. group. getGroupAttr ( request) ;
+
App 管理员可以通过该接口修改群自定义属性。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GroupAttr groupAttr = new GroupAttr ( ) ;
+groupAttr. setKey ( "isOpen" ) ;
+groupAttr. setValue ( "yes" ) ;
+List < GroupAttr > groupAttrs = Collections . singletonList ( groupAttr) ;
+ModifyGroupAttrRequest request = ModifyGroupAttrRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . groupAttrs ( groupAttrs)
+ . build ( ) ;
+
+ModifyGroupAttrResult result = client. group. modifyGroupAttr ( request) ;
+
App 管理员可以通过该接口清空群自定义属性。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持 Community 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
ClearGroupAttrRequest request = new ClearGroupAttrRequest ( "MyFirstGroup" ) ;
+
+ClearGroupAttrResult result = client. group. clearGroupAttr ( request) ;
+
App 管理员可以通过该接口重置群自定义属性。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持 Public 支持 ChatRoom 支持 AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
SetGroupAttrRequest request = new SetGroupAttrRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+GroupAttr groupAttr = new GroupAttr ( ) ;
+groupAttr. setKey ( "isOpen" ) ;
+groupAttr. setValue ( "yes" ) ;
+List < GroupAttr > groupAttrs = Collections . singletonList ( groupAttr) ;
+request. setGroupAttrs ( groupAttrs) ;
+
+SetGroupAttrResult result = client. group. setGroupAttr ( request) ;
+
管理员修改群聊历史消息 可以单独修改消息中的 MsgBody 或 CloudCustomData 字段,也可以同时修改这两个字段。以请求中指定的字段值覆盖历史消息对应的字段。 不支持修改直播群的历史消息 注意
使用该接口修改消息后,被修改的消息不能恢复,请谨慎调用该接口。
使用示例:
ModifyGroupMsgRequest request = new ModifyGroupMsgRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setMsgSeq ( 123L ) ;
+TIMTextMsgElement msg = new TIMTextMsgElement ( "hello world" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+request. setMsgBody ( msgBody) ;
+request. setMsgBody ( msgBody) ;
+
+ModifyGroupMsgResult result = client. group. modifyGroupMsg ( request) ;
+
App 管理员可以通过该接口向所有直播群下发广播消息。
注意
直播群广播消息功能支持需要终端 SDK 6.5.2803 增强版及以上版本、Web SDK v2.21.0 及以上版本,需 购买旗舰版套餐包 并在 控制台 >群功能配置>群功能配置>直播群广播消息 打开开关后方可使用。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 支持,发给所有直播群 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
SendBroadcastMsgRequest request = new SendBroadcastMsgRequest ( ) ;
+request. setFromAccount ( "test1" ) ;
+TIMTextMsgElement msg = new TIMTextMsgElement ( "hello world" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+request. setMsgBody ( msgBody) ;
+request. setRandom ( 1223L ) ;
+
+SendBroadcastMsgResult result = client. group. sendBroadcastMsg ( request) ;
+
App 管理员可以通过该接口拉取群消息已读回执信息。
注意
该功能仅对旗舰版客户开放,需 购买旗舰版套餐包 并在 控制台 >登录与消息>群消息已读回执 打开开关后方可使用。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 不支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetGroupMsgReceiptRequest request = new GetGroupMsgReceiptRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+MsgSeqItem seqItem = new MsgSeqItem ( ) ;
+seqItem. setMsgSeq ( 123L ) ;
+request. setMsgSeqList ( Collections . singletonList ( seqItem) ) ;
+
+GetGroupMsgReceiptResult result = client. group. getGroupMsgReceipt ( request) ;
+
App 管理员可以通过该接口拉取群消息已读或未读成员列表。
注意
该功能仅对旗舰版客户开放,需 购买旗舰版套餐包 并在 控制台 >登录与消息>群消息已读回执 打开开关后方可使用。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 支持,同新版本中的 Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的 Meeting(临时会议群)) AVChatRoom 不支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetGroupMsgReceiptDetailRequest request = new GetGroupMsgReceiptDetailRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setMsgSeq ( 123L ) ;
+request. setNum ( 12 ) ;
+request. setCursor ( "" ) ;
+request. setFlag ( 12 ) ;
+
+GetGroupMsgReceiptDetailResult result = client. group. getGroupMsgReceiptDetail ( request) ;
+
App 管理员可以通过该接口创建话题。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持 Public 不支持 ChatRoom 不支持 AVChatRoom 不支持 Community(社群) 只有支持话题的社群才适用此 API
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
CreateGroupTopicRequest request = new CreateGroupTopicRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setTopicName ( "test" ) ;
+request. setFaceUrl ( "" ) ;
+
+CreateGroupTopicResult result = client. group. createGroupTopic ( request) ;
+
App 管理员可以通过该接口获取话题资料。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持 Public 不支持 ChatRoom 不支持 AVChatRoom 不支持 Community(社群) 只有支持话题的社群才适用此 API
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetGroupTopicRequest request = new GetGroupTopicRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setFromAccount ( "1400187352" ) ;
+
+GetGroupTopicResult result = client. group. getGroupTopic ( request) ;
+
App 管理员可以通过该接口修改话题资料。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持 Public 不支持 ChatRoom 不支持 AVChatRoom 不支持 Community(社群) 只有支持话题的社群才适用此 API
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
ModifyGroupTopicRequest request = new ModifyGroupTopicRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setTopicName ( "test" ) ;
+request. setFaceUrl ( "" ) ;
+
+ModifyGroupTopicResult result = client. group. modifyGroupTopic ( request) ;
+
App 管理员可以通过该接口导入话题,不会触发回调、不会下发通知;当 App 需要从其他即时通信系统迁移到即时通信 IM 时,使用该协议导入存量话题数据。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持 Public 不支持 ChatRoom 不支持 AVChatRoom 不支持 Community(社群) 只有支持话题的社群才适用此 API
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
ImportGroupTopicRequest request = new ImportGroupTopicRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setTopicName ( "test" ) ;
+request. setFromAccount ( "123" ) ;
+
+ImportGroupTopicResult result = client. group. importGroupTopic ( request) ;
+
App 管理员可以通过该接口解散话题。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持 Public 不支持 ChatRoom 不支持 AVChatRoom 不支持 Community(社群) 只有支持话题的社群才适用此 API
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
DestroyGroupTopicRequest request = new DestroyGroupTopicRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+
+DestroyGroupTopicResult result = client. group. destroyGroupTopic ( request) ;
+
App 管理员可以通过该接口获取对应直播群的封禁成员列表。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
GetGroupBanMemberRequest request = new GetGroupBanMemberRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setLimit ( 10 ) ;
+request. setOffset ( 0 ) ;
+
+GetGroupBanMemberResult result = client. group. getGroupBanMember ( request) ;
+
App 管理员可以通过该接口向直播群封禁成员,封禁后成员无法接收消息,并且封禁时间内无法再次进群。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
BanGroupMemberRequest request = new BanGroupMemberRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setDuration ( 1000L ) ;
+request. setMembersAccount ( Arrays . asList ( "test1" , "bingo" ) ) ;
+request. setDescription ( "test" ) ;
+
+BanGroupMemberResult result = client. group. banGroupMember ( request) ;
+
App 管理员可以通过该接口向直播群解封成员,解封后,之前封禁的成员可重新进群获取消息。
说明
适用的群组类型
群组类型 ID 是否支持此 REST API Private 不支持,同新版本中的 Work(好友工作群) Public 不支持 ChatRoom 不支持,同新版本中的 Meeting(临时会议群) AVChatRoom 支持 Community(社群) 不支持
即时通信 IM 内置上述群组类型,详情介绍请参见 群组系统 。
使用示例:
UnbanGroupMemberRequest request = new UnbanGroupMemberRequest ( ) ;
+request. setGroupId ( "MyFirstGroup" ) ;
+request. setMembersAccount ( Arrays . asList ( "test1" , "bingo" ) ) ;
+
+UnbanGroupMemberResult result = client. group. unbanGroupMember ( request) ;
+
App 管理员和群成员可以拉取消息扩展,消息扩展为一组自定义的键值对。
注意
此功能需 旗舰版套餐,并且已开通“消息扩展功能”功能(控制台“登录与消息”配置)。 单条群消息可设置的最大键值对数量为 300 条。 被设置的群消息需要在发送时指定“支持消息扩展”,参见 在群组中发送普通消息 。 使用示例:
GroupGetKeyValuesRequest request = GroupGetKeyValuesRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . msgSeq ( 1L )
+ . build ( ) ;
+
+GroupGetKeyValuesResult result = client. group. groupGetKeyValues ( request) ;
+
App 管理员和群成员可以为群聊普通消息设置消息扩展,消息扩展为一组自定义的键值对。
注意
此功能需 旗舰版套餐,并且已开通“消息扩展功能”功能(控制台“登录与消息”配置)。 单条群消息可设置的最大键值对数量为 300 条。 被设置的群消息需要在发送时指定“支持消息扩展”,参见 在群组中发送普通消息 。 使用示例:
GroupSetKeyValuesRequest request = GroupSetKeyValuesRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . msgSeq ( 1L )
+ . extensionList ( Collections . singletonList ( KeyValueSeq . builder ( )
+ . key ( "test" )
+ . value ( "test" )
+ . build ( ) ) )
+ . build ( ) ;
+
+GroupSetKeyValuesResult result = client. group. groupSetKeyValues ( request) ;
+
App 管理员可以通过该接口获取群计数器。
使用示例:
GetGroupCounterRequest request = GetGroupCounterRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . build ( ) ;
+
+GetGroupCounterResult result = client. group. getGroupCounter ( request) ;
+
App 管理员可以通过该接口更新(设置、递增、递减)群计数器。
使用示例:
List < GroupCounterItem > groupCounter = new ArrayList < > ( ) ;
+GroupCounterItem item = new GroupCounterItem ( ) ;
+item. setKey ( "x" ) ;
+item. setValue ( 1L ) ;
+groupCounter. add ( item) ;
+UpdateGroupCounterRequest request = UpdateGroupCounterRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . groupCounter ( groupCounter)
+ . mode ( GroupCounterMode . SET )
+ . build ( ) ;
+
+UpdateGroupCounterResult result = client. group. updateGroupCounter ( request) ;
+
App 管理员可以通过该接口删除群计数器。
使用示例:
DeleteGroupCounterRequest request = DeleteGroupCounterRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . build ( ) ;
+
+DeleteGroupCounterResult result = client. group. deleteGroupCounter ( request) ;
+
App 管理员可以为直播群设置和取消管理员,当设置管理员时,被设置的账号可以不需要在直播群里,被设置为管理员之后,该账号即使离开直播群再重新进群也仍然是管理员。需要取消管理员身份时,需要调用本接口取消该用户的管理员身份。该功能需旗舰版,并且在 IM 控制台“群功能配置”中开通“直播群在线成员列表”功能。
使用示例:
ModifyAdminRequest request = ModifyAdminRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . commandType ( 1 )
+ . adminAccount ( Arrays . asList ( "test1" , "bingo" ) )
+ . build ( ) ;
+
+ModifyAdminResult result = client. group. modifyAdmin ( request) ;
+
App 管理员可以根据群组 ID 获取直播群管理员列表。该功能仅限旗舰版用户在 IM 控制台“群功能配置”中开启“直播群在线成员列表”后方可使用。
使用示例:
GetAdminListRequest request = GetAdminListRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . build ( ) ;
+
+GetAdminListResult result = client. group. getAdminList ( request) ;
+
App 管理员可以根据群组 ID 查询一批用户是否在直播群内。该功能需旗舰版,并且在 IM 控制台“群功能配置”中开通“直播群在线成员列表”功能。
使用示例:
CheckMembersRequest request = CheckMembersRequest . builder ( )
+ . groupId ( "MyFirstGroup" )
+ . memberAccount ( Arrays . asList ( "test1" , "bingo" ) )
+ . build ( ) ;
+
+CheckMembersResult result = client. group. checkMembers ( request) ;
+
Prev
最近联系人
Next
全局禁言管理
+
+
+
diff --git a/guide/index.html b/guide/index.html
new file mode 100644
index 00000000..adb8a5e4
--- /dev/null
+++ b/guide/index.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+ 介绍 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ 本文档基于腾讯云 IM Server SDK Java v0.4.10 编写。
说明
“App 管理员”是对 App 具有最高管理权限的角色,可调用 REST API 接口 ,进行创建/解散群组、发送全员推送消息等操作。每个应用最多支持配置 10 个管理员。
SDK 源码请参见 GitHub 。
Next
快速上手
+
+
+
diff --git a/guide/member.html b/guide/member.html
new file mode 100644
index 00000000..c4c54458
--- /dev/null
+++ b/guide/member.html
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+ 全员推送 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ 全员推送,用户运营利器,不仅支持全员发送特定内容,还可根据标签、属性,针对特定用户群体发送个性化内容,如会员活动、区域通知等,助力拉新、转化、促活等各个阶段运营工作的有效进行。
支持全员推送。 支持按用户属性推送。 支持按用户标签推送。 管理员推送消息,接收方看到消息发送者是管理员。 管理员指定某一账号向其他账号推送消息,接收方看到发送者不是管理员,而是管理员指定的账号。 支持消息离线存储,不支持漫游。 由于全员推送需要下发的账号数量巨大,下发完全部账号需要一定时间(根据账号总数而定,一般在一分钟内)。 支持只推在线用户,需要将 MsgLifeTime 参数设置为 0。 使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "hi, beauty" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+ImPushRequest request = ImPushRequest . builder ( )
+ . msgRandom ( 9312457L )
+ . msgBody ( msgBody)
+ . fromAccount ( "admin" )
+ . msgLifeTime ( 120 )
+ . build ( ) ;
+
+ImPushResult result = client. member. imPush ( request) ;
+
每个应用可以设置自定义的用户属性,最多可以有 10 个。通过本接口可以设置每个属性的名称,设置完成后,即可用于按用户属性推送等。
使用示例:
Map < String , String > attrNames = new HashMap < > ( 3 ) ;
+attrNames. put ( "0" , "sex" ) ;
+attrNames. put ( "1" , "city" ) ;
+attrNames. put ( "2" , "country" ) ;
+ImSetAttrNameRequest request = new ImSetAttrNameRequest ( attrNames) ;
+
+ImSetAttrNameResult result = client. member. imSetAttrName ( request) ;
+
管理员获取应用属性名称。使用前请先 设置应用属性名称 。
使用示例:
ImGetAttrNameRequest request = new ImGetAttrNameRequest ( ) ;
+
+ImGetAttrNameResult result = client. member. imGetAttrName ( request) ;
+
获取用户属性(必须以管理员账号调用);每次最多只能获取 100 个用户的属性。使用前请先 设置应用属性名称 。
使用示例:
List < String > toAccount = Arrays . asList ( "test1" , "test2" ) ;
+ImGetAttrRequest request = new ImGetAttrRequest ( toAccount) ;
+
+ImGetAttrResult result = client. member. imGetAttr ( request) ;
+
管理员给用户设置属性。每次最多只能给 100 个用户设置属性。使用前请先 设置应用属性名称 。
使用示例:
Map < String , Object > attrs = new HashMap < > ( ) ;
+attrs. put ( "sex" , "attr1" ) ;
+attrs. put ( "city" , "attr2" ) ;
+UserAttrItem item = new UserAttrItem ( "test1" , attrs) ;
+List < UserAttrItem > userAttrs = Collections . singletonList ( item) ;
+ImSetAttrRequest request = new ImSetAttrRequest ( userAttrs) ;
+
+ImSetAttrResult result = client. member. imSetAttr ( request) ;
+
管理员给用户删除属性。注意每次最多只能给 100 个用户删除属性。使用前请先 设置应用属性名称 。
使用示例:
Map < String , Object > attrs = new HashMap < > ( ) ;
+attrs. put ( "sex" , "attr1" ) ;
+attrs. put ( "city" , "attr2" ) ;
+UserAttrItem item = UserAttrItem . builder ( )
+ . toAccount ( "test1" )
+ . attrs ( attrs)
+ . build ( ) ;
+List < UserAttrItem > userAttrs = Collections . singletonList ( item) ;
+ImRemoveAttrRequest request = new ImRemoveAttrRequest ( userAttrs) ;
+
+ImRemoveAttrResult result = client. member. imRemoveAttr ( request) ;
+
获取用户标签(必须以管理员账号调用)。每次最多只能获取 100 个用户的标签。
使用示例:
List < String > toAccount = Arrays . asList ( "test1" , "test2" ) ;
+ImGetTagRequest request = new ImGetTagRequest ( toAccount) ;
+
+ImGetTagResult result = client. member. imGetTag ( request) ;
+
管理员给用户添加标签。
注意
每次请求最多只能给 100 个用户添加标签,请求体中单个用户添加标签数最多为 10 个。 单个用户可设置最大标签数为 100 个,若用户当前标签超过 100,则添加新标签之前请先删除旧标签。 单个标签最大长度为 50 字节。 使用示例:
List < String > tags = Arrays . asList ( "a" , "b" ) ;
+UserTagItem item = UserTagItem . builder ( )
+ . toAccount ( "test1" )
+ . tags ( tags)
+ . build ( ) ;
+List < UserTagItem > userTags = Collections . singletonList ( item) ;
+ImAddTagRequest request = new ImAddTagRequest ( userTags) ;
+
+ImAddTagResult result = client. member. imAddTag ( request) ;
+
管理员给用户删除标签。注意每次最多只能给 100 个用户删除标签。
使用示例:
List < String > tags = Arrays . asList ( "a" , "b" ) ;
+UserTagItem item = UserTagItem . builder ( )
+ . toAccount ( "test1" )
+ . tags ( tags)
+ . build ( ) ;
+List < UserTagItem > userTags = Collections . singletonList ( item) ;
+ImRemoveTagRequest request = new ImRemoveTagRequest ( userTags) ;
+
+ImRemoveTagResult result = client. member. imRemoveTag ( request) ;
+
管理员给用户删除所有标签。注意每次最多只能给 100 个用户删除所有标签。
使用示例:
List < String > toAccount = Arrays . asList ( "test1" , "test2" ) ;
+ImRemoveAllTagsRequest request = new ImRemoveAllTagsRequest ( toAccount) ;
+
+ImRemoveAllTagsResult result = client. member. imRemoveAllTags ( request) ;
+
Prev
单聊消息
Next
资料管理
+
+
+
diff --git a/guide/message.html b/guide/message.html
new file mode 100644
index 00000000..a015a532
--- /dev/null
+++ b/guide/message.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+ 单聊消息 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ 管理员向账号发消息,接收方看到消息发送者是管理员。 管理员指定某一账号向其他账号发消息,接收方看到发送者不是管理员,而是管理员指定的账号。 该接口不会检查发送者和接收者的好友关系(包括黑名单),同时不会检查接收者是否被禁言。 该接口默认不会检查接收者对发送者是否设置了免打扰,如需检查,请在"SendMsgControl"字段填上"WithMuteNotifications"。 单聊消息 MsgSeq 字段的作用及说明:该字段在发送消息时由用户自行指定,该值可以重复,非后台生成,非全局唯一。与群聊消息的 MsgSeq 字段不同,群聊消息的 MsgSeq 由后台生成,每个群都维护一个 MsgSeq,从 1 开始严格递增。单聊消息历史记录对同一个会话的消息先以时间戳排序,同秒内的消息再以 MsgSeq 排序。 使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "hello world" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+SendMsgRequest request = SendMsgRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( "test2" )
+ . msgRandom ( 123L )
+ . msgBody ( msgBody)
+ . syncOtherMachine ( SyncOtherMachine . YES )
+ . msgTimeStamp ( 1631934058 )
+ . msgLifeTime ( 604800 )
+ . build ( ) ;
+
+SendMsgResult result = client. message. sendMsg ( request) ;
+
支持一次对最多 500 个用户进行单发消息。 与单发消息相比,该接口更适用于营销类消息、系统通知 tips 等时效性较强的消息。 若消息不需要计入未读数,也不需要存储聊天记录,则可将 MsgLifeTime 字段设置为 0,这样可以带来更快的消息下发速度。 管理员指定某一账号向目标账号批量发消息,接收方看到发送者不是管理员,而是管理员指定的账号。 该接口不触发回调请求。 该接口不会检查发送者和接收者的好友关系(包括黑名单),同时不会检查接收者是否被禁言。 该接口默认不会检查接收者对发送者是否设置了免打扰,如需检查,请在"SendMsgControl"字段填上"WithMuteNotifications"。 单聊消息 MsgSeq 字段的作用及说明:该字段在发送消息时由用户自行指定,该值可以重复,非后台生成,非全局唯一。与群聊消息的 MsgSeq 字段不同,群聊消息的 MsgSeq 由后台生成,每个群都维护一个 MsgSeq,从 1 开始严格递增。单聊消息历史记录对同一个会话的消息先以时间戳排序,同秒内的消息再以 MsgSeq 排序。 使用示例:
List < String > toAccount = Arrays . asList ( "test1" , "test2" ) ;
+TIMTextMsgElement msg = new TIMTextMsgElement ( "hi bingo" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+BatchSendMsgRequest request = BatchSendMsgRequest
+ . builder ( )
+ . toAccount ( toAccount)
+ . msgRandom ( 123L )
+ . msgBody ( msgBody)
+ . syncOtherMachine ( SyncOtherMachine . NO )
+ . msgSeq ( 28460L )
+ . build ( ) ;
+
+BatchSendMsgResult result = client. message. batchSendMsg ( request) ;
+
导入历史单聊消息到即时通信 IM。 平滑过渡期间,将原有即时通信实时单聊消息导入到即时通信 IM。 该接口会更新会话。 该接口不会触发回调。 对于同一个单聊会话的消息,该接口会根据 MsgSeq , MsgRandom , MsgTimeStamp 字段的值对导入的消息进行去重。仅当这三个字段的值都对应相同时,才判定消息是重复的,消息是否重复与消息内容本身无关。 另外,若两条消息的 MsgSeq , MsgRandom , MsgTimeStamp 字段对应相同,而 from_account 和 to_account 相反,则这两条消息也认为是重复的。 重复导入的消息不会覆盖之前已导入的消息(即消息内容以首次导入的为准)。 单聊消息 MsgSeq 字段的作用及说明:该字段在发送消息时由用户自行指定,该值可以重复,非后台生成,非全局唯一。与群聊消息的 MsgSeq 字段不同,群聊消息的 MsgSeq 由后台生成,每个群都维护一个 MsgSeq,从 1 开始严格递增。单聊消息历史记录对同一个会话的消息先以时间戳排序,同秒内的消息再以 MsgSeq 排序。 使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "hello bingo" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+ImportMsgRequest request = ImportMsgRequest . builder ( )
+ . fromAccount ( "bingo" )
+ . toAccount ( "test1" )
+ . msgRandom ( 122L )
+ . msgTimeStamp ( 1557387418 )
+ . msgBody ( msgBody)
+ . build ( ) ;
+
+ImportMsgResult result = client. message. importMsg ( request) ;
+
管理员按照时间范围查询某单聊会话的消息记录。 查询的单聊会话由请求中的 From_Account 和 To_Account 指定。查询结果包含会话双方互相发送的消息,具体每条消息的发送方和接收方由每条消息里的 From_Account 和 To_Account 指定。 一般情况下,请求中的 From_Account 和 To_Account 字段值互换,查询结果不变。但通过 单发单聊消息 或 批量发单聊消息 接口发送的消息,如果指定 SyncOtherMachine 值为 2,则需要指定正确的 From_Account 和 To_Account 字段值才能查询到该消息。 例如,通过 单发单聊消息 接口指定账号 A 给账号 B 发一条消息,同时指定 SyncOtherMachine 值为 2。则调用本接口时,From_Account 必须设置为账号 B,To_Account 必须设置为账号 A 才能查询到该消息。 查询结果包含被撤回的消息,由消息里的 MsgFlagBits 字段标识。 若想通过 撤回单聊消息 接口撤回某条消息,可先用本接口查询出该消息的 MsgKey,然后再调用撤回接口进行撤回。 可查询的消息记录的时间范围取决于漫游消息存储时长,默认是 7 天。支持在控制台修改消息漫游时长,延长消息漫游时长是增值服务。具体请参考 漫游消息存储 。 若请求时间段内的消息总大小超过应答包体大小限制(目前为 13K)时,则需要续拉。您可以通过应答中的 Complete 字段查看是否已拉取请求的全部消息。 使用示例:
AdminGetRoamMsgRequest request = AdminGetRoamMsgRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( "test2" )
+ . maxCnt ( 123 )
+ . minTime ( 1631934000 )
+ . maxTime ( 1631934060 )
+ . build ( ) ;
+
+AdminRoamMsgResult result = client. message. getRoamMsg ( request) ;
+
+List < MsgListItem > msgList = result. getMsgList ( ) ;
+if ( msgList != null && msgList. size ( ) > 0 ) {
+ for ( MsgListItem item : msgList) {
+ List < TIMMsgElement > msgBody = item. getMsgBody ( ) ;
+ if ( msgBody != null && msgList. size ( ) > 0 ) {
+ for ( TIMMsgElement msgElement : msgBody) {
+
+ if ( Objects . equals ( msgElement. getMsgType ( ) , MsgType . TIM_CUSTOM_ELEM ) ) {
+ TIMCustomMsgElement t = ( TIMCustomMsgElement ) msgElement;
+ System . out. println ( t. getMsgContent ( ) . getDesc ( ) ) ;
+ } else if ( Objects . equals ( msgElement. getMsgType ( ) , MsgType . TIM_TEXT_ELEM ) ) {
+ TIMTextMsgElement t = ( TIMTextMsgElement ) msgElement;
+ System . out. println ( t. getMsgContent ( ) . getText ( ) ) ;
+ }
+ }
+ }
+ }
+}
+
管理员撤回单聊消息。 该接口可以撤回所有单聊消息,包括客户端发出的单聊消息,由 单发 和 批量发 接口发出的单聊消息。 若需要撤回由客户端发出的单聊消息,您可以开通 发单聊消息之前回调 或 发单聊消息之后回调 ,通过该回调接口记录每条单聊消息的 MsgKey ,然后填在本接口的 MsgKey 字段进行撤回。您也可以通过 查询单聊消息 查询出待撤回的单聊消息的 MsgKey 后,填在本接口的 MsgKey 字段进行撤回。 若需要撤回由 单发 和 批量发 接口发出的单聊消息,需要记录这些接口回包里的 MsgKey 字段以进行撤回。 调用该接口撤回消息后,该条消息的离线、漫游存储,以及消息发送方和接收方的客户端的本地缓存都会被撤回。 该接口可撤回的单聊消息没有时间限制,即可以撤回任何时间的单聊消息。 注意
使用该接口撤回单聊消息后,被撤回的消息不能恢复,请谨慎调用该接口。
使用示例:
AdminMsgWithdrawRequest request = AdminMsgWithdrawRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( "bingo" )
+ . msgKey ( "31906_833502_1572869830" )
+ . build ( ) ;
+
+AdminMsgWithdrawResult result = client. message. msgWithdraw ( request) ;
+
使用示例:
AdminSetMsgReadRequest request = AdminSetMsgReadRequest . builder ( )
+ . reportAccount ( "test1" )
+ . peerAccount ( "test2" )
+ . build ( ) ;
+
+AdminSetMsgReadResult result = client. message. setMsgRead ( request) ;
+
App 后台可以通过该接口查询特定账号的单聊总未读数(包含所有的单聊会话)或者单个单聊会话的未读数。
使用示例:
GetC2cUnreadMsgRequest request = new GetC2cUnreadMsgRequest ( "test2" ) ;
+List < String > peerAccount = Arrays . asList ( "test1" , "bingo" ) ;
+request. setPeerAccount ( peerAccount) ;
+
+C2cUnreadMsgNumResult result = client. message. getC2cUnreadMsgNum ( request) ;
+
管理员修改单聊历史消息。 可以单独修改消息中的 MsgBody 或 CloudCustomData 字段,也可以同时修改这两个字段。以请求中指定的字段值覆盖历史消息对应的字段。 待修改的单聊消息的 MsgKey 可通过以下方式获取: 注意
使用该接口修改消息后,被修改的消息不能恢复,请谨慎调用该接口。
使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "test modify c2c msg" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+ModifyC2cMsgRequest request = ModifyC2cMsgRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( "test2" )
+ . msgKey ( "1353691732_123_1653995506" )
+ . msgBody ( msgBody)
+ . build ( ) ;
+
+ModifyC2cMsgResult result = client. message. modifyC2cMsg ( request) ;
+
App 管理员和会话成员可以拉取消息扩展,消息扩展为一组自定义的键值对。
注意
此功能需 旗舰版套餐,并且已开通“消息扩展功能”功能(控制台“登录与消息”配置)。 单条单聊消息可设置的最大键值对数量为 300 条。 被设置的单聊消息需要在发送时指定“支持消息扩展”,参见 单发单聊消息 。 使用示例:
GetKeyValuesRequest request = GetKeyValuesRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( "bingo" )
+ . msgKey ( "1353691732_123_1653995506" )
+ . startSeq ( 1L )
+ . build ( ) ;
+
+GetKeyValuesResult result = client. message. getKeyValues ( request) ;
+
App 管理员和会话成员可以为单聊普通消息设置消息扩展,消息扩展为一组自定义的键值对。
注意
此功能需 旗舰版套餐,并且已开通“消息扩展功能”功能(控制台“登录与消息”配置)。 单条单聊消息可设置的最大键值对数量为 300 条。 被设置的单聊消息需要在发送时指定“支持消息扩展”,参见 单发单聊消息 。 使用示例:
SetKeyValuesRequest request = SetKeyValuesRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( "bingo" )
+ . msgKey ( "1353691732_123_1653995506" )
+ . build ( ) ;
+
+SetKeyValuesResult result = client. message. setKeyValues ( request) ;
+
App 管理员调用该接口单向删除一个单聊会话的多条消息。 只能以消息的发送方或接收方的身份去删除单聊会话的历史消息。 只能单向删除(以会话其中一方的身份去删除某条消息后,自己看不到这条消息,会话的对方仍然可以看到这条消息) 使用示例:
DeleteC2cMsgRambleRequest request = DeleteC2cMsgRambleRequest . builder ( )
+ . operatorAccount ( "test1" )
+ . peerAccount ( "test2" )
+ . msgKeyList ( Collections . singletonList ( "1353691732_123_1653995506" ) )
+ . build ( ) ;
+
+DeleteC2cMsgRambleResult result = client. message. deleteC2cMsgRamble ( request) ;
+
该 API 接口的作用是清空群聊中用户发送的历史消息。
此接口通过打标记实现 SDK 无法拉取的效果,并没有真的执行删除操作,Admin 用户仍然可以通过“拉取群聊历史消息”接口拉取已清空的历史消息。
使用示例:
ClearGroupMsgRequest request = ClearGroupMsgRequest . builder ( )
+ . groupId ( "test_group" )
+ . msgSeq ( 123L )
+ . build ( ) ;
+
+ClearGroupMsgResult result = client. message. clearGroupMsg ( request) ;
+
Prev
账号管理
Next
全员推送
+
+
+
diff --git a/guide/official_account.html b/guide/official_account.html
new file mode 100644
index 00000000..06e9b5e4
--- /dev/null
+++ b/guide/official_account.html
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+ 公众号管理 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ App 管理员可以通过该接口创建公众号。
使用示例:
CreateOfficialAccountRequest request = new CreateOfficialAccountRequest ( ) ;
+request. setOwnerAccount ( "test" ) ;
+request. setName ( "test_official_account" ) ;
+
+CreateOfficialAccountResult result = client. officialAccount. createOfficialAccount ( request) ;
+
App 管理员可以通过该接口销毁公众号。
使用示例:
DestroyOfficialAccountRequest request = new DestroyOfficialAccountRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+
+DestroyOfficialAccountResult result = client. officialAccount. destroyOfficialAccount ( request) ;
+
App 管理员可以通过该接口修改公众号的相关信息,如公众号的名称、头像、简介等
使用示例:
ModifyOfficialAccountBaseInfoRequest request = new ModifyOfficialAccountBaseInfoRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setName ( "test_official_account2" ) ;
+
+ModifyOfficialAccountBaseInfoResult result = client. officialAccount. modifyOfficialAccountBaseInfo ( request) ;
+
App 管理员可以通过该接口获取公众号的相关资料信息。
使用示例:
GetOfficialAccountInfoRequest request = new GetOfficialAccountInfoRequest ( ) ;
+request. setOfficialAccountIdList ( Collections . singletonList ( new OfficialAccountItem ( "test_official_account_user_id" ) ) ) ;
+
+GetOfficialAccountInfoResult result = client. officialAccount. getOfficialAccountInfo ( request) ;
+
App 管理员可以通过该接口获取订阅某个公众号的所有用户信息.
使用示例:
GetSubscriberInfoRequest request = new GetSubscriberInfoRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setLimit ( 10 ) ;
+request. setNext ( "" ) ;
+
+GetSubscriberInfoResult result = client. officialAccount. getSubscriberInfo ( request) ;
+
App 管理员可以通过该接口使用户订阅某个公众号,成为公众号的订阅成员。
使用示例:
AddSubscriberRequest request = new AddSubscriberRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setSubscriberList ( Collections . singletonList ( new OfficialAccountItem ( "test_subscriber_id" ) ) ) ;
+
+AddSubscriberResult result = client. officialAccount. addSubscriber ( request) ;
+
App 管理员可以通过该接口使用户取消订阅某个公众号,从公众号的订阅成员中移除。
使用示例:
DeleteSubscriberRequest request = new DeleteSubscriberRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setSubscriberToDelAccount ( Collections . singletonList ( "test_subscriber_id" ) ) ;
+
+DeleteSubscriberResult result = client. officialAccount. deleteSubscriber ( request) ;
+
App 管理员可以通过该接口修改订阅者的相关资料信息。
使用示例:
ModifySubscriberInfoRequest request = new ModifySubscriberInfoRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setSubscriberAccount ( "test_subscriber_id" ) ;
+request. setCustomString ( "test_custom_string" ) ;
+
+ModifySubscriberInfoResult result = client. officialAccount. modifySubscriberInfo ( request) ;
+
App 管理员可以通过该接口获取用户订阅的所有公众号列表信息。
使用示例:
GetSubscribedOfficialAccountListRequest request = new GetSubscribedOfficialAccountListRequest ( ) ;
+request. setSubscriberAccount ( "test_subscriber_id" ) ;
+
+GetSubscribedOfficialAccountListResult result = client. officialAccount. getSubscribedOfficialAccountList ( request) ;
+
App 管理员可以通过该接口向关注公众号的所有订阅者发送普通消息。 单个公众号的发送频率上限为1条/秒,每小时最多可发布2条广播消息。 如果5分钟内两条消息的内容相同,后面的消息将被当做重复消息而丢弃。 使用示例:
TIMTextMsgElement msg = new TIMTextMsgElement ( "hello world" ) ;
+List < TIMMsgElement > msgBody = Collections . singletonList ( msg) ;
+SendOfficialAccountMsgRequest request = SendOfficialAccountMsgRequest . builder ( )
+ . officialAccount ( "test_official_account_user_id" )
+ . random ( 123 )
+ . msgBody ( msgBody)
+ . build ( ) ;
+
+SendOfficialAccountMsgResult result = client. officialAccount. sendOfficialAccountMsg ( request) ;
+
即时通信 IM 的公众号消息是按 Seq 排序的,按照 server 收到公众号消息的顺序分配 Seq,先发的公众号消息 Seq 小,后发的 Seq 大。 即时通信 IM 会给每条公众号消息生成一个 MsgKey,格式为 "Seq_1_ServerTime"。 如果用户想拉取一个公众号的全量消息,需要填写消息的 LastMsgKey,首次拉取时不用填拉取 LastMsgKey,Server 会自动返回最新的消息,以后拉取时拉取 LastMsgKey 填上次请求返回 LastMsgKey。 如果返回消息的 IsPlaceMsg 为1,表示这个 Seq 的消息或者过期、或者存储失败、或者被删除了。 使用示例:
OfficialAccountMsgGetSimpleRequest request = new OfficialAccountMsgGetSimpleRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setLastMsgKey ( "msg_key" ) ;
+request. setReqMsgNumber ( 10 ) ;
+request. setWithRecalledMsg ( 1 ) ;
+
+OfficialAccountMsgGetSimpleResult result = client. officialAccount. msgGetSimple ( request) ;
+
管理员撤回公众号消息。 该接口可以撤回所有漫游有效期内的公众号消息,包括客户端发出的公众号消息,由 REST API 接口发出的公众号消息。 若需要撤回由客户端发出的公众号消息,您可以开通 发公众号消息之后回调 ,通过该回调接口记录每条公众号消息的 MsgKey,然后填在本接口的 MsgKeyList 参数里进行撤回。您也可以通过 拉取公众号用户历史消息 查询出待撤回的公众号消息的相关信息后,使用本接口进行撤回。 若需要撤回由 REST API 公众号用户发送广播消息 接口发出的公众号消息,需要记录这些接口回包里的 MsgKey 字段以进行撤回。 调用该接口撤回消息后,该条消息的接收方的客户端的本地缓存都会被撤回。 该接口可撤回的公众号消息没有时间限制,即可以撤回任何时间的公众号消息,但是公众号消息的漫游时间需要在有效期内。 使用示例:
OfficialAccountMsgRecallRequest request = new OfficialAccountMsgRecallRequest ( ) ;
+request. setOfficialAccount ( "test_official_account_user_id" ) ;
+request. setMsgKeyList ( Collections . singletonList ( "msg_key" ) ) ;
+
+OfficialAccountMsgRecallResult result = client. officialAccount. msgRecall ( request) ;
+
Prev
内容审核
+
+
+
diff --git a/guide/operation_1.html b/guide/operation_1.html
new file mode 100644
index 00000000..eb0bb812
--- /dev/null
+++ b/guide/operation_1.html
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+ 全局禁言管理 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ 设置账号的单聊消息全局禁言。 设置账号的群组消息全局禁言。 使用示例:
SetNoSpeakingRequest request = SetNoSpeakingRequest . builder ( )
+ . setAccount ( "test1" )
+ . msgNoSpeakingTime ( NoSpeakingTime . NEVER )
+ . groupMsgNoSpeakingTime ( NoSpeakingTime . FOREVER )
+ . build ( ) ;
+
+SetNoSpeakingResult result = client. operation. setNoSpeaking ( request) ;
+
查询账号的单聊消息全局禁言。 查询账号的群组消息全局禁言。 使用示例:
GetNoSpeakingRequest request = new GetNoSpeakingRequest ( "test1" ) ;
+
+GetNoSpeakingResult result = client. operation. getNoSpeaking ( request) ;
+
Prev
群组管理
Next
运营管理
+
+
+
diff --git a/guide/operation_2.html b/guide/operation_2.html
new file mode 100644
index 00000000..da275942
--- /dev/null
+++ b/guide/operation_2.html
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+ 运营管理 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ App 管理员可以通过该接口拉取最近 30 天的运营数据,可拉取的字段见下文可拉取的运营字段。
使用示例:
GetAppInfoRequest request = new GetAppInfoRequest ( ) ;
+List < String > requestFields = Arrays . asList ( "ChainIncrease" , "ChainDecrease" ) ;
+request. setRequestField ( requestFields) ;
+
+GetAppInfoResult result = client. operation. getAppInfo ( request) ;
+
App 管理员可以通过该接口获取 App 中最近 7 天中某天某小时的所有单发或群组消息记录的下载地址。
注意
下载消息记录里的图片、语音、文件和短视频,此功能仅适用于 4.X 版本 IM SDK,可通过聊天记录中的 URL 字段进行下载。如您使用 2.X 或 3.X 版本的 IM SDK,您将无法通过该方法获取到以上信息,如您需要此功能,请您升级至 4.X 版本。 消息记录以日志文件形式保存并使用 GZip 压缩,通过该接口获取到下载地址后,请自行下载并处理;消息记录文件每小时产生一次,例如 0 点(00:00~00:59)的数据在 01:00 后开始处理,一般 1 小时内处理完毕(消息较多则处理时间较长);文件有效期 7 天,无论是否下载过,都会在 7 天后删除,被删除后不支持重新导出;获取到的下载地址存在有效期,请在过期前进行下载,若地址失效,请通过该接口重新获取。 此接口仅用于下载最近 7 天的聊天记录文件,用于备份或数据统计等。不建议使用该接口用于线上实时业务。 使用示例:
GetHistoryRequest request = GetHistoryRequest . builder ( )
+ . chatType ( ChatType . C2C )
+ . msgTime ( "2015120121" )
+ . build ( ) ;
+
+GetHistoryResult result = client. operation. getHistory ( request) ;
+
基于安全等考虑,您可能需要获知服务器的 IP 地址列表,以便进行相关限制。App 管理员可以通过该接口获得 SDK、第三方回调所使用到的服务器 IP 地址列表或 IP 网段信息。
注意
此接口仅支持获取中国大陆地区的所有 IM 接入方式的 IP 地址或 IP 网段信息。
使用示例:
GetIpListRequest request = new GetIpListRequest ( ) ;
+
+GetIpListResult result = client. op~ eration. getIpList ( request) ;
+
本接口用于封禁聊天消息中的富媒体文件。
说明
仅针对富媒体消息中使用 IM SDK 上传的文件有效,为了确保功能正常使用,请将终端 SDK 更新至 4.9.x 版本及以上,Web SDK 更新至 v2.0.0 版本及以上。
使用示例:
ForbidIllegalObjectRequest request = ForbidIllegalObjectRequest . builder ( )
+ . rawUrl ( "https://cos.ap-shanghai.myqcloud.com/005f-shanghai-360-shared-01-1256635546/76aa-1400152839/2f3b-2273451635034382/699eb4ee5ffa9aeb70627958766f2927-142072.jpg" )
+ . build ( ) ;
+
+ForbidIllegalObjectResult result = client. operation. forbidIllegalObject ( request) ;
+
本接口用于解封聊天消息中的富媒体文件。
说明
仅针对富媒体消息中使用 IM SDK 上传的文件有效,为了确保功能正常使用,请将终端 SDK 更新至 4.9.x 版本及以上,Web SDK 更新至 v2.0.0 版本及以上。
AllowBannedObjectRequest request = AllowBannedObjectRequest . builder ( )
+ . rawUrl ( "https://cos.ap-shanghai.myqcloud.com/005f-shanghai-360-shared-01-1256635546/76aa-1400152839/2f3b-2273451635034382/699eb4ee5ffa9aeb70627958766f2927-142072.jpg" )
+ . build ( ) ;
+
+AllowBannedObjectResult result = client. operation. allowBannedObject ( request) ;
+
本接口用于获取聊天消息中的富媒体文件 FULL_CONTROL 权限的 URL 签名以及文件状态信息,默认有效期 15 分钟。一般 SDK 下发的文件 URL 为普通账号签名,违规封禁后,可以使用 FULL_CONTROL 权限的 URL 签名来查看封禁的资源。
说明
仅针对富媒体消息中使用 IM SDK 上传的文件有效,为了确保功能正常使用,请将终端 SDK 更新至 4.9.x 版本及以上,Web SDK 更新至 v2.0.0 版本及以上。
RawUrlItem item = new RawUrlItem ( ) ;
+item. setRawUrl ( "https://cos.ap-shanghai.myqcloud.com/98ec-shanghai-007-privatev2-01-1256635546/0345-1400187352/0612-yyy/9a0f4c42d208ccfb5aa47c29284aefc6.png" ) ;
+item. setResourceId ( 1 ) ;
+List < RawUrlItem > rawUrls = Collections . singletonList ( item) ;
+GetCosSigRequest request = GetCosSigRequest . builder ( )
+ . rawUrls ( rawUrls)
+ . build ( ) ;
+
+GetCosSigResult result = client. operation. getCosSig ( request) ;
+
Prev
全局禁言管理
Next
机器人
+
+
+
diff --git a/guide/profile.html b/guide/profile.html
new file mode 100644
index 00000000..6b6857be
--- /dev/null
+++ b/guide/profile.html
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+ 资料管理 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ 支持 标配资料字段 和 自定义资料字段 的设置。
使用示例:
ProfileItem profileItem = ProfileItem . builder ( )
+ . tag ( TagProfile . IM_NICK )
+ . value ( "MyNickName" )
+ . build ( ) ;
+List < ProfileItem > profiles = Collections . singletonList ( profileItem) ;
+PortraitSetRequest request = PortraitSetRequest . builder ( )
+ . fromAccount ( "test1" )
+ . profileItemList ( profiles)
+ . build ( ) ;
+
+PortraitSetResult result = client. profile. portraitSet ( request) ;
+
支持拉取好友和非好友的资料字段。 支持拉取 标配资料字段 和 自定义资料字段 。 建议每次拉取的用户数不超过 100,避免因回包数据量太大导致回包失败。 请确保请求中的所有账号都已导入即时通信 IM,如果请求中含有未导入即时通信 IM 的账号,即时通信 IM 后台将会提示错误。 使用示例:
List < String > tagList = Collections . singletonList ( TagProfile . IM_NICK ) ;
+List < String > toAccount = Collections . singletonList ( "test1" ) ;
+PortraitGetRequest request = PortraitGetRequest . builder ( )
+ . tagList ( tagList)
+ . toAccount ( toAccount)
+ . build ( ) ;
+
+PortraitGetResult result = client. profile. portraitGet ( request) ;
+
Prev
全员推送
Next
关系链管理
+
+
+
diff --git a/guide/quickstart.html b/guide/quickstart.html
new file mode 100644
index 00000000..41374031
--- /dev/null
+++ b/guide/quickstart.html
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+ 快速上手 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ 在项目的 pom.xml
的 dependencies 中引入以下依赖:
< dependency>
+ < groupId> io.github.doocs</ groupId>
+ < artifactId> im-server-sdk-java</ artifactId>
+ < version> 0.4.10</ version>
+</ dependency>
+
implementation group: 'io.github.doocs' , name: 'im-server-sdk-java' , version: '0.4.10'
+
Maven 中央仓库
在使用腾讯云即时 IM 服务端 REST API 之前, 需要先通过 appId
, userId
, key
获取到一个 ImClient
实例:
+long appId = 1400554812 ;
+
+
+String userId = "test" ;
+
+
+String key = "60c6c5925f3ae52c7325ac5a8ec78e44c056d1dd84d54e12ffa39911267a2a70" ;
+
+
+ImClient client = ImClient . getInstance ( appId, userId, key) ;
+
+
+ImClient client = ImClient . getInstance ( appId, userId, key, Domain . SINGAPORE ) ;
+
+
+ClientConfiguration config = new ClientConfiguration ( ) ;
+config. setExpireTime ( 7 * 24 * 60 * 60L ) ;
+config. setAutoRenewSig ( false ) ;
+ImClient client = ImClient . getInstance ( appId, userId, key, config) ;
+
ClientConfiguration
支持对以下参数进行自定义配置:
字段 类型 说明 默认值 maxRetries
int HTTP 最大重试次数 3 connectTimeout
long HTTP 连接超时(毫秒) 10_000 readTimeout
long HTTP 读超时(毫秒) 10_000 writeTimeout
long HTTP 写超时(毫秒) 10_000 callTimeout
long 一个完整的 HTTP 调用的时间限制。这包括解析 DNS、连接、写入请求正文、服务器处理以及读取响应正文。(毫秒) 30_000 expireTime
long UserSig 签名有效时长(秒) 86400 autoRenewSig
boolean 是否自动进行 UserSig 签名续期 true userAgent
string User-Agent connectionPool
object HTTP 连接池
获取到 ImClient
实例后,就可以方便地进行 REST API 调用了。
我们以 账号管理-导入单个账号 为例:
AccountImportRequest request = AccountImportRequest . builder ( )
+ . identifier ( "admin" )
+ . faceUrl ( "https://avatars.githubusercontent.com/u/43716716?s=200&v=4" )
+ . nick ( "doocs" )
+ . build ( ) ;
+
+AccountImportResult result = client. account. accountImport ( request) ;
+
Prev
介绍
Next
账号管理
+
+
+
diff --git a/guide/recent_contact.html b/guide/recent_contact.html
new file mode 100644
index 00000000..26d06116
--- /dev/null
+++ b/guide/recent_contact.html
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+ 最近联系人 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ 支持分页拉取会话列表。
使用示例:
GetRecentContactListRequest request = GetRecentContactListRequest . builder ( )
+ . fromAccount ( "doocs" )
+ . timestamp ( 0 )
+ . startIndex ( 0 )
+ . topTimestamp ( 0 )
+ . topStartIndex ( 0 )
+ . assistFlags ( AssistFlags . BIT_0 )
+ . build ( ) ;
+
+GetRecentContactListResult result = client. recentContact. recentContactList ( request) ;
+
删除指定会话,支持同步清理漫游消息。
使用示例:
DeleteRecentContactRequest request = DeleteRecentContactRequest . builder ( )
+ . fromAccount ( "doocs_1" )
+ . type ( RecentContactType . C2C )
+ . toAccount ( "doocs_2" )
+ . clearRamble ( ClearRamble . YES )
+ . build ( ) ;
+
+DeleteRecentContactResult result = client. recentContact. deleteRecentContact ( request) ;
+
会话分组标记数据独立于最近联系人,RestAPI 支持会话分组、会话标准标记、会话自定义标记等字段增删改查。会话分组标记最多支持 1000 个会话,而一个用户最多支持 20 个会话分组。本接口支持会话分组数据的创建,仅旗舰版支持会话分组数据操作。
使用示例:
List < GroupContactItem > items = new ArrayList < > ( ) ;
+GroupContactItem item = new GroupContactItem ( ) ;
+item. setGroupName ( "groupName" ) ;
+
+List < ContactItem > contactItems = new ArrayList < > ( ) ;
+ContactItem contactItem = new ContactItem ( ) ;
+contactItem. setToAccount ( "ccc" ) ;
+contactItem. setToGroupId ( "group1" ) ;
+contactItem. setType ( 1 ) ;
+contactItems. add ( contactItem) ;
+item. setContactItem ( contactItems) ;
+items. add ( item) ;
+CreateContactGroupRequest request = CreateContactGroupRequest . builder ( )
+ . fromAccount ( "test1" )
+ . groupContactItem ( items) . build ( ) ;
+
+CreateContactGroupResult result = client. recentContact. createContactGroup ( request) ;
+
会话分组标记数据独立于最近联系人,RestAPI 支持会话分组、会话标准标记、会话自定义标记等字段增删改查。会话分组标记数据最多支持 1000 个会话。本接口支持会话分组数据的更新,仅旗舰版支持会话分组数据操作。
使用示例:
UpdateGroup updateGroup = UpdateGroup . builder ( ) . updateGroupType ( 1 )
+ . newGroupName ( "hh" ) . oldGroupName ( "cc" ) . build ( ) ;
+UpdateContactGroupRequest request = UpdateContactGroupRequest . builder ( )
+ . updateType ( 1 )
+ . fromAccount ( "test1" )
+ . updateGroup ( updateGroup)
+ . build ( ) ;
+
+UpdateContactGroupResult result = client. recentContact. updateContactGroup ( request) ;
+
本接口支持删除用户的会话分组数据,仅旗舰版支持会话分组数据操作。
使用示例:
List < String > groupName = new ArrayList < > ( ) ;
+groupName. add ( "hh" ) ;
+DelContactGroupRequest request = DelContactGroupRequest . builder ( )
+ . groupName ( groupName)
+ . fromAccount ( "test1" )
+ . build ( ) ;
+
+DelContactGroupResult result = client. recentContact. delContactGroup ( request) ;
+
会话分组标记数据独立于最近联系人,RestAPI 支持会话分组、会话标准标记、会话自定义标记等字段增删改查。会话分组标记最多支持 1000 个会话。本接口支持会话标准标记以及会话自定义标记的创建或更新,仅旗舰版支持会话标准标记数据操作,自定义会话标记数据无限制。
使用示例:
List < MarkContactItem > items = new ArrayList < > ( ) ;
+MarkContactItem item = new MarkContactItem ( ) ;
+item. setClearMark ( Collections . singletonList ( 1 ) ) ;
+item. setSetMark ( Collections . singletonList ( 2 ) ) ;
+item. setOptType ( 1 ) ;
+items. add ( item) ;
+MarkContactRequest request = MarkContactRequest . builder ( )
+ . fromAccount ( "test1" )
+ . markItem ( items)
+ . build ( ) ;
+
+MarkContactResult result = client. recentContact. markContact ( request) ;
+
本接口根据指定的会话来查询对应会话分组标记数据。
使用示例:
SearchContactGroupRequest request = new SearchContactGroupRequest ( ) ;
+request. setFromAccount ( "test1" ) ;
+ContactItem contactItem = new ContactItem ( ) ;
+contactItem. setType ( 1 ) ;
+contactItem. setToAccount ( "test2" ) ;
+contactItem. setToGroupId ( "123" ) ;
+request. setContactItem ( Collections . singletonList ( contactItem) ) ;
+
+SearchContactGroupResult result = client. recentContact. searchContactGroup ( request) ;
+
本接口支持批量获取用户的会话分组标记数据。
使用示例:
GetContactGroupRequest request = new GetContactGroupRequest ( ) ;
+request. setFromAccount ( "test1" ) ;
+request. setStartIndex ( 1 ) ;
+
+GetContactGroupResult result = client. recentContact. getContactGroup ( request) ;
+
Prev
关系链管理
Next
群组管理
+
+
+
diff --git a/guide/robot.html b/guide/robot.html
new file mode 100644
index 00000000..17e4def7
--- /dev/null
+++ b/guide/robot.html
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+ 机器人 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ 本接口用于创建一个机器人账号,机器人是一种特殊账号,userid 必须以 @RBT#
开头,创建机器人时可以指定设置昵称、头像和签名。
说明
同一个机器人账号 userid 重复创建仅会创建 1 个机器人。 每个 IM 账号只能创建最多 20 个机器人账号。 使用示例:
CreateRobotRequest request = new CreateRobotRequest ( ) ;
+request. setNick ( "bingo" ) ;
+request. setFaceUrl ( "https://avatars.githubusercontent.com/u/2784452?v=4" ) ;
+request. setSelfSignature ( "hah" ) ;
+request. setUserId ( "@RBT#1233232" ) ;
+
+CreateRobotResult result = client. robot. createRobot ( request) ;
+
本接口用于将一个机器人账号设置为无效,机器人是一种特殊账号,userid 必须以 @RBT#
开头。
说明
本接口将一个机器人账号设置为无效。 机器人账号 UserID 本身不会被删除。 使用示例:
DeleteRobotRequest request = DeleteRobotRequest . builder ( ) . robotAccount ( "@RBT#1233232" ) . build ( ) ;
+
+DeleteRobotResult result = client. robot. deleteRobot ( request) ;
+
本接口用于拉取所有的机器人账号列表,机器人是一种特殊账号,userid 必须以 @RBT#
开头。
使用示例:
GetAllRobotsRequest request = new GetAllRobotsRequest ( ) ;
+
+GetAllRobotsResult result = client. robot. getAllRobots ( request) ;
+
Prev
运营管理
Next
内容审核
+
+
+
diff --git a/guide/sns.html b/guide/sns.html
new file mode 100644
index 00000000..5264886f
--- /dev/null
+++ b/guide/sns.html
@@ -0,0 +1,179 @@
+
+
+
+
+
+
+
+
+ 关系链管理 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+ 添加好友,支持批量添加好友。
使用示例:
AddFriendItem addFriendItem = AddFriendItem . builder ( )
+ . toAccount ( "test2" )
+ . addSource ( "AddSource_Type_XXXXXXXX" )
+ . remark ( "Mr.A" )
+ . groupName ( "schoolmate" )
+ . addWording ( "Hi" )
+ . build ( ) ;
+List < AddFriendItem > addFriendItemList = Collections . singletonList ( addFriendItem) ;
+FriendAddRequest request = FriendAddRequest . builder ( )
+ . fromAccount ( "test1" )
+ . addFriendItemList ( addFriendItemList)
+ . addType ( AddType . BOTH )
+ . forceAddFlags ( ForceAddFlags . FORCE )
+ . build ( ) ;
+
+FriendAddResult result = client. sns. friendAdd ( request) ;
+
支持批量导入单向好友。 往同一个用户导入好友时建议采用批量导入的方式,避免并发写导致的写冲突。 使用示例:
ImportFriendItem importFriendItem = ImportFriendItem . builder ( )
+ . toAccount ( "test2" )
+ . addSource ( "AddSource_Type_XXXXXXXX" )
+ . build ( ) ;
+List < ImportFriendItem > importFriendItems = Collections . singletonList ( importFriendItem) ;
+FriendImportRequest request = FriendImportRequest . builder ( )
+ . fromAccount ( "test1" )
+ . importFriendItemList ( importFriendItems)
+ . build ( ) ;
+
+FriendImportResult result = client. sns. friendImport ( request) ;
+
支持批量更新同一用户的多个好友的关系链数据。 更新一个用户多个好友时,建议采用批量方式,避免并发写导致的写冲突。 使用示例:
SnsItem snsItem = SnsItem . builder ( )
+ . tag ( "Tag_SNS_Custom_testTag" )
+ . value ( TagSns . IM_ADD_WORDING )
+ . build ( ) ;
+List < SnsItem > snsItems = Collections . singletonList ( snsItem) ;
+UpdateItem updateItem = UpdateItem . builder ( )
+ . toAccount ( "test2" )
+ . snsItemList ( snsItems)
+ . build ( ) ;
+List < UpdateItem > updateItems = Collections . singletonList ( updateItem) ;
+FriendUpdateRequest request = FriendUpdateRequest . builder ( )
+ . fromAccount ( "test1" )
+ . updateItemList ( updateItems)
+ . build ( ) ;
+
+FriendUpdateResult result = client. sns. friendUpdate ( request) ;
+
删除好友,支持单向删除好友和双向删除好友。
使用示例:
List < String > toAccount = Collections . singletonList ( "test2" ) ;
+FriendDeleteRequest request = FriendDeleteRequest . builder ( )
+ . deleteType ( DeleteType . BOTH )
+ . fromAccount ( "test1" )
+ . toAccount ( toAccount)
+ . build ( ) ;
+
+FriendDeleteResult result = client. sns. friendDelete ( request) ;
+
清除指定用户的标配好友数据和自定义好友数据。
使用示例:
FriendDeleteAllRequest request = FriendDeleteAllRequest . builder ( )
+ . deleteType ( DeleteType . BOTH )
+ . fromAccount ( "test1" )
+ . build ( ) ;
+
+FriendDeleteAllResult result = client. sns. friendDeleteAll ( request) ;
+
支持批量校验好友关系。
使用示例:
List < String > toAccount = Collections . singletonList ( "test2" ) ;
+FriendCheckRequest request = FriendCheckRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( toAccount)
+ . checkType ( CheckResultType . BOTH )
+ . build ( ) ;
+
+FriendCheckResult result = client. sns. friendCheck ( request) ;
+
分页拉取全量好友数据。 不支持资料数据的拉取。 不需要指定请求拉取的字段,默认返回全量的标配好友数据和自定义好友数据。 使用示例:
FriendGetRequest request = FriendGetRequest . builder ( )
+ . fromAccount ( "test1" )
+ . startIndex ( 0 )
+ . standardSequence ( 0 )
+ . customSequence ( 0 )
+ . build ( ) ;
+
+FriendGetResult result = client. sns. friendGet ( request) ;
+
支持拉取指定好友的好友数据和资料数据。 建议每次拉取的好友数不超过 100,避免因数据量太大导致回包失败。 使用示例:
List < String > toAccount = Collections . singletonList ( "test2" ) ;
+List < String > tagList = Arrays . asList ( TagProfile . IM_ADMIN_FORBID_TYPE , TagProfile . IM_ALLOW_TYPE ) ;
+FriendGetListRequest request = FriendGetListRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( toAccount)
+ . tagList ( tagList)
+ . build ( ) ;
+
+FriendGetListResult result = client. sns. friendGetList ( request) ;
+
添加黑名单,支持批量添加黑名单。
注意
如果用户 A 与用户 B 之间存在好友关系,拉黑时会解除双向好友关系。 如果用户 A 与用户 B 之间存在黑名单关系,二者之间无法发起加好友请求。 如果用户 A 的黑名单中有用户 B 且用户 B 的黑名单中有用户 A,二者之间无法发起会话。 如果用户 A 的黑名单中有用户 B 但用户 B 的黑名单中没有用户 A,那么用户 A 可以给用户 B 发消息,用户 B 不能给用户 A 发消息。 使用示例:
List < String > toAccount = Collections . singletonList ( "test2" ) ;
+BlackListAddRequest request = BlackListAddRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( toAccount)
+ . build ( ) ;
+
+BlackListAddResult result = client. sns. blackListAdd ( request) ;
+
删除指定黑名单。
使用示例:
List < String > toAccount = Collections . singletonList ( "test2" ) ;
+BlackListDeleteRequest request = BlackListDeleteRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( toAccount)
+ . build ( ) ;
+
+BlackListDeleteResult result = client. sns. blackListDelete ( request) ;
+
支持分页拉取所有黑名单。
使用示例:
BlackListGetRequest request = BlackListGetRequest . builder ( )
+ . fromAccount ( "test1" )
+ . startIndex ( 0 )
+ . maxLimited ( 10 )
+ . lastSequence ( 0 )
+ . build ( ) ;
+
+BlackListGetResult result = client. sns. blackListGet ( request) ;
+
支持批量校验黑名单。
使用示例:
List < String > toAccount = Collections . singletonList ( "test2" ) ;
+BlackListCheckRequest request = BlackListCheckRequest . builder ( )
+ . fromAccount ( "test1" )
+ . toAccount ( toAccount)
+ . checkType ( BlackCheckResultType . BOTH )
+ . build ( ) ;
+
+BlackListCheckResult result = client. sns. blackListCheck ( request) ;
+
添加分组,支持批量添加分组,并将指定好友加入到新增分组中。
使用示例:
List < String > groupName = Collections . singletonList ( "classmate" ) ;
+List < String > toAccount = Collections . singletonList ( "test2" ) ;
+GroupAddRequest request = GroupAddRequest . builder ( )
+ . fromAccount ( "test1" )
+ . groupName ( groupName)
+ . toAccount ( toAccount)
+ . build ( ) ;
+
+GroupAddResult result = client. sns. groupAdd ( request) ;
+
删除指定分组。
使用示例:
List < String > groupName = Collections . singletonList ( "classmate" ) ;
+GroupDeleteRequest request = GroupDeleteRequest . builder ( )
+ . fromAccount ( "test1" )
+ . groupName ( groupName)
+ . build ( ) ;
+
+GroupDeleteResult result = client. sns. groupDelete ( request) ;
+
拉取分组,支持指定分组以及拉取分组下的好友列表。
使用示例:
List < String > groupName = Collections . singletonList ( "classmate" ) ;
+GroupGetRequest request = GroupGetRequest . builder ( )
+ . fromAccount ( "test1" )
+ . groupName ( groupName)
+ . needFriend ( NeedFriendType . YES )
+ . build ( ) ;
+
+GroupGetResult result = client. sns. groupGet ( request) ;
+
Prev
资料管理
Next
最近联系人
+
+
+
diff --git a/index.html b/index.html
new file mode 100644
index 00000000..66b06560
--- /dev/null
+++ b/index.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+ 首页 | 腾讯云 IM 服务端 Java SDK 使用文档
+
+
+
+
+
+
+
+
+