【实践总结】微信小程序穿透图片校验

2,327 阅读2分钟

背景

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

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

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

为什么?

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

解决方案

方案一

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

  • HTTPS 调用
  • 云调用

HTTPS 调用

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

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

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

  1. 创建云函数
- 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 => {
          //异常
      }
    })

方案二

使用第三方图片校验接口

微信扫码查看示例

示例二维码

转载