炸房捣乱现象或行为常出现在以下场景:
常见的炸房捣乱现象或行为包括:
处理炸房捣乱行为的关键是排查并找出非法用户,你可以通过以下几种方法查找非法用户:
方法一(推荐):
在客户端调用 enableAudioVolumeIndication
开启说话者音量提示。开启该方法后,SDK 会定期向 app 返回 onAudioVolumeIndication
回调,其中包含了正在说话的远端用户列表。你可以将其和你的服务器维护的用户列表做对比,找出非法用户。
方法二:
业务服务器定期调用 Agora RESTful API https://api.agora.io/dev/v1/channel/user/{appid}/{channelName}
查询在线频道的用户列表,并与自己的业务服务器上维护的用户列表做对比,找到非法用户。
方法三:
开通 Agora 消息通知服务并订阅实时通信事件。当收到主播加入频道或用户角色切换为主播事件时,查询业务服务器上维护的上麦用户列表,判断新加入的主播是否合法。
方法四:
如果频道内有捣乱者不断发送色情、暴恐和涉政等语音内容,你可以使用云录制的单流录制模式,接入第三方语音审核,并在审核结果中找到发送违规音频内容的用户。
找到非法用户后,需要及时制止其行为,以尽快恢复秩序。你可以采用以下任意一种方法阻止捣乱行为:
禁止非法用户发流。
方法一:
你的业务服务器给非法用户的客户端下发下麦消息,让非法用户的客户端调用 setClientRole
将用户角色设置为观众,以取消其发流权限。
方法二:
业务服务器调用 Agora RESTful API https://api.agora.io/dev/v1/kicking-rule
, 并在请求包体中将 privileges
参数设置为 publish_audio
和 publish_video
,以禁止非法用户发送音视频流。
停止接收非法用户的音频流。
如果非法用户劫持了向其下发的消息,你的业务服务器可以向所有合法的客户端下发禁言消息,让合法客户端调用 muteRemoteAudioStream
停止接收非法用户的音频流。
将非法用户踢出频道或封禁其 IP 地址。
业务服务器调用 https://api.agora.io/dev/v1/kicking-rule
,并将请求包体中的 privileges
参数设置为join_channel
将非法用户踢出频道或封禁其 IP 地址。
要实现上述功能,你需要将 privileges
参数设置为 join_channel
,并按照如下方式填写 cname
、uid
和 ip
三个字段:
cname
和 uid
,不填写 ip
,以禁止该 uid
登录 app 中该 cname
对应的频道。uid
,不填写 cname
和 ip
,以禁止该 uid
登录 app 中的任何频道。ip
,不填写 cname
和 uid
,以禁止该 ip
登录 app 中的任何频道。你可以采取以下措施,加强安全防范,避免业务漏洞,不给非法用户可乘之机:
优化 Token 管理。
privilegeExpiredTs
参数。Token 过期后,所有用户都会被移出频道,非法用户就无法使用该 Token 反复登录频道了。onTokenPrivilegeWillExpire
回调,监听 Token 即将过期事件。当收到该回调时,在服务端生成新的 Token,然后调用 renewToken
将新生成的 Token 传给 SDK。防止 App ID 和 App 证书泄露。
建议将 App ID 和 App 证书存放在服务端,不要对外公开。如果疑似泄密,你可以更新 App 证书。
为避免服务端下发的信令消息被劫持,可以建立超时机制,在确认客户端收到消息后,再进行下一步操作。
例如,服务端给客户端下发下麦通知后,开启超时计时。如果在规定时间内收到客户端的确认消息,才认定客户端真正下麦,再更新 UI。
为避免业务端的频道用户列表与 Agora 服务器上的频道用户列表不一致,你需要在网络中断重连时注意监听 onRejoinChannelSuccess
回调,以及时获取重新加入频道的用户 ID。