一、概述

一些用户应用即时通信 IM 产品开发实现本人的聊天业务,但对于聊天之间的音讯无奈很好的去管控内容是否违规。

基于数据万象 CI ,对象存储 COS 推出的内容审核性能,能够帮忙用户实现IM音讯的审核服务,在发送进去的音讯是违规内容时,不容许发送(先审后发)。

整体流程可看下图:

内容审核的解决次要在步骤6、7、8。
步骤6:发送审核申请对音讯内容进行审核。
步骤7:返回处理结果。
步骤8:依据后果判断是否发送音讯或是否撤回、删除音讯。

理论聊天成果如下图:

二、筹备工作

(一)即时通信IM 简略DEMO

【Demo入门】一分钟跑通Demo: https://cloud.tencent.com/doc...
IM SDK地址:https://cloud.tencent.com/doc...

依照文档阐明登陆、 获取SDKAppID及密钥信息、 创立利用、 下载DEMO源码、 配置密钥、 编译运行(局部平台须要)

本文例子应用Web&H5,批改GenerateTestUserSig.js 文件配置密钥后,无需编译,可间接拜访dist/index.html,
如:http://127.0.0.1/timSdkH5Demo... 替换服务器地址后能够间接拜访,timSdkH5Demo 为代码目录,可按需批改。
拜访后显示如下页面,可下拉抉择用户登陆,两个用户登陆不同账号即可实现聊天性能。

(二)IM 配置项

登录 即时通信 IM 控制台—回调配置
回调URL配置 >> 编辑:填写回调URL后确认保留。具体回调参数及阐明可拜访 第三方回调简介 。

事件回调配置 >> 编辑:抉择须要的回调事件,以“单聊音讯”为例,选中 “发单聊音讯之前回调”,会在发送音讯前申请回调URL,一系列判断后返回回调后果。

留神:回调URL需公网可见。

这一步须要保障的就是,即时通信IM可实现音讯发送、即时通信IM控制台回调配置实现,且在发送音讯时触发回调URL的申请,回调接口可能接管到申请数据。强调:回调URL接口需公网可见。

三、文字音讯审核具体配置

目前筹备工作曾经做好了,接下来须要思考的有以下几点:

音讯发送时回调接口接管申请参数,确认参数的准确性。

依据不同参数获取到不同音讯内容,如:聊天文本、图片地址等。

对音讯内容进行审核,不同的音讯类型会调用不同的审核接口,接下来的内容会对不同的音讯类型(文本和图片)进行举例说明。

依据审核后果给出不同的返回后果,达到音讯是否容许发送的成果。

Ps: 上面举例说明局部会以Step n来对应下面各点。

以下举例说明都是以审核IM音讯内容为前提,如需审核其余内容,可见各审核文档的具体介绍。

举例说明:

开发工具:SCF 云函数 https://console.cloud.tencent.com/scf (不肯定非要云函数,服务公网可见即可,否则回调申请失败)语言:PHP/7.2.2通信IM SDK以及Demo源码:地址: https://cloud.tencent.com/document/product/269/36887 本文档例子应用Web&H5: https://github.com/tencentyun/TIMSDK/tree/master/H5对象存储SDK文档:PHP SDK地址: https://cloud.tencent.com/document/product/436/12266 (其余语言可见页面左侧栏对应标签)IM配置项:单聊音讯 >> 发单聊音讯之前回调举例音讯类型:文本、图片

Step 1 回调申请参数

第三方回调简介:https://cloud.tencent.com/doc...

回调参数列表:https://cloud.tencent.com/doc...

音讯格局形容:https://cloud.tencent.com/doc...

IM发送音讯后会申请回调URL,本例中对SdkAppid参数做了简略身份验证,如须要其余简单验证可自行判断。

