踩了很多次坑,终于在微信小程序中搞定了图片内容安全检测。
最开始看的以前的文章用的是老版本的图片安全检测,在开发者工具中是可以跑通的,但是到了真机调试就无法进行图片检测,后来提了个工单,才知道要用新版本的安全检测——security.mediaCheckAsync。发现以前也看到过这个接口,好像是因为是异步的传输结果,而且还是30分钟内给出结果,于是就放弃了,结果选了个老版本。哎!!
话不多说,我们开始:
参考文章:https://blog.csdn.net/weixin_55109830/article/details/127143342
本文主要根据参考文章进行,由于版本问题,其中有些坑还是要注意。
由于我们用的是新版本,其中有些参数已经改变,这一点要注意。
第一步:创建云函数
我在这里创建了imgcheck2这个云函数

首先要对云函数的config.json文件进行配置,引入我们要用的接口
{
"permissions": {
"openapi": [
"openapi.security.msgSecCheck",
"openapi.security.mediaCheckAsync"
]
}
}
在index.js中进行调用接口
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
console.log(event)
try {
const result = await cloud.openapi.security.mediaCheckAsync({
media_url: event.value,
media_type: 2,
version: 2,
openid: wxContext.OPENID,
scene: 3
})
return result
} catch (err) {
return err;
}
}
注意接口中的参数较以前版本已经改变,且根据文档我们没有填写access_token这个参数

最开始还纳闷这个函数怎么写,查看文档后发现云函数是不用填写的。

最后将云函数进行上传(云端部署),并在云开发工具中添加云函数。

第一步完成。
第二步:创建消息推送
官方说是在30分钟内将结果推送,看着有点吓人,但实测一张图片在10秒内会有结果,甚至5秒也有可能。
我们首先需要一个函数来接收传过来的结果消息,我创建了receiveimgcheck这个云函数

配置文件无需改动,只要将主文件进行编写即可,这是我的代码
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
await cloud.database().collection('imgCheckResult').add({
data:{
traceid:event.trace_id,
result:event.result.suggest
}
})
return event
}
代码非常简单,结果返回到云函数后,将结果result和traceid保存到集合中。
好了接收的云函数有了,下面我们进行配置消息推送

盗用参考文章中的图,点击云开发中的设置、其他设置、推送模式改为云函数、点击添加消息推送,

消息类型选event 、事件类型选wxa_media_check、云函数选刚才创建的云函数。
OK,这样就配置完成了。
第三步 测试
下面是我的测试代码
wx.getFileSystemManager().readFile({
// encoding:'ucs2',
filePath:this.data.localFilesPath[nr],
success(res){
console.log(res)
var buffer = res.data
//传入云函数进行检测
wx.cloud.callFunction({
name:'imagecheck2',
data:{
value:wx.cloud.CDN(buffer)
},
success:res=>{
console.log(res)
traceIds.push(res.result.traceId)
}
})
}
})
}
我将本地选取的图片进行读取,保存成buffer类型,用wx.cloud.CDN保存到CDN中,将图片链接传入云函数中,云函数嗲用成功后会返回给我们traceid,可以根据traceid来定位图片,等待几秒后我们就可以在接收云函数的日志中看到结果啦。

并且集合中也上传了结果和traceid
我们根据traceid可以定位到结果。
db.collection('imgCheckResult').where({
traceid:traceIds[i]
}).get({
success: function(res) {
}
大功告成,可能我的方法运行时间有点长,如果大家有更好的方案,可以在评论区交流。