微信小程序内容接入安全检测接口
最近微信小程序代碼審核不通過,原因是未將用戶的頭像和網名做內容接入安全,根據修改指引:
一、什么服務或功能的小程序是UGC小程序?
小程序中的功能或服務中,涉及用戶將自己自定義編輯的文字、圖片、音頻、視頻等內容通過小程序進行展示或提供給其他用戶的,屬于UGC小程序。
二、作為UGC小程序,用戶發布的內容與小程序是否相關?
微信小程序的服務提供者應當負有監管責任,應設置過濾違法、違規等不當信息內容的機制,保證用戶產生內容符合信息內容的規定。
四、如果UGC小程序平臺用戶發布以上或其他違規內容,開發者應該怎么做?
1、接入內容安全檢測接口:< a href="https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&key=11522142966rk3L2&version=1&lang=zh_CN&platform=2">查看詳情</ a>
該接口監測接口校驗文本/圖片是否含有敏感內容,提升信息安全防護能力。
2、目前安全接口支持基礎檢測能力,建議開發者建立自己的內容審核機制,安排審核團隊定期審查小程序運營內容,及時處理違規內容/賬戶,降低被惡意利用導致傳播惡意內容的風險。
通過查閱文檔,發現了兩種內容安全檢測的方式:
(1) 使用微信服務平臺里的API---珊瑚文本內容安全和珊瑚圖片內容安全
?根據里面的開發文檔,可以很便捷地實現內容安全檢測,以下是官方代碼:
/*** 珊瑚圖片內容安全*/ function doImgSecCheck() {var d = Date.now()wx.serviceMarket.invokeService({service: 'wxee446d7507c68b11',api: 'imgSecCheck',data: {"Action": "ImageModeration","Scenes": ["PORN", "POLITICS", "TERRORISM", "TEXT"],"ImageUrl": "http://mat1.gtimg.com/pingjs/ext2020/qqindex2018/dist/img/qq_logo_2x.png","ImageBase64": "","Config": "","Extra": ""},}).then(res => {console.log(res)}) } //doImgSecCheck()/*** 珊瑚文本內容安全*/ function doMsgSecCheck () {wx.serviceMarket.invokeService({service: 'wxee446d7507c68b11',api: 'msgSecCheck',data: {"Action": "TextApproval","Text": "hello world!"},}).then(res => {console.log(res)}) }//doMsgSecCheck ()(2)使用云調用,在云函數中使用兩個接口security.imgSecCheck和security.msgSecCheck
云調用
云調用是小程序·云開發提供的在云函數中調用微信開放接口的能力,需要在云函數中通過?wx-server-sdk?使用。
接口方法
openapi.security.imgSecCheck openapi.security.msgSecCheck需在?config.json?中配置?security.imgSecCheck?API 和security.msgSecCheck?API 的權限
?找到云函數的config.json文件,在里面添加:
{"permissions": {"openapi": ["security.msgSecCheck","security.imgSecCheck"]} }需要配置云調用權限,每個云函數需要聲明其會使用到的接口,否則無法調用,聲明的方法是在云函數目錄下的?config.json(如無需新建)配置文件的?permissions.openapi?字段中增加要調用的接口名,permissions.openapi?是個字符串數組字段,值必須為所需調用的服務端接口名稱。在每次使用微信開發者工具上傳云函數時均會根據配置更新權限,該配置有10分鐘的緩存,如果更新后提示沒有權限,稍等10分鐘后再試。
文本內容安全檢測比較簡單:
檢查一段文本是否含有違法違規內容。
應用場景舉例:
?圖片內容檢測復雜一點:
校驗一張圖片是否含有違法違規內容。
應用場景舉例:
請求參數
| media | FormData | 是 | 媒體文件數據 |
media 的結構
| contentType | string | 是 | 數據類型,傳入 MIME Type | |
| value | Buffer | 是 | 文件 Buffer |
?官方代碼:
// cloud = require('wx-server-sdk') // ... // 方法返回 Promise cloud.openapi.security.imgSecCheck({media: {contentType: 'image/png',value: Buffer} })這里value的數據類型為Buffer,而我們在小程序端還是云函數端操作圖片一般是通過它的文件地址來進行的,后來查閱文檔發現:
downloadFile
從云存儲空間下載文件
請求參數
| fileID | 云文件 ID | String | - | Y |
Promise 返回參數
| fileContent | 文件內容 | Buffer |
| statusCode | 服務器返回的 HTTP 狀態碼 | Number |
?在這里有我們所需的Buffer數據,所以需要分成兩步:先用
const res = await cloud.downloadFile({fileID: fileID,})const buffer = res.fileContent獲取圖片文件的buffer,再使用cloud.openapi.security.imgSecCheck()方法檢測圖片內容是否安全
以下是安全檢測云函數的測試代碼
// 云函數入口文件 const cloud = require('wx-server-sdk') cloud.init({env: cloud.DYNAMIC_CURRENT_ENV }) // 云函數入口函數 exports.main = async (event, context) => {//文本內容安全/* try {let result = await cloud.openapi.security.msgSecCheck({content: '么么么噠'})console.log(result)if (result.errCode == 0) {return true;}return false} catch (err) {return false;} *///圖片內容安全const fileID = 'cloud://test-dijf3/test/test.png'const res = await cloud.downloadFile({fileID: fileID,})const buffer = res.fileContenttry {var result = await cloud.openapi.security.imgSecCheck({media: {contentType:"image/png",value: buffer}})return result} catch (err) {return err} }問題到這里似乎就解決了,但是我要實現的功能是將用戶的頭像和用戶名做安全檢測。
在小程序端,使用wx.getUserInfo()可以獲得用戶的頭像鏈接avatarUrl和用戶名nickName,但是這個avatarUrl是一個圖片鏈接,例如:
https://wx.qlogo.cn/mmopen/vi_32********************
點擊此鏈接可以查看用戶的頭像,但是前面提到的fileID它是在云存儲中的一個文件地址,所以需要先把用戶頭像上傳到云存儲當中,以便獲取fileID。但是要上傳到云存儲中就必須獲得頭像圖片的臨時存儲路徑filePath,所以要先將圖片下載到本地,這里使用wx.getImageInfo(),可以將網絡圖片保存在本地,從而獲取它的臨時路徑。
wx.getImageInfo({src: 'https://wx.qlogo.cn/mmopen/vi_32/*************',success: function (res) { //訪問存放微信用戶頭像的Url console.log(res.path)} })?問題隨著而來,系統會提示https://wx.qlogo.cn非downloadFile的合法域名。在詳情->項目配置中可以看到:
?所以需要在后臺->開發->開發設置中設置服務器域名
此時就不會報錯了。
然后再上傳到云存儲中,然后再調用云函數,傳入獲取的fileID,即可實現。
wx.cloud.uploadFile({cloudPath:'test.png',filePath:'',success: res => {console.log('[上傳文件] 成功:', res)wx.cloud.callFunction({name: 'imgSecCheck',data: {contentType: contentType,fileID: res.fileID}}).then(res => {console.log("檢測結果", res.result);}) },fail: e => {console.error('[上傳文件] 失敗:', e)} })步驟如下:
1,通過wx.getImageInfo()將頭像圖片下載到本地,以獲取臨時存儲路徑filePath
2,將頭像圖片上傳到云存儲中,以獲取fileID
3,通過cloud.downloadFile()獲取圖片的buffer
4,將buffer填入value,調用cloud.openapi.security.imgSecCheck以實現安全檢測
隨著學習的深入,我發現可以先將本地圖片編碼成base64格式,然后直接傳入云函數
wx.getFileSystemManager().readFile({filePath: filePath, //選擇圖片返回的相對路徑encoding: 'base64', //編碼格式success: res => { //成功的回調wx.cloud.callFunction({name:'imageSecCheck',data:{file: res.data},success(_res){console.log(_res)wx.hideLoading()//wx.hideLoading()},fail(_res){console.log(_res)}})index++;}})云函數端代碼:
var buffer = new Buffer(event.file, 'base64')try {var result = await cloud.openapi.security.imgSecCheck({media: {contentType:"image/png",value: buffer}})return result} catch (err) {return err}此時也可以實現圖片安全檢測,方法更為簡潔。
步驟如下:
1,通過wx.getImageInfo()將頭像圖片下載到本地,以獲取臨時存儲路徑filePath
2,將圖片數據編碼成base64格式,將編碼后數據傳入云函數
3,通過var buffer = new Buffer(event.file, 'base64')獲取圖片的buffer
4,將buffer填入value,調用cloud.openapi.security.imgSecCheck以實現安全檢測
總結
以上是生活随笔為你收集整理的微信小程序内容接入安全检测接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从“读万卷书”到“行万里路”,如何做到知
- 下一篇: 武大校长的一封信