当前位置:   article > 正文

微信小程序云调用security.mediaCheckAsync接口成功实例(内容安全审核接口)

mediacheckasync

网上关于这个接口大多是介绍,我真正的用在实际环境中还是花了很多功夫在研究出来的,关于这个文章很少,微信论坛问这个的很多,有用的消息零零散散的,最后还是通过我持续不断的看才真正的完成了这个实例,不过前段日子在忙,这个实例写了也有一段时间了,有些细节可能忘记了,但思路应该是没错的,有错误或遗漏喜欢指正。

微信官方文档关于mediaCheckAsync:

security.mediaCheckAsync | 微信开放文档 (qq.com)

一、使用场景

我是在用户发布内容的时候,需要对图片进行检测,因此使用到mediaCheckAsync这个接口,下面代码看不懂跳过就行,反正就是wx.cloud.callFunction({name:'checkImg}),就是调用checkImg云函数判断是否违规

  1. submitForm(e) {
  2. //....防抖
  3. //....文字审核
  4. //内容审核代码开始
  5. wx.showLoading({
  6. title: '审核图片中',
  7. })
  8. let traceIdArr = []
  9. for (let i = 0; i < this.data.images.length; i++) {
  10. const {
  11. result: {
  12. traceId
  13. }
  14. } = await wx.cloud.callFunction({
  15. name: 'checkImg',
  16. data: {
  17. mediaUrl: wx.cloud.CDN({
  18. type: 'filePath',
  19. filePath: this.data.images[i],
  20. })
  21. }
  22. })
  23. traceIdArr.push(traceId)
  24. }
  25. wx.hideLoading({
  26. success: (res) => {},
  27. })
  28. //内容审核代码结束
  29. //上传数据
  30. const {
  31. _id
  32. } = await wx.cloud.database().collection("artwork")
  33. .add({
  34. data: {
  35. comment: [],
  36. like: [],
  37. content: e.detail.value.content,
  38. imageArr: imageContainer,
  39. fatherSceneId: this.data.fatherSceneId,
  40. openId: openId,
  41. time: time
  42. }
  43. })
  44. //把内容审核返回的trace_id和上传集合的id,添加到新的集合trace_id里面
  45. for (let i = 0; i < traceIdArr.length; i++) {
  46. await wx.cloud.database().collection('trace_id')
  47. .add({
  48. data: {
  49. _id: traceIdArr[i],
  50. artwork_id: _id,
  51. openId: this.data.openId
  52. }
  53. })
  54. }

 二、介绍一下mediaCheckAsync

由下图所示:mediaCheckAsync需要这5个参数:

1.openId直接在云函数获取

2.mediaType 图片肯定选2

3.version选2,

4.scene我不知道哪个最严,我估计是3吧,我就固定3了

5.mediaUrl需要图片url,用户上传的一般都是临时地址,而mediaUrl传临时地址无效

我翻遍论坛看到有人说用wx.cloud.CDN可以在云函数调用中把临时图片地址转成 HTTP URL路径,函数地址如下:

Cloud | 微信开放文档 (qq.com)

三、云函数

创建一个云函数,我命名叫checkImg

然后config.json中配置(有用到msgSecCheck也一起配置了):

  1. {
  2.   "permissions": {
  3.     "openapi": [
  4.       "security.msgSecCheck",
  5.       "security.mediaCheckAsync"
  6.     ]
  7.   }
  8. }

然后直接调用,代码如下:

  1. // 云函数入口文件
  2. const cloud = require('wx-server-sdk')
  3. cloud.init({
  4. env: cloud.DYNAMIC_CURRENT_ENV
  5. })
  6. // 云函数入口函数
  7. exports.main = async (event, context) => {
  8. const wxContext = cloud.getWXContext()
  9. console.log(event)
  10. try {
  11. return await cloud.openapi.security.mediaCheckAsync({
  12. mediaUrl: event.mediaUrl,
  13. mediaType: 2,
  14. version: 2,
  15. openid: wxContext.OPENID,
  16. scene: 3
  17. })
  18. } catch (err) {
  19. return err;
  20. }
  21. }

然后最关键的地方来了,这个结果是异步的,就意味着几乎不可能光等这个异步消息回来,然后再将函数往下执行,这样子用户发布的体验极差,所以只能等用户发布完,可以开一个待审核区域,然后等数据回来判断是否违规,才能判断是否可以通过,有条件的话可以写个待审核页面,我懒得写,所以后面是懒人写法。

四、接收异步检测结果配置

官网:点击查看消息接收服务器配置

首先点开云开发置找到消息推送:

然后添加消息推送,有三个要选择的

消息类型选Event 事件类型选择wxa_media_check(就不求证了,想知道可以看看官网关于消息推送的内容)

云函数就是自己新创建一个新的函数、然后选择他

我这里对应创建receiveCheckImg

然后点击启用:

 五、接收异步检测结果云函数receiveCheckImg

整体函数是这样(如果看不懂,可以看后面的思路)

  1. // 云函数入口文件
  2. const cloud = require('wx-server-sdk')
  3. cloud.init({
  4. env: cloud.DYNAMIC_CURRENT_ENV
  5. })
  6. // 云函数入口函数
  7. exports.main = async (event, context) => {
  8. const wxContext = cloud.getWXContext()
  9. setTimeout(async () => {
  10. if (event.result.suggest == 'review' || event.result.suggest == 'risky') {
  11. //通过trace_id拿到哪个类型的集合发来的审核
  12. const trace = await cloud.database().collection('trace_id')
  13. .doc(event.trace_id)
  14. .get()
  15. //trace拿到就可以删掉了
  16. cloud.database().collection('trace_id')
  17. .doc(event.trace_id)
  18. .remove()
  19. if (trace.data.artwork_id) {
  20. //后台删除
  21. }else if (trace.data.food_id){
  22. //后台删除
  23. }else if (trace.data.house_id){
  24. //后台删除
  25. }else if (trace.data.shop_id){
  26. //后台删除
  27. }
  28. } else {
  29. cloud.database().collection('trace_id')
  30. .doc(event.trace_id)
  31. .remove()
  32. }
  33. }, 35000)
  34. }

微信这个异步接口,官方说是30分钟内会返回结果,有时候又会很快返回,这个不是我们开发者能控制的。

反正就是不能等检测结果回来再上传图片,不然一个发布可能要等30多分钟,所以直接先上传用户的内容,结果回来再判断是否违规。

流程如下:

用户上传图片———点击发布————图片给内容安全检测————用户内容上传到后台————内容安全检测结果回来————如果违规从后台删除用户内容

有条件的可以写一个待审批页面,先上传到待审批页面,结果回来没有违规,再上传到正常浏览页面。

懒人跟着我继续我的骚操作:

我估摸着用户上传图片到后台,再到全部发布完成出现在页面中,大概几秒到半分钟的时间,如果用户还没把全部东西上传到后台,检测结果回来了,我就不能在后台找到这个内容了。

打个比方来说:用户内容需要30秒上传到后台,检测结果15秒钟回来了,检测判断代码找不到用户内容,就删除不了。如果检测结果1分钟才回来,检测判断代码就可以看到后台已经有用户内容了,若违规就可以删除。

我这里是setTimeout等了35秒钟,才发检测申请,这样能大致保证用户上传完之后再被检测判断等操作,这也是微信内容安全检测的弊端,消息回来0-30分钟,不能保证实时检测。

六、异步检测结果

异步检测结果在云函数的日志里看:

receiveCheckImg的异步返回结果大致如下:

  1. {
  2. "CreateTime": 1664629839,
  3. "Event": "wxa_media_check",
  4. "FromUserName": "oUaiR5Eq8FW4t4ulYUyis29dbfYU",
  5. "MsgType": "event",
  6. "ToUserName": "gh_e950c4848290",
  7. "appid": "手动屏蔽哈哈哈哈!",
  8. "detail": [
  9. {
  10. "errcode": 0,
  11. "label": 20002,
  12. "prob": 90,
  13. "strategy": "content_model",
  14. "suggest": "risky"
  15. }
  16. ],
  17. "errcode": 0,
  18. "errmsg": "ok",
  19. "result": {
  20. "label": 20002,
  21. "suggest": "risky"
  22. },
  23. "trace_id": "63383c4b-4a47d694-20726f05",
  24. "userInfo": {
  25. "appId": "手动屏蔽哈哈哈哈!",
  26. "openId": "oUaiR5Eq8FW4t4ulYUyis29dbfYU"
  27. },
  28. "version": 2
  29. }

有用的就两个:

一个是trace_id,他是内容审核的唯一标识

一个是result的suggest属性,不用detail是因为,detail会分两种情况,一个是微信那边审核的结果,一个是你自己设置额外屏蔽条件的结果,而result是综合了两个结果得出的值。

result三种结果ok review risky 其中review应该是人工审核,但我懒就都当作违规了。

七、后续违规处理(这个算是附加内容,因为前面已经收到异步消息结果了,怎么处理自行发挥)

处理的关键是:你知道异步消息结果是对应哪个图片的审核吗?

trace_id就是解决这个问题的关键,算是内容审核结果的唯一标识,在异步检测结果中会获得,然后最开始调用 cloud.openapi.security.mediaCheckAsync返回结果也有trace_id

内容审核不是在一个地方用,要对很多集合进行检测,所以trace_id添加到各个集合中,查找起来太麻烦,要遍历所有的集合。

我的解决方式用到的是一个中介集合,新创建了一个集合trace_id

这个集合的_id就是trace_id

如果内容审核的是关于artwork集合的 就在下面添加artwork_id

如果内容审核的是关于foodArtwork集合的 就在下面添加foodArtwork_id

如果内容审核的是关于houserArtwork集合的 就在下面添加houseArtwork_id

这样子就可以通过这个属性名直接在对应的集合里面寻找对应trace_id的记录了

  1. if (trace.data.artwork_id) {
  2. //处理artwork集合
  3. }else if (trace.data.food_id){
  4. //处理food集合
  5. }else if (trace.data.house_id){
  6. //处理house集合
  7. }else if (trace.data.shop_id){
  8. //处理shop集合
  9. }

如果不明白的可以看看最开始的代码块的下面这个部分:

  1.  await wx.cloud.database().collection('trace_id')
  2.                 .add({
  3.                     data: {
  4. //trace_id
  5.                         _id: traceIdArr[i],
  6. //xxx集合的检测就设置xxx_id,这样在中介集合标识下可以直接找到对应审核对象
  7.                         artwork_id: _id,
  8.                         openId: this.data.openId
  9.                     }
  10.                 })
  11.         }

(当然没有看过我的代码原貌,有点难以理解,不过这个不是重点,利用中介集合这个思路才是后续处理的关键!!)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/577223
推荐阅读
相关标签
  

闽ICP备14008679号