微信小程序云调用security.mediaCheckAsync接口成功实例(内容安全审核接口)
網上關于這個接口大多是介紹,我真正的用在實際環境中還是花了很多功夫在研究出來的,關于這個文章很少,微信論壇問這個的很多,有用的消息零零散散的,最后還是通過我持續不斷的看才真正的完成了這個實例,不過前段日子在忙,這個實例寫了也有一段時間了,有些細節可能忘記了,但思路應該是沒錯的,有錯誤或遺漏喜歡指正。
微信官方文檔關于mediaCheckAsync:
security.mediaCheckAsync | 微信開放文檔 (qq.com)
一、使用場景
我是在用戶發布內容的時候,需要對圖片進行檢測,因此使用到mediaCheckAsync這個接口,下面代碼看不懂跳過就行,反正就是wx.cloud.callFunction({name:'checkImg}),就是調用checkImg云函數判斷是否違規
submitForm(e) {//....防抖//....文字審核//內容審核代碼開始wx.showLoading({title: '審核圖片中',})let traceIdArr = []for (let i = 0; i < this.data.images.length; i++) {const {result: {traceId}} = await wx.cloud.callFunction({name: 'checkImg',data: {mediaUrl: wx.cloud.CDN({type: 'filePath',filePath: this.data.images[i],})}})traceIdArr.push(traceId)}wx.hideLoading({success: (res) => {},})//內容審核代碼結束//上傳數據const {_id} = await wx.cloud.database().collection("artwork").add({data: {comment: [],like: [],content: e.detail.value.content,imageArr: imageContainer,fatherSceneId: this.data.fatherSceneId,openId: openId,time: time}})//把內容審核返回的trace_id和上傳集合的id,添加到新的集合trace_id里面for (let i = 0; i < traceIdArr.length; i++) {await wx.cloud.database().collection('trace_id').add({data: {_id: traceIdArr[i],artwork_id: _id,openId: this.data.openId}})}?二、介紹一下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也一起配置了):
{"permissions":?{"openapi":?["security.msgSecCheck","security.mediaCheckAsync"]}}然后直接調用,代碼如下:
// 云函數入口文件 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 {return await cloud.openapi.security.mediaCheckAsync({mediaUrl: event.mediaUrl,mediaType: 2,version: 2,openid: wxContext.OPENID,scene: 3})} catch (err) {return err;} }然后最關鍵的地方來了,這個結果是異步的,就意味著幾乎不可能光等這個異步消息回來,然后再將函數往下執行,這樣子用戶發布的體驗極差,所以只能等用戶發布完,可以開一個待審核區域,然后等數據回來判斷是否違規,才能判斷是否可以通過,有條件的話可以寫個待審核頁面,我懶得寫,所以后面是懶人寫法。
四、接收異步檢測結果配置
官網:點擊查看消息接收服務器配置”
首先點開云開發置找到消息推送:
然后添加消息推送,有三個要選擇的
消息類型選Event 事件類型選擇wxa_media_check(就不求證了,想知道可以看看官網關于消息推送的內容)
云函數就是自己新創建一個新的函數、然后選擇他
我這里對應創建receiveCheckImg
然后點擊啟用:
?五、接收異步檢測結果云函數receiveCheckImg
整體函數是這樣(如果看不懂,可以看后面的思路)
// 云函數入口文件 const cloud = require('wx-server-sdk')cloud.init({env: cloud.DYNAMIC_CURRENT_ENV }) // 云函數入口函數 exports.main = async (event, context) => {const wxContext = cloud.getWXContext()setTimeout(async () => {if (event.result.suggest == 'review' || event.result.suggest == 'risky') {//通過trace_id拿到哪個類型的集合發來的審核const trace = await cloud.database().collection('trace_id').doc(event.trace_id).get()//trace拿到就可以刪掉了cloud.database().collection('trace_id').doc(event.trace_id).remove()if (trace.data.artwork_id) {//后臺刪除}else if (trace.data.food_id){//后臺刪除}else if (trace.data.house_id){//后臺刪除}else if (trace.data.shop_id){//后臺刪除}} else {cloud.database().collection('trace_id').doc(event.trace_id).remove()}}, 35000)}微信這個異步接口,官方說是30分鐘內會返回結果,有時候又會很快返回,這個不是我們開發者能控制的。
反正就是不能等檢測結果回來再上傳圖片,不然一個發布可能要等30多分鐘,所以直接先上傳用戶的內容,結果回來再判斷是否違規。
流程如下:
用戶上傳圖片———點擊發布————圖片給內容安全檢測————用戶內容上傳到后臺————內容安全檢測結果回來————如果違規從后臺刪除用戶內容
有條件的可以寫一個待審批頁面,先上傳到待審批頁面,結果回來沒有違規,再上傳到正常瀏覽頁面。
懶人跟著我繼續我的騷操作:
我估摸著用戶上傳圖片到后臺,再到全部發布完成出現在頁面中,大概幾秒到半分鐘的時間,如果用戶還沒把全部東西上傳到后臺,檢測結果回來了,我就不能在后臺找到這個內容了。
打個比方來說:用戶內容需要30秒上傳到后臺,檢測結果15秒鐘回來了,檢測判斷代碼找不到用戶內容,就刪除不了。如果檢測結果1分鐘才回來,檢測判斷代碼就可以看到后臺已經有用戶內容了,若違規就可以刪除。
我這里是setTimeout等了35秒鐘,才發檢測申請,這樣能大致保證用戶上傳完之后再被檢測判斷等操作,這也是微信內容安全檢測的弊端,消息回來0-30分鐘,不能保證實時檢測。
六、異步檢測結果
異步檢測結果在云函數的日志里看:
receiveCheckImg的異步返回結果大致如下:
{"CreateTime": 1664629839,"Event": "wxa_media_check","FromUserName": "oUaiR5Eq8FW4t4ulYUyis29dbfYU","MsgType": "event","ToUserName": "gh_e950c4848290","appid": "手動屏蔽哈哈哈哈!","detail": [{"errcode": 0,"label": 20002,"prob": 90,"strategy": "content_model","suggest": "risky"}],"errcode": 0,"errmsg": "ok","result": {"label": 20002,"suggest": "risky"},"trace_id": "63383c4b-4a47d694-20726f05","userInfo": {"appId": "手動屏蔽哈哈哈哈!","openId": "oUaiR5Eq8FW4t4ulYUyis29dbfYU"},"version": 2 }有用的就兩個:
一個是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的記錄了
if (trace.data.artwork_id) {//處理artwork集合 }else if (trace.data.food_id){//處理food集合 }else if (trace.data.house_id){//處理house集合 }else if (trace.data.shop_id){//處理shop集合 }如果不明白的可以看看最開始的代碼塊的下面這個部分:
?await wx.cloud.database().collection('trace_id').add({data: {//trace_id_id: traceIdArr[i],//xxx集合的檢測就設置xxx_id,這樣在中介集合標識下可以直接找到對應審核對象artwork_id: _id,openId: this.data.openId}})}(當然沒有看過我的代碼原貌,有點難以理解,不過這個不是重點,利用中介集合這個思路才是后續處理的關鍵!!)
總結
以上是生活随笔為你收集整理的微信小程序云调用security.mediaCheckAsync接口成功实例(内容安全审核接口)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Work Like Alibaba系列分
- 下一篇: 中国首台超级计算机“天河一号,中国首台千