在应用中,所有由用户生产的内容(UGC),而又有可能被其他用户访问到时,都应该经过内容安全审查。在微信小程序内,UGC的内容如果没有安全审查,小程序是不允许上架的。完全依靠人来审核成本巨大,本小节就来教大家使用微信提供的内容安全审查接口,可以审查图片,音频,文本的内容是否合规。
我们应当在以下场景使用文本内容审查接口:
POST https://api.weixin.qq.com/wxa/msg_sec_check?access_token=ACCESS_TOKEN
该接口的调用频率限制为:单个 appId 调用上限为 4000 次/分钟,2,000,000 次/天
请求参数:
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
access_token / cloudbase_access_token | string | 是 | 接口调用凭证 | |
version | number | 是 | 接口版本号,2.0版本为固定值2 | |
openid | string | 是 | 用户的openid(用户需在近两小时访问过小程序) | |
scene | number | 是 | 场景枚举值(1 资料;2 评论;3 论坛;4 社交日志) | |
content | string | 是 | 需检测的文本内容,文本字数的上限为2500字,需使用UTF-8编码 | |
nickname | string | 否 | 用户昵称,需使用UTF-8编码 | |
title | string | 否 | 文本标题,需使用UTF-8编码 | |
signature | string | 否 | 个性签名,该参数仅在资料类场景有效(scene=1),需使用UTF-8编码 |
在uniCloud云函数中使用
//获取小程序的AccessToken
const access_token = await getAccessToken();
//http方式调用文本内容审查接口
const res = await uniCloud.httpclient.request("https://api.weixin.qq.com/wxa/msg_sec_check?access_token="+access_token,{
method:"POST",
dataType:"json",
headers:{
"Content-Type":"application/json"
},
data:{
version:2,
openid:openid,//生产内容用户的openid
scene:2,//场景值
content:content//需检测的文本内容
}
})
/*
返回的数据结构
{
"errcode": 0,
"errmsg": "ok",
"result": {
"suggest": "risky",
"label": 20001
},
"detail": [
{
"strategy": "content_model",
"errcode": 0,
"suggest": "risky",
"label": 20006,
"prob": 90
},
{
"strategy": "keyword",
"errcode": 0,
"suggest": "pass",
"label": 20006,
"level": 20,
"keyword": "命中的关键词1"
},
{
"strategy": "keyword",
"errcode": 0,
"suggest": "risky",
"label": 20006,
"level": 90,
"keyword": "命中的关键词2"
}
],
"trace_id": "60ae120f-371d5872-7941a05b"
}
*/
返回的数据结构内容有点多,但一般情况下我们只需要检查result
中的suggest
是否为pass
(通过)
if(res.data.result.suggest!="pass"){
return "该内容无法通过安全审查";
}
注意:此接口已在2021年9月1日停止更新,但目前依然可用。新版本的接口已经全面改为异步返回审查结果。
应用场景举例:
POST https://api.weixin.qq.com/wxa/img_sec_check?access_token=ACCESS_TOKEN
该接口的调用频率限制为:单个 appId 调用上限为 2000 次/分钟,200,000 次/天 ( 图片大小限制:1M )
请求参数:
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
access_token / cloudbase_access_token | string | 是 | 接口调用凭证 | |
media | FormData | 是 | 要检测的图片文件,格式支持PNG、JPEG、JPG、GIF,图片尺寸不超过 750px x 1334px |
在uniCloud云函数中使用
//获取小程序accesstoken
const access_token = await getAccessToken();
//需要用form表单的形式提交图片内容
//FormData需要npm install form-data
let form = new FormData();
//添加图片buffer到form表单中
form.append('media', buffer, {
filename: `${Date.now()}.jpg`,
contentType: 'image/jpeg'
})
//http方式调用微信图片内容安全审查接口
const res = await uniCloud.httpclient.request("https://api.weixin.qq.com/wxa/img_sec_check?access_token="+access_token+"&type=image",{
method:"POST",
content: form.getBuffer(),
headers: form.getHeaders(),
dataType:"json"
})
//返回值的errCode为0即安全,反之内容可能不安全
if(res.data.errCode!=0){
return "该内容无法通过安全审查";
}
如果我们要审查一个图片网址,可以读取网址图片
const imageRes = await uniCloud.httpclient.request("图片URL");
//imageRes.data就是buffer
注意:此接口为新的异步接口,异步检测结果在 30 分钟内会推送到你的消息接收服务器
应用场景举例:
POST https://api.weixin.qq.com/wxa/media_check_async?access_token=ACCESS_TOKEN
该接口的调用频率限制为:单个 appId 调用上限为 2000 次/分钟,200,000 次/天;文件大小限制:单个文件大小不超过10M
请求参数:
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
access_token / cloudbase_access_token | string | 是 | 接口调用凭证 | |
media_url | string | 是 | 要检测的图片或音频的url,支持图片格式包括jpg, jepg, png, bmp, gif(取首帧),支持的音频格式包括mp3, aac, ac3, wma, flac, vorbis, opus, wav | |
media_type | number | 是 | 1:音频;2:图片 | |
version | number | 是 | 接口版本号,2.0版本为固定值2 | |
openid | string | 是 | 用户的openid(用户需在近两小时访问过小程序) | |
scene | number | 是 | 场景枚举值(1 资料;2 评论;3 论坛;4 社交日志) |
注意:media_type 需要准确填写 url 对应的多媒体类型,media_url 需要保证可以被检测服务器下载
在uniCloud云函数中使用
//获取小程序的AccessToken
const access_token = await getAccessToken();
//http方式调用文本内容审查接口
const res = await uniCloud.httpclient.request("https://api.weixin.qq.com/wxa/media_check_async?access_token="+access_token,{
method:"POST",
dataType:"json",
headers:{
"Content-Type":"application/json"
},
data:{
version:2,
openid:openid,//生产内容用户的openid
scene:2,//场景值
media_url:"需检测的图片或音频URL",
media_type:2,//1:音频;2:图片
}
})
/*
接口返回结果
{
"errcode" : 0,
"errmsg" : "ok",
"trace_id" : "967e945cd8a3e458f3c74dcb886068e9"
}
*/
由于审查结果是异步返回的,所以我们需要自行在数据库中将审查内容URL和trace_id存储起来,当异步接收到审查结果时进行处理。
异步审查结果将在 30 分钟内会推送到你的消息接收服务器
{
"ToUserName": "gh_9df7d78a1234",
"FromUserName": "o4_t144jTUSEoxydysUA2E234_tc",
"CreateTime": 1626959646,
"MsgType": "event",
"Event": "wxa_media_check",
"appid": "wx8f16a5be77871234",
"trace_id": "60f96f1d-3845297a-1976a3ae",
"version": 2,
"detail": [{
"strategy": "content_model",
"errcode": 0,
"suggest": "pass",
"label": 100,
"prob": 90
}],
"errcode": 0,
"errmsg": "ok",
"result": {
"suggest": "pass",
"label": 100
}
}
本课程的特点就是实战章节会覆盖大部分的常见需求,比如本节中媒体内容异步审查结果是通过小程序的客服消息机制推送回来的。在实战4:用云函数URL化开发微信客服机器人里,我们已经完全掌握了客服消息机制的处理。所以我们只需要在客服消息的云函数中增加审查异步结果的事件处理逻辑即可。
if(receiveMsg.MsgType==='event'&&receiveMsg.Event==='wxa_media_check'){
if(receiveMsg.result.suggest==='pass'){
//对数据库中存储待审查内容的记录进行处理
//receiveMsg.trace_id
}
}
微信新的接口全面改用异步返回审查结果,这会给我们对于内容的处理增加一些麻烦。我们可以用一些小技巧,比如用户发布的内容在审查结果出来之前是一种仅自己可见的状态,只有接收到审查结果,并且确认内容安全后才将内容更新为公开状态。但内容的发布者对于这一切是无感知的。