首先找到小程序官方文档
node端使用的是request库,虽然已经不维护了。
npm install request --save
可以把相关的函数封装一下:
获取accesstoken
const request = require('request')
// 这里是一些配置信息,如appid和scrert
const mp = require('../config/mp')
/**
*@name 获取小程序accesstoken
*@author zzc
*@date 2020-2-25
*/
const getAccessToken = () => {
return new Promise((resolve, reject) => {
const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${mp.mpAppId}&secret=${mp.mpSsecret}`
request(url, function(error, response, body) {
if(error) {
reject(error)
} else {
const res = JSON.parse(body)
resolve(res.access_token)
}
})
})
}
/**
*@name 小程序图片敏感内容检查
*@author zzc
*@param { String } access_token access_token
*@param { FormData } media 要检测的图片文件,图片尺寸不超过 750px x 1334px
*@date 2020-2-25
*/
const imgSecCheck = (access_token, media) => {
return new Promise((resolve, reject) => {
const url = `https://api.weixin.qq.com/wxa/img_sec_check?access_token=${access_token}`
request.post({
url,
headers: {
'content-type': 'application/json; charset=utf-8'
},
formData: { media },
}, function(error, response, body) {
if(error) {
reject(error)
} else {
resolve(body)
}
})
})
}
module.exports = {
getAccessToken,
imgSecCheck,
}
注意看小程序官方文档
这里要求的检测图片是formdata格式,一开始就是不知道formdata到底是什么样的,获取图片我使用了connect-multiparty;
ok,接下来写路由接口,我们直接使用fs.createReadStream返回后的值直接传入media。
const express = require('express');
const router = express.Router();
const multipart = require('connect-multiparty');
const fs = require('fs')
const mpUtil = require('../utils/mpUtil')
router.post('/imgCheck', multipart(), async (req, res) => {
const { files } = req
const stream = fs.createReadStream(files.file.path)
const accesstoken = await mpUtil.getAccessToken()
const checkResult = await mpUtil.imgSecCheck(accesstoken, stream)
const jsonResult = JSON.parse(checkResult)
if (jsonResult.errcode !== 0) {
res.send({
code: 500,
errMsg: '存在敏感违规图片!,请删除后重试',
})
} else {
res.send({
code: 200,
errMsg: 'ok',
})
}
})
一开始还去找什么buffer,直接stream传入就ok啦,不过在电脑端调试不太传让太大的图片,会因为文件流内容太长而导致报错,因为没有压缩,手机端会压缩不会存在这个情况。