云開發(fā) 內(nèi)容安全檢測(cè)

2020-07-22 15:32 更新

微信小程序的許多業(yè)務(wù)場景需要通過UGC(用戶產(chǎn)生內(nèi)容)的方式,比如昵稱/花名、個(gè)人資料簽名/日志/聊天/評(píng)論、頭像/表情/相片、直播等各種場景,其格式內(nèi)容包括但不限于短文本、長內(nèi)容、圖片或視頻等來實(shí)現(xiàn)更好的用戶體驗(yàn)或更豐富的內(nèi)容功能和服務(wù)場景。但是如果這類功能的使用如果沒有做好對(duì)用戶發(fā)布內(nèi)容的安全審查,可能會(huì)產(chǎn)生政治有害等違法違規(guī)的內(nèi)容。一旦被利用進(jìn)行傳播,對(duì)小程序用戶帶來有損的體驗(yàn),小程序開發(fā)者也可能因此承擔(dān)平臺(tái)或法律的追責(zé)及處罰。因此包含UGC功能的小程序都需要有內(nèi)容安全檢測(cè)。

一、文字內(nèi)容安全

使用開發(fā)者工具新建一個(gè)云函數(shù),如msgsec,然后在config.json里添加security.msgSecCheck云調(diào)用的權(quán)限,使用npm install安裝依賴之后,上傳并部署所有文件(此時(shí)也會(huì)更新權(quán)限)。

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

然后再在index.js里輸入以下代碼,

  1. const cloud = require('wx-server-sdk')
  2. cloud.init({
  3. env: cloud.DYNAMIC_CURRENT_ENV
  4. })
  5. exports.main = async (event, context) => {
  6. try {
  7. const result = await cloud.openapi.security.msgSecCheck({
  8. content:`特3456yuuo6543zxcz7782fgnv級(jí)
  9. 2347dfji3726測(cè)asad3847qwez`
  10. })
  11. return result
  12. } catch (error) {
  13. return error
  14. }
  15. }

調(diào)用該云函數(shù),接口errcode返回87014(內(nèi)容含有違法違規(guī)內(nèi)容):

  1. errMsg: "cloud.callFunction:ok",
  2. result: {
  3. errCode: 87014
  4. errMsg: "openapi.security.msgSecCheck:fail risky content hint: [bgh98a06644711]"}

而如果返回的result.errCode的值為0,說明內(nèi)容正常。

  1. errMsg: "cloud.callFunction:ok"
  2. result: {
  3. errMsg: "openapi.security.msgSecCheck:ok",
  4. errCode: 0}

二、圖片鑒黃

圖片內(nèi)容安全檢測(cè)和文字內(nèi)容安全檢測(cè)最大的不同在于,我們需要考慮圖片傳輸?shù)暮臅r(shí)以及檢測(cè)的圖片不能大于1M這樣的一個(gè)限制,當(dāng)圖片尺寸比較大時(shí),我們需要對(duì)圖片進(jìn)行壓縮處理。而且要檢測(cè)的圖片文件的格式為PNG、JPEG、JPG、GIF,圖片尺寸不超過 750px x 1334px。通常情況下我們使用小程序端chooseImage上傳圖片時(shí),我們盡量要求使用compressed壓縮圖,相冊(cè)的壓縮圖一般都不會(huì)超過1M。

  • 如果圖片比較?。ù蠹s200k以內(nèi)),我們可以直接把圖片存儲(chǔ)到云存儲(chǔ)里,然后在云函數(shù)里下載該圖片進(jìn)行圖片安全檢測(cè);

  • 如果圖片比較大(比如大于100k,小于1M),我們可以把圖片存儲(chǔ)到云存儲(chǔ)之后,在云函數(shù)端下載該圖片,使用前面所說的Sharp模塊,對(duì)圖片進(jìn)行壓縮處理,然后進(jìn)行圖片安全檢測(cè)。

  • 如果圖片大于1M,那圖片的壓縮就不建議在云函數(shù)端處理,要在小程序端使用Canvas進(jìn)行壓縮,然后再傳輸?shù)皆坪瘮?shù)端進(jìn)行安全檢測(cè)。

  1. const cloud = require('wx-server-sdk')
  2. cloud.init({
  3. env: cloud.DYNAMIC_CURRENT_ENV
  4. })
  5. exports.main = async (event, context) => {
  6. const fileID = 'cloud://xly-xrlur.786c-xly-xrlur-1300446086/1572315793628-366.png'
  7. const res = await cloud.downloadFile({
  8. fileID: fileID,
  9. })
  10. const Buffer = res.fileContent
  11. try {
  12. const result = await cloud.openapi.security.imgSecCheck({
  13. media: {
  14. contentType: 'image/png',
  15. value: Buffer
  16. }
  17. })
  18. return result
  19. } catch (error) {
  20. return error
  21. }
  22. }

