最近在一个云开发话题中分享了我使用云开发的一些经验和心得,却不曾想,被柠檬精投诉涉嫌未设置过滤违法、违规等不当信息内容的机制。。。。其实早前做恋人圈功能的初衷只是可以分享恋人们的幸福时刻,我太难了。。。不过之所以会被投诉,也怪我自己,安全检测的部分代码有Bug(目前已修复)
那今天,就来分享一下官方提供的内容安全检测接口
首先,在云函数的config.json里面添加API权限配置:
{
"permissions": {
"openapi": [
"security.msgSecCheck",
"security.imgSecCheck"
]
}
}
云函数代码如下:
let result = {};
try {
const {type, buffer, content} = event;
//当检测内容是图片类型时buffer不为空,检测内容是文本时content不为空
console.log("检测类型:", type, "文本内容:", content);
switch (type) {
case "imgSecCheck":
result = await cloud.openapi.security.imgSecCheck({
media: {
contentType: 'image/png',
// value: Buffer.from(imgBase64, "base64")
value: Buffer.from(buffer)
}
});
break;
case "msgSecCheck":
result = await cloud.openapi.security.msgSecCheck({content});
break;
default:
console.log("不支持的检测类型:", type);
break;
}
} catch (e) {
console.error(e);
result = e;
}
console.log("检测结果:", result);
//当检测码等于87014时,表示内容含有违规信息
return {success: result.errCode !== 87014 ? "Y" : "N", msg: result.errMsg};
文本的检测其实没什么好说的,主要是图片的检测
图片的安全检测官方要求图片大小不能超过1M。但是现在的手机摄像头像素是越来越高,随便拍张照片都好几M,所以需要先用一张小尺寸压缩过的图片做检测,检测通过后再把大尺寸图片上传到服务端。
/**
* 用小尺寸图片做安全检测
* @param basePage 页面对象
* @param cutArea 我自己封装的裁剪图片对象
* @private
*/
_securityCheckUseSmallImage: function (basePage, cutArea) {
const that = this;
console.log("开始用小尺寸图片做安全检测");
return new Promise((resolve, reject) => {
wx.canvasToTempFilePath({
canvasId: 'targetImg',
x: cutArea.x,
y: cutArea.y,
width: cutArea.width,
height: cutArea.height,
destWidth: 80,//小尺寸
destHeight: 80,//小尺寸
quality: 0.8,//压缩图片质量
success(res) {
const tempFilePath = res.tempFilePath;
that._readFile(tempFilePath).then(readFileResult => {
console.log("开始检测图片是否包含违法违规内容", tempFilePath);
wx.showLoading({title: '开始检测图片', mask: true});
//调用服务端内容安全检测接口
basePage.securityCheckHandler({
type: "imgSecCheck",
buffer: readFileResult
}).then(securityCheckRes => {
if (securityCheckRes.result.success ==="N" || securityCheckRes.result.securityCheck == "FAILED") {
console.log("上传的图片不合法规", securityCheckRes);
reject({checkFail: true, msg: "上传的图片不合法规,请重新上传"});
return;
}
console.log("图片检测通过");
resolve();
}).catch(securityCheckRes => {
console.error(securityCheckRes);
reject({checkFail: true, msg: "图片太大,上传失败"});
});
}).catch(reason => {
wx.showToast({title: '读取图片失败', icon: 'none', duration: 1500});
console.error(reason);
});
}
});
});
},
/**
* 读取文件
* @param tempFilePath
* @returns {Promise}
* @private
*/
_readFile: function (tempFilePath) {
return new Promise(((resolve, reject) => {
wx.getFileSystemManager().readFile({
// encoding: "base64",
filePath: tempFilePath,
success: res => {
console.log("读取文件成功:", res);
resolve(res.data);
},
fail: err => {
console.error("读取文件失败:", err);
reject(err);
}
});
}));
},
大概就是这些了。如果有做UGC,最好还是加上这个吧。免得被柠檬精举报
另外附上如果要做UGC需要添加的类目、提供对应资质材料