信息内容安全检测 【恋人小清单开发总结】
发布于 5 年前 作者 fuxiulan 1425 次浏览 来自 分享

最近在一个云开发话题中分享了我使用云开发的一些经验和心得,却不曾想,被柠檬精投诉涉嫌未设置过滤违法、违规等不当信息内容的机制。。。。其实早前做恋人圈功能的初衷只是可以分享恋人们的幸福时刻,我太难了。。。不过之所以会被投诉,也怪我自己,安全检测的部分代码有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](/user/param) basePage 页面对象
 * [@param](/user/param) cutArea  我自己封装的裁剪图片对象
 * [@private](/user/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.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](/user/param) tempFilePath
 * [@returns](/user/returns) {Promise<any>}
 * [@private](/user/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需要添加的类目、提供对应资质材料

回到顶部