背景
微信小程序代码审核未通过。原因如下:
为避免您的小程序被滥用,请你完善内容审核机制,如调用小程序内容安全API,或使用其他技术、人工审核手段,过滤色情、违法等有害信息,保障发布内容的安全。 请根据上述原因对小程序进行修改,并重新提交代码审核。
对于涉及图片上传功能的小程序会遇到。
为什么?
为避免用户滥用图片发布色情,暴力,很社会的图片,在发布图片前必须对图片进行验证,如果你没有,那么对不起,你的小程序就无法通过审核。
解决方案
方案一
利用微信提供的方法 msgSecCheck,该方法提供两种调用方式
- HTTPS 调用
- 云调用
HTTPS 调用
对于自建服务器的开发者可以使用该方法。(本文不做详细介绍)
云调用(适合个人开发者)
云调用方案创建简单,成本低,适合个人开发者。
- 创建云函数
- openapi
- config.json
- index.js
- package.json
config.json
// 设置云函数调用方法权限
{
"permissions": {
"openapi": [
"security.imgSecCheck"
]
}
}
index.js
// 云函数入口文件
const cloud = require('wx-server-sdk')
// 初始化云函数
cloud.init({
// API 调用都保持和云函数当前所在环境一致
env: cloud.DYNAMIC_CURRENT_ENV
})
/**
*
* 将 arrayBuffer 转为 buffer
*
*/
function toBuffer(ab) {
let buf = Buffer.from(ab)
return buf;
}
// 云函数入口函数
exports.main = async (event, context) => {
console.log(event)
switch (event.action) {
case 'imgSecCheck': {
return imgSecCheck(event)
}
default: {
return
}
}
}
/**
* 函数imgSecCheck
* 参数 event:{
* file //上传的文件
* }
*
*/
async function imgSecCheck(event) {
let { file } = event
const result = await cloud.openapi.security.imgSecCheck({
media: {
contentType: 'image/png',
value:toBuffer(file)
}
})
return result
}
2.创建调用方法 根据自己实际项目结构创建如下文件
promisify.js
// 函数promise化
module.exports = (api) => {
return (options, ...params) => {
return new Promise((resolve, reject) => {
api(Object.assign({}, options, { success: resolve, fail: reject }), ...params);
});
}
}
fileManager.js
// 文件管理
const promisify = require('./promisify')
const fileSystemManager = wx.getFileSystemManager()
const readFile = promisify(fileSystemManager.readFile)
export { readFile }
index.js
const promisify = require('./promisify')
// 压缩图片,由于 imgSecCheck 方法限制 1M
const compressImage = promisify(wx.compressImage)
import {
readFile
} from './fileManager'
const cloudCall = promisify(wx.cloud.callFunction)
/**
* 图片校验调用函数
* 参数 图片临时路径
*
*/
function imgSecCheck(filePath) {
console.log("imgSecCheck", filePath)
return new Promise((resolve, reject) => {
compressImage({
src: filePath, // 图片路径
quality: 50 // 压缩质量
}).then(res => {
readFile({
filePath: res.tempFilePath
}).then(res => {
console.log("fileManager", res)
console.log("fileManager", res.data.byteLength)
cloudCall({
name: "openapi",
data: {
action: "imgSecCheck",
file: res.data
}
}).then(res => {
console.log("cloudCall", res)
resolve(res)
}).catch(err => {
reject(err)
console.log("cloudCall:err", err)
})
}).catch(err => {
reject(err)
console.log("fileManager:err", err)
})
}).catch(err=>{
reject(err)
console.log("compressImage:err", err)
})
})
}
export {
imgSecCheck
}
3.业务代码使用函数
选取图片
wx.chooseImage({
count: 1,
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
imgSecCheck(res.tempFilePaths).then(res => {
if (res.result.errCode == 0) {
// 图片合法
}
else{
// 图片违法
}
}).catch(err => {
//异常
}
})
方案二
使用第三方图片校验接口
- moderatecontent.com/ (国外)
- www.qiniu.com/products/ce… (国内七牛)