安全通

更新时间: 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对1音视频通话

    客户端创建音视频通话后,默认会创建一个实时音视频房间。

    您也可以通过网易云信 RTC 服务端 API 创建一个实时音视频房间

步骤3 创建安全通审核任务

  • 创建安全通审核任务之前,请确保房间已创建且房间中已有一名以上成员。
  • 安全通审核任务的开始和结束,都是针对房间。
  1. 创建实时音视频房间后,您可以通过网易云信 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
    }'
    
  2. 开启后,安全通云服务会自动通过指定的 uid 以虚拟房间成员身份加入指定房间,实时监听房间内的音视频流,以此进行内容安全审核。

  3. 审核结果以消息抄送方式发送至您预留的抄送地址。如果您需要通过其他地址接收审核结果,可以在创建安全通审核任务时,在入参中指定新的抄送地址。

步骤4 接收安全审核结果

  1. 在准备工作中,我们已配置了接收抄送消息的服务器公网地址,安全审核过程中,会将违规内容实时回调到您配置的地址中,您需要在该地址接口中实现对应审核消息的接收。

    PHP 解析抄送内容的相关示例请参见[KB0304] PHP解析网易服务器抄送和回调的Header和Body示例

    在本次演示中,以实现最简单的抄送内容接收及打印为例。

    public String robot(@RequestBody String msg) {
            logger.info(msg);
            System.out.println(msg);
            return "robot";
        }
    
  2. 默认情况下,安全通仅在监听到违规内容时触发抄送,具体请参见安全通审核事件

  3. 您可以在易盾智能审核平台查询内容审核结果,您也可以主动调用网易云信服务端的查询审核视频截图 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 时间戳,即从 197011000 秒开始到现在的秒数。数据类型为 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
        }
    ]
}'
此文档是否对你有帮助?
有帮助
去反馈
  • 功能介绍
  • 技术原理
  • 示例代码
  • 操作流程
  • 配置步骤
  • 步骤1 准备工作
  • 步骤2 创建音视频通话
  • 步骤3 创建安全通审核任务
  • 步骤4 接收安全审核结果
  • 步骤5 处理审核任务
  • 步骤6 结束安全通审核任务