突破微信小程序图片校验

背景

微信小程序代码审核未通过。原因如下:

为避免您的小程序被滥用,请你完善内容审核机制,如调用小程序内容安全API,或使用其他技术、人工审核手段,过滤色情、违法等有害信息,保障发布内容的安全。
请根据上述原因对小程序进行修改,并重新提交代码审核。

对于涉及图片上传功能的小程序会遇到。

为什么?

为避免用户滥用图片发布色情,暴力,很社会的图片,在发布图片前必须对图片进行验证,如果你没有,那么对不起,你的小程序就无法通过审核。

解决方案

方案一

利用微信提供的方法 msgSecCheck,该方法提供两种调用方式

  • HTTPS 调用
  • 云调用

HTTPS 调用

对于自建服务器的开发者可以使用该方法。(本文不做详细介绍)

云调用(适合个人开发者)

云调用方案创建简单,成本低,适合个人开发者。

  1. 创建云函数
1
2
3
4
- openapi
- config.json
- index.js
- package.json

config.json

1
2
3
4
5
6
7
8
9
// 设置云函数调用方法权限

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

index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// 云函数入口文件

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

1
2
3
4
5
6
7
8
9
// 函数promise化

module.exports = (api) => {
return (options, ...params) => {
return new Promise((resolve, reject) => {
api(Object.assign({}, options, { success: resolve, fail: reject }), ...params);
});
}
}

fileManager.js

1
2
3
4
5
// 文件管理
const promisify = require('./promisify')
const fileSystemManager = wx.getFileSystemManager()
const readFile = promisify(fileSystemManager.readFile)
export { readFile }

index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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.业务代码使用函数

选取图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 => {
//异常
}
})

经典案例

方案二

使用第三方图片校验接口

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信