踩了很多次坑,终于在微信小程序中搞定了图片内容安全检测。
最开始看的以前的文章用的是老版本的图片安全检测,在开发者工具中是可以跑通的,但是到了真机调试就无法进行图片检测,后来提了个工单,才知道要用新版本的安全检测——security.mediaCheckAsync。发现以前也看到过这个接口,好像是因为是异步的传输结果,而且还是30分钟内给出结果,于是就放弃了,结果选了个老版本。哎!!
话不多说,我们开始:
参考文章:/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) {}
大功告成,可能我的方法运行时间有点长,如果大家有更好的方案,可以在评论区交流。
如果觉得《微信小程序 图片内容安全检测实例总结 security.mediaCheckAsync》对你有帮助,请点赞、收藏,并留下你的观点哦!