13.4 内容安全检测

微信小程序的许多业务场景需要通过UGC(用户产生内容)的方式,比如昵称/花名、个人资料签名/日志/聊天/评论、头像/表情/相片、直播等各种场景,其格式内容包括但不限于短文本、长内容、图片或视频等来实现更好的用户体验或更丰富的内容功能和服务场景。但是如果这类功能的使用如果没有做好对用户发布内容的安全审查,可能会产生政治有害等违法违规的内容。一旦被利用进行传播,对小程序用户带来有损的体验,小程序开发者也可能因此承担平台或法律的追责及处罚。因此包含UGC功能的小程序都需要有内容安全检测。

13.4.1 文字内容安全

使用开发者工具新建一个云函数,如msgsec,然后在config.json里添加security.msgSecCheck云调用的权限,使用npm install安装依赖之后,上传并部署所有文件(此时也会更新权限)。

{ "permissions": { "openapi": [ "security.imgSecCheck", "security.msgSecCheck" ] } }

然后再在index.js里输入以下代码,

const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) exports.main = async (event, context) => { try { const result = await cloud.openapi.security.msgSecCheck({ content:`特3456书yuuo莞6543李zxcz蒜7782法fgnv级 完2347全dfji试3726测asad感3847知qwez到` }) return result } catch (error) { return error } }

调用该云函数,接口errcode返回87014(内容含有违法违规内容):

errMsg: "cloud.callFunction:ok", result: { errCode: 87014 errMsg: "openapi.security.msgSecCheck:fail risky content hint: [bgh98a06644711]"}

而如果返回的result.errCode的值为0,说明内容正常。

errMsg: "cloud.callFunction:ok" result: { errMsg: "openapi.security.msgSecCheck:ok", errCode: 0}

13.4.2 图片鉴黄

图片内容安全检测和文字内容安全检测最大的不同在于,我们需要考虑图片传输的耗时以及检测的图片不能大于1M这样的一个限制,当图片尺寸比较大时,我们需要对图片进行压缩处理。而且要检测的图片文件的格式为PNG、JPEG、JPG、GIF,图片尺寸不超过 750px x 1334px。通常情况下我们使用小程序端chooseImage上传图片时,我们尽量要求使用compressed压缩图,相册的压缩图一般都不会超过1M。

  • 如果图片比较小(大约200k以内),我们可以直接把图片存储到云存储里,然后在云函数里下载该图片进行图片安全检测;
  • 如果图片比较大(比如大于100k,小于1M),我们可以把图片存储到云存储之后,在云函数端下载该图片,使用前面所说的Sharp模块,对图片进行压缩处理,然后进行图片安全检测。
  • 如果图片大于1M,那图片的压缩就不建议在云函数端处理,要在小程序端使用Canvas进行压缩,然后再传输到云函数端进行安全检测。
const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) exports.main = async (event, context) => { const fileID = 'cloud://xly-xrlur.786c-xly-xrlur-1300446086/1572315793628-366.png' const res = await cloud.downloadFile({ fileID: fileID, }) const Buffer = res.fileContent try { const result = await cloud.openapi.security.imgSecCheck({ media: { contentType: 'image/png', value: Buffer } }) return result } catch (error) { return error } }

13.4.3 图像内容安全拓展能力