<?phpinclude_once 'commonFunc.php'; // 自定义专用函数,如发送POST、GET申请或做出Response响应等函数的封装include_once 'imMsg.php'; // 自定义音讯审核类,对文本和图片做出审核申请并对审核后果做出是否违规判断include_once 'cos-php-sdk-v5-master/vendor/autoload.php'; // COS内容审核SDK引入,本例应用PHP的SDK$content = file_get_contents('php://input'); // 获取POST JSON数据 字符串$post  = json_decode($content, true); // POST JSON数据 数组// 对SdkAppid做出简略身份验证if(!isset($_GET['SdkAppid']) || $_GET['SdkAppid'] != ImMsg::SDK_APPID) {    imcallback_return(false); // 接口返回后果数据}
** * 函数内列出两种回调后果 * $send true 容许音讯发送;false 禁止音讯发送 */function imcallback_return($send = true) {    $retSuccess = array(        'ErrorCode' => 0, // 0 为容许发言        'ErrorInfo' => '',        'ActionStatus' => 'OK'    );;    $retErr = array(        'ErrorCode' => 1, // 1 为回绝发言        'ErrorInfo' => 'err',        'ActionStatus' => 'FAIL'    );    $ret = $send === true ? $retSuccess : $retErr;    ob_clean();    echo json_encode($ret);}

回调申请示例:

POST /?SdkAppid=123456&CallbackCommand=C2C.CallbackBeforeSendMsg&contenttype=json&ClientIP&OptPlatform HTTP/1.1Host: www.example.com文本类型:{    "MsgBody": [        {            "MsgType": "TIMTextElem", // TIMTextElem 示意音讯类型为文本            "MsgContent": {                "Text": "asdad" // 文本内容            }        }    ],    "CallbackCommand": "C2C.CallbackBeforeSendMsg", // C2C.CallbackBeforeSendMsg 发单聊音讯之前回调    "From_Account": "user1",    "To_Account": "user0",    "MsgRandom": 123,    "MsgSeq": 1234567,    "MsgTime": 1629439393,    "MsgKey": "1234567_123456_123456789",    "OnlineOnlyFlag": 0}图片类型:{    "MsgBody": [        {            "MsgType": "TIMImageElem", // TIMImageElem 示意音讯类型为图片            "MsgContent": {                "UUID": "123456-user1-abcdefghd",                 "ImageFormat": 3,                 "ImageInfoArray": [                    {                        "Type": 1, //原图                        "Size": 43599,                         "Width": 1156,                         "Height": 582,                         "URL": "https://cos.ap-shanghai.myqcloud.com/6244-shanghai-007-shared-01-1256635546/2690-1400560394/e078-user1/582eef3bb1e6439cd842ae0bd6a16cae-101935?imageMogr2/"                    },                     {                        "Type": 2, //大图                        "Size": 0,                         "Width": 0,                         "Height": 0,                         "URL": "https://cos.ap-shanghai.myqcloud.com/6244-shanghai-007-shared-01-1256635546/2690-1400560394/e078-user1/582eef3bb1e6439cd842ae0bd6a16cae-101935?imageMogr2/"                    },                     {                        "Type": 3, //缩量图                        "Size": 0,                         "Width": 394,                         "Height": 198,                         "URL": "https://cos.ap-shanghai.myqcloud.com/6244-shanghai-007-shared-01-1256635546/2690-1400560394/e078-user1/582eef3bb1e6439cd842ae0bd6a16cae-101935?imageMogr2/&imageView2/3/w/198/h/198"                    }                ]            }        }    ],     "CallbackCommand": "C2C.CallbackBeforeSendMsg",     "From_Account": "user1",     "To_Account": "user0",     "MsgRandom": 123,     "MsgSeq": 1234567,     "MsgTime": 1629357746,     "MsgKey": "1234567_123456_123456789",     "OnlineOnlyFlag": 0}

回调应答示例:

HTTP/1.1 200 OKServer: nginx/1.7.10Date: Fri, 09 Oct 2015 02:59:55 GMTContent-Length: 75{  "ActionStatus": "OK",   "ErrorInfo": "",   "ErrorCode": 0 // 1 为回绝发言;0 为容许发言}

即时通信 IM 回调 App 后盾的超时工夫为2秒,且没有重试。如果回调超时,后续解决逻辑与没有配置回调时雷同(例如,假如“发送群音讯之前回调”超时,音讯会失常下发)。

为确保回调成功率,第三方 App 该当尽可能放慢回调处理速度,例如先发送回调应答,而后再解决具体业务逻辑。

Step 2 获取音讯内容

回调类型回调命令字
发单聊音讯之前回调C2C.CallbackBeforeSendMsg
发单聊音讯之后回调C2C.CallbackAfterSendMsg

其余回调命令及相干参数见 回调命令列表。

MsgType的值类型
TIMTextElem文本音讯
TIMImageElem图像音讯

本例中简略获取了文本内容及图片地址URL。

$flag = false;switch($_GET['CallbackCommand']) {    case 'C2C.CallbackBeforeSendMsg': { // 对发单聊音讯之前回调进行封装        $flag = ImMsg::cmdC2cMsgBefore($post);        break;    }    default: {        break;    }}imcallback_return($flag);ImMsg::cmdC2cMsgBeforepublic static function cmdC2cMsgBefore($allData) {    $data = $allData['MsgBody'];    $flag = true;    foreach($data as $msgItem) {        if($msgItem['MsgType'] == 'TIMTextElem') { // 文本类型审核            // $msgItem['MsgContent']['Text'] 文本内容            $flag = self::textDetect($msgItem['MsgContent']['Text']);         } else if($msgItem['MsgType'] == 'TIMImageElem') { // 图片类型审核            // $msgItem['MsgContent']['ImageInfoArray'][0]['URL'] 图片URL地址,原图、大图、缩略图三选一            $flag = self::imgDetect($msgItem['MsgContent']['ImageInfoArray'][0]['URL']);        }    }    return $flag;}

走到这一步,曾经获取到了音讯内容,即:

文本内容:$msgItem'MsgContent'

图片地址:$msgItem'MsgContent'0

接下来对音讯内容发送审核申请并获取审核后果。

Step 3 对音讯内容进行审核,获取审核后果

文本审核:https://cloud.tencent.com/doc...

图片审核:https://cloud.tencent.com/doc...

其余类型的审核可见页面左侧标签相干文档阐明。

对于审核,为了开发者更不便、更疾速地应用数据万象的根底图片解决和媒体解决性能,以及 CDN 的云闪图片散发性能,咱们提供了 SDK,开发者可依据具体需要进行抉择,详情请参见对应的疾速入门文档。对象存储的 SDK 也集成了数据万象的数据处理性能,若您须要应用其余语言的 SDK,例如 C++ 、JavaScript 等,请参见 COS SDK 概览。

图片审核

对于图片审核的图片限度阐明,请参见 规定与限度。

应用COS PHP SDK申请示例 (sample/getObjectSensitiveContentRecognition.php),IM音讯审核应用图片链接审核形式即可。

<?phprequire dirname(__FILE__) . '/../vendor/autoload.php';$secretId = "SECRETID"; //"云 API 密钥 SecretId";$secretKey = "SECRETKEY"; //"云 API 密钥 SecretKey";$region = "ap-beijing"; //设置一个默认的存储桶地区$cosClient = new Qcloud\Cos\Client(    array(        'region' => $region,        'schema' => 'https', //协定头部,默认为http        'credentials' => array(            'secretId' => $secretId,            'secretKey' => $secretKey)));try {    //图片链接审核    $imgUrl = 'https://test.jpg';    $result = $cosClient->getObjectSensitiveContentRecognition(array(        'Bucket' => 'examplebucket-125000000', //格局:BucketName-APPID        'Key' => '/', // 链接图片资源门路写 / 即可        'DetectType' => 'porn,ads',//可选四种参数:porn,politics,terrorist,ads,可应用多种规定,留神规定间不要加空格        'DetectUrl' => $imgUrl,//      'Interval' => 5, // 审核gif时应用 截帧的距离//      'MaxFrames' => 5, // 针对 GIF 动图审核的最大截帧数量,需大于0。//      'BizType' => '', // 审核策略    ));    // 申请胜利    print_r($result);} catch (\Exception $e) {    // 申请失败    echo($e);}

响应后果:

GuzzleHttp\Command\Result Object(    [RequestId] => asdjahsfkjshfkjsdhfkjshfksjhfj=    [PornInfo] => Array        (            [0] => Array                (                    [Code] => 0                    [Msg] => OK                    [HitFlag] => 0                    [Score] => 0                    [Label] =>                 )        )    [AdsInfo] => Array        (            [0] => Array                (                    [Code] => 0                    [Msg] => OK                    [HitFlag] => 0                    [Score] => 0                    [Label] =>                 )        )    [Key] => /    [Bucket] => examplebucket-125000000    [Location] => examplebucket-125000000.cos.ap-guangzhou.myqcloud.com//)

文本审核

应用COS PHP SDK申请示例 (sample/detectText.php),IM音讯审核应用文本内容审核形式即可。

<?phprequire dirname(__FILE__) . '/../vendor/autoload.php';$secretId = "SECRETID"; //"云 API 密钥 SecretId";$secretKey = "SECRETKEY"; //"云 API 密钥 SecretKey";$region = "ap-beijing"; //设置一个默认的存储桶地区$cosClient = new Qcloud\Cos\Client(    array(        'region' => $region,        'schema' => 'https', //协定头部,默认为http        'credentials'=> array(            'secretId'  => $secretId ,            'secretKey' => $secretKey)));try {    // start --------------- 文本内容审核 ----------------- //    $content = '敏感信息';    $result = $cosClient->detectText(array(        'Bucket' => 'examplebucket-125000000', //格局:BucketName-APPID        'Input' => array(            'Content' => base64_encode($content) // 文本需base64_encode        ),        'Conf' => array(            'DetectType' => 'Porn,Terrorism,Politics,Ads', //Porn,Terrorism,Politics,Ads,Illegal,Abuse类型            'BizType' => '',        ),    ));    // 申请胜利    print_r($result);    // end --------------- 文本内容审核 ----------------- //} catch (\Exception $e) {    // 申请失败    echo($e);}

响应后果:

GuzzleHttp\Command\Result Object(    [RequestId] => asdjsajfaslofjsdofjsoifjsf=    [ContentType] => application/xml    [ContentLength] => 1237    [JobsDetail] => Array        (            [Code] => Success            [Message] => Array                (                )            [JobId] => asjhdkjahfkjashfkjsdfhkjs            [State] => Success            [CreationTime] => 2021-09-09T20:04:05+08:00            [Content] => 57qm54Ku            [Result] => 1            [SectionCount] => 1            [PornInfo] => Array                (                    [HitFlag] => 1                    [Count] => 1                )            [TerrorismInfo] => Array                (                    [HitFlag] => 0                    [Count] => 0                )            [PoliticsInfo] => Array                (                    [HitFlag] => 0                    [Count] => 0                )            [AdsInfo] => Array                (                    [HitFlag] => 0                    [Count] => 0                )            [Section] => Array                (                    [0] => Array                        (                            [StartByte] => 0                            [PornInfo] => Array                                (                                    [Code] => 0                                    [HitFlag] => 1                                    [Score] => 97                                    [Keywords] => 敏感词                                )                            [TerrorismInfo] => Array                                (                                    [Code] => 0                                    [HitFlag] => 0                                    [Score] => 0                                    [Keywords] =>                                 )                            [PoliticsInfo] => Array                                (                                    [Code] => 0                                    [HitFlag] => 0                                    [Score] => 0                                    [Keywords] =>                                 )                            [AdsInfo] => Array                                (                                    [Code] => 0                                    [HitFlag] => 0                                    [Score] => 0                                    [Keywords] =>                                 )                        )                )        )    [Bucket] => examplebucket-125000000    [Location] => examplebucket-125000000.ci.ap-guangzhou.myqcloud.com/text/auditing)

Step 4 回调申请返回后果

走到这一步,阐明曾经对音讯内容进行了审核并作出了是否违规的判断,接下来就是返回是否违规的后果即可。

在Step 1回调应答示例中也提到了,ErrorCode=1回绝发言,ErrorCode=0容许发言。

HTTP/1.1 200 OKServer: nginx/1.7.10Date: Fri, 09 Oct 2015 02:59:55 GMTContent-Length: 75{  "ActionStatus": "",   "ErrorInfo": "",   "ErrorCode": 0 // 1 为回绝发言;0 为容许发言}

在用户侧成果为:

具体参数及含意或其余应答形式可见 第三方回调简介 或同页面左侧其余文档页。

至此,IM发送音讯、IM申请回调、音讯内容审核、回调应答、音讯发送后果,所有步骤均已实现。

四、写在最初

随着各种网络安全法律法规和战略规划相继出台,监管部门对网络内容安全监管将日趋严格,对音讯监管也日趋严格。对于聊天之间的音讯如何把控也成为了重要的问题?对象存储本次推出的内容审核性能,能够帮忙用户实现IM音讯的审核服务,对于违规内容进行审核把控,为您的网络安全保驾护航。对于更多内容审核请返回:https://cloud.tencent.com/doc...