三、圖像內(nèi)容安全拓展能力

云調(diào)用在圖像內(nèi)容安全處理方面,功能有一些不足的地方(比如沒有細(xì)分涉黃、涉政、涉暴恐以及廣告引導(dǎo)類),在限制上有一點(diǎn)嚴(yán)格(對(duì)圖片的大小有嚴(yán)格的要求),建議大家安裝云開發(fā)圖像安全審核的拓展能力。

它的安裝方式在云調(diào)用與拓展能力章節(jié)有介紹,而使用方式上一節(jié)圖像處理的拓展能力是一脈相承的,有著相同的使用方法,這是因?yàn)閳D像內(nèi)容安全就是圖像處理的一部分。所以要使用圖像內(nèi)容安全拓展能力建議先閱讀之前的內(nèi)容,這里只給出實(shí)際的代碼。

1、在小程序端使用圖像安全審核

首先我們參考上一節(jié)內(nèi)容構(gòu)建圖像處理的npm,然后再在imgprocess.js里引入包以及在Page函數(shù)里寫一個(gè)事件處理函數(shù)。圖像安全審核只能后置校驗(yàn),也就是只能對(duì)已經(jīng)上傳到云存儲(chǔ)的圖片進(jìn)行內(nèi)容安全審核,方法如下:

  1. const extCi = require("./../../miniprogram_npm/@cloudbase/extension-ci-wxmp");
  2. Page({
  3. async imgSec(){
  4. extCi.invoke({
  5. action: "DetectType",
  6. cloudPath: "tcbdemo.jpg",
  7. operations: {
  8. type: 'porn,ads,terrorist,politics'
  9. }
  10. }).then(res => {
  11. console.log(res.data);
  12. }).catch(err => {
  13. console.log(err);
  14. })
  15. }
  16. })

這里的type為內(nèi)容審核的類型,porn(涉黃識(shí)別)、terrorist(涉暴恐識(shí)別)、politics(涉政識(shí)別)、ads(廣告識(shí)別),我們可以像上面四個(gè)一起寫,也可以只寫其中的幾個(gè),用逗號(hào),隔開即可。

打印res.data,內(nèi)有RecognitionResult的對(duì)象,會(huì)顯示圖片內(nèi)容審核的結(jié)果,下面顯示帶有商業(yè)廣告:

  • HitFlag,表示是否命中:0(未命中),1(命中),2(疑似);

  • Score,審核分值:0 - 60分(正常),60 - 90分(疑似敏感),90 - 100分(確定敏感)

  • Label,為識(shí)別的標(biāo)簽

  1. RecognitionResult{
  2. PornInfo: {Code: 0, Msg: "OK", HitFlag: 0, Score: 14, Label: ""}
  3. TerroristInfo: {Code: 0, Msg: "OK", HitFlag: 0, Score: 0, Label: ""}
  4. PoliticsInfo: {Code: 0, Msg: "OK", HitFlag: 0, Score: 26, Label: ""}
  5. AdsInfo: {Code: 0, Msg: "OK", HitFlag: 1, Score: 98, Label: "淘寶"}
  6. }

在小程序端審核圖片,我們可以先上傳圖片到云存儲(chǔ),然后獲取圖片在云存儲(chǔ)的cloudPath(不是fileID,是相對(duì)云存儲(chǔ)的絕對(duì)路徑),再對(duì)圖片進(jìn)行審核,審核成功才予以顯示,審核失敗就刪除該圖片,讓用戶重新上傳。

2、在云函數(shù)端使用圖像安全審核

使用開發(fā)者工具新建一個(gè)imgSec的云函數(shù),然后在package.json里添加latest最新版的@cloudbase/extension-ci,并右鍵云函數(shù)目錄選擇在終端中打開輸入命令npm install安裝依賴:

  1. "dependencies": {
  2. "wx-server-sdk": "latest",
  3. "@cloudbase/extension-ci": "latest"
  4. }

然后再在index.js里輸入以下代碼,代碼的具體含義可以參考小程序端的內(nèi)容講解:

  1. const cloud = require('wx-server-sdk')
  2. cloud.init({
  3. env: cloud.DYNAMIC_CURRENT_ENV
  4. })
  5. const extCi = require('@cloudbase/extension-ci')
  6. cloud.registerExtension(extCi)
  7. async function imgSec() {
  8. try {
  9. const res = await app.invokeExtension('CloudInfinite', {
  10. action: 'DetectType',
  11. cloudPath: 'tcbdemo.png',
  12. operations: {
  13. type: 'porn,ads,terrorist,politics'
  14. }
  15. })
  16. console.log(res)
  17. return res
  18. } catch (err) {
  19. console.log(err)
  20. }
  21. }
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)