安全通
更新时间: 2023/05/26 02:21:06
本文介绍安全通服务端的实现方法。
功能介绍
泛娱乐类音视频聊天场景中,充斥着各种不可控的风险因素,例如色情、暴恐和涉政信息等。
随着国家监管的日趋严格,各平台需要对平台的音视频内容进行管控,自行处理音视频内容审核需要投入大量人力进行甄别。
网易云信融合网易易盾的内容审核能力,为开发者提供实时音视频安全通(内容安全审核)服务(以下简称安全通),对音视频内容进行有效的判别和筛选,降低人力投入。
技术原理
音视频安全通服务会以虚拟身份加入音视频房间,实时监听房间内的视频流和音频流,该虚拟身份对其他房间成员不可见,应用服务器调用停止检测接口时,该虚拟身份自动退出房间,结束安全审核。
安全通的架构如下图所示:
- 应用服务器:
- 您的应用服务器负责调用网易云信服务端API,在创建的音视频房间中开启或结束内容审核、管理内容审核的状态。
- 审核服务器:
- 服务器负责对截取的音视频内容进行判别和筛选,内容审核违规结果会以抄送形式发送至您预留的抄送地址,即您本地用于处理消息抄送的服务器公网地址。
- 接收内容审核结果的服务器:
- 服务器负责接收实时内容审核违规结果,可以据此进行相关的业务处理逻辑,例如视频遮盖、踢人、关闭房间等等。
示例代码
1 对 1 娱乐社交场景安全通的示例代码如下,详细代码请参见网易云信派对服务端 nemo 示例工程中的SocialChatNotifyServiceImpl 。
java/**
* TODO 注:仅为云信派对1v1娱乐社交demo处理逻辑
* 在演示项目中rtc相关的数据都保存在Redis中, 线上业务处理需结合实际业务需求实现
*/
public void handleRtcMsg(String body) {
log.info("handleRtcMsg body: {}", body);
try {
JsonObject jsonObject = GsonUtil.parseJsonObject(body);
Integer eventType = GsonUtil.getInt(jsonObject, "eventType");
RtcNotifyEnum eventTypeEnum = RtcNotifyEnum.fromCode(eventType);
if (eventTypeEnum == null) {
log.info("handleRtcMsg eventType:{} not support", eventType);
return;
}
JsonObject data = GsonUtil.getJsonObject(jsonObject, "data");
switch (eventTypeEnum) {
case EVENT_TYPE_ROOM_START: {
RtcRoomNotifyParam param = GsonUtil.fromJson(data, RtcRoomNotifyParam.class);
param.setStatus(RtcStatusEnum.START.getStatus());
oneToOneChatService.saveRtcRecord(param);
// 提交安全通审核任务
securityAuditService.submitSecurityAuditTask(param);
break;
}
case EVENT_TYPE_ROOM_END: {
RtcRoomNotifyParam param = GsonUtil.fromJson(data, RtcRoomNotifyParam.class);
param.setStatus(RtcStatusEnum.END.getStatus());
// 结束安全通审核任务
securityAuditService.stopSecurityAuditTask(param.getChannelId(), param.getChannelName());
break;
}
case EVENT_TYPE_ROOM_USER_IN: {
RtcRoomUserNotifyParam param = GsonUtil.fromJson(data, RtcRoomUserNotifyParam.class);
param.setStatus(RtcUserStatusEnum.IN_ROOM.getStatus());
oneToOneChatService.saveRtcUserRecord(param);
break;
}
case EVENT_TYPE_ROOM_USER_OUT: {
RtcRoomUserNotifyParam param = GsonUtil.fromJson(data, RtcRoomUserNotifyParam.class);
param.setStatus(RtcUserStatusEnum.LEAVE.getStatus());
oneToOneChatService.saveRtcUserRecord(param);
break;
}
case EVENT_TYPE_ROOM_SECURITY_AUDIT:
RtcAntispamDto rtcAntispamDto = RtcAntispamDto.build(data);
// 处理安全通审核任务抄送
securityAuditService.antispamHandler(rtcAntispamDto);
break;
default:
break;
}
} catch (BsException e) {
log.warn(e.getMessage());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
操作流程
实现安全通的流程如下图所示。
graph LR
classDef default fill:#337EFF,stroke:#337EFF,stroke-width:1px,color:#FFFFFF;
准备工作 --> 创建音视频通话 --> 创建安全通审核任务 --> 接收安全审核结果 --> 处理安全审核结果 --> 结束审核任务
配置步骤
步骤1 准备工作
接入安全通之前,请确保已完成以下准备工作:
- 登录云信控制台创建应用、申请开通音视频通话 2.0 服务和安全通服务。具体步骤请参见开通安全通服务。
- 准备接收抄送消息的服务器公网地址,并配置消息抄送。配置方法请参见开通消息抄送。审核结果会以消息抄送发送至您预留的抄送地址。
- 为安全通服务在音视频房间中的虚拟身份预留 uid 号段,便于其加入房间。
- (可选)配置内容检测相关规则。具体步骤请参见开通安全通服务。
步骤2 创建音视频通话
-
主叫和被叫创建音视频通话,具体步骤请参见实现1对1音视频通话。
客户端创建音视频通话后,默认会创建一个实时音视频房间。
您也可以通过网易云信 RTC 服务端 API 创建一个实时音视频房间。
步骤3 创建安全通审核任务
- 创建安全通审核任务之前,请确保房间已创建且房间中已有一名以上成员。
- 安全通审核任务的开始和结束,都是针对房间。
-
创建实时音视频房间后,您可以通过网易云信 NERTC 服务端 API 创建安全通审核任务。
示例代码如下:
curl --location --request POST 'https://logic-dev.netease.im/livewallsolution/submit' \ --header 'AppKey: ***' \ //请使用您应用的appkey --header 'Nonce: ***' \ //随机数,最大长度为 128 个字符。 --header 'CurTime: 1639555317' \ //当前 Unix 时间戳,即从 1970 年 1 月 1 日 0 点 0 分 0 秒开始到现在的秒数。数据类型为 String。 --header 'CheckSum: ba193e4d4ba*****598552b79' \ //计算方式详见:https://doc.yunxin.163.com/docs/jcyOTA0ODM/TA5MjEzNTM?platformId=50326 --header 'Content-Type: application/json' \ --data-raw '{ "monitorUid": 666666, "channelName": "neteasetest", "detectType": 0, "scFrequency": 5, "callbackUrl": "***" //接收审核任务的地址,详见2.1 }'
-
开启后,安全通云服务会自动通过指定的 uid 以虚拟房间成员身份加入指定房间,实时监听房间内的音视频流,以此进行内容安全审核。
-
审核结果以消息抄送方式发送至您预留的抄送地址。如果您需要通过其他地址接收审核结果,可以在创建安全通审核任务时,在入参中指定新的抄送地址。
步骤4 接收安全审核结果
-
在准备工作中,我们已配置了接收抄送消息的服务器公网地址,安全审核过程中,会将违规内容实时回调到您配置的地址中,您需要在该地址接口中实现对应审核消息的接收。
PHP 解析抄送内容的相关示例请参见[KB0304] PHP解析网易服务器抄送和回调的Header和Body示例 。
在本次演示中,以实现最简单的抄送内容接收及打印为例。
public String robot(@RequestBody String msg) { logger.info(msg); System.out.println(msg); return "robot"; }
-
默认情况下,安全通仅在监听到违规内容时触发抄送,具体请参见安全通审核事件。
-
您可以在易盾智能审核平台查询内容审核结果,您也可以主动调用网易云信服务端的查询审核视频截图 API ,主动获取审核过程中收集的语音和截图等证据信息。
步骤5 处理审核任务
应用服务器需要基于内容审核结果进行相关业务数据处理,例如移除房间成员,或删除房间。
实现移除房间成员的示例代码如下:
curl --location --request POST 'https://logic-dev.netease.im/v3/api/kicklist/members?cname=neteasetest1&uid=12345' \
--header 'AppKey: ***' \ //请使用您应用的appkey
--header 'Nonce: ***' \ //随机数,最大长度为 128 个字符。
--header 'CurTime: 1639555317' \ //当前 Unix 时间戳,即从 1970 年 1 月 1 日 0 点 0 分 0 秒开始到现在的秒数。数据类型为 String。
--header 'CheckSum: ba193e4d4b***5598552b79' \ //计算方式详见:https://doc.yunxin.163.com/docs/jcyOTA0ODM/TA5MjEzNTM?platformId=50326
--header 'Content-Type: application/json' \
--data-raw ''
实现删除房间的示例代码如下:
https://logic-dev.netease.im/v3/api/rooms?cname=abc
步骤6 结束安全通审核任务
当该音视频通话不再需要安全通服务时,或者结束音视频通话后,需要主动调用接口结束安全通审核任务。具体接口说明请参见停止安全通审核任务。
示例代码如下:
curl --location --request POST 'https://logic-dev.netease.im/livewallsolution/feedback' \
--header 'AppKey: ***' \ //请使用您应用的appkey
--header 'Nonce: ***' \ //随机数,最大长度为 128 个字符。
--header 'CurTime: 1639555317' \ //当前 Unix 时间戳,即从 1970 年 1 月 1 日 0 点 0 分 0 秒开始到现在的秒数。数据类型为 String。
--header 'CheckSum: ba193e4d4***552b79' \ //计算方式详见:https://doc.yunxin.163.com/docs/jcyOTA0ODM/TA5MjEzNTM?platformId=50326
--header 'Content-Type: application/json' \
--data-raw '{
"realTimeInfoList": [
{
"channelName": "neteasetest",
"status": 100
}
]
}'