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

2020-07-22 15:32 更新

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

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

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

{
  "permissions": {
    "openapi": [
      "security.imgSecCheck",
      "security.msgSecCheck"
    ]
  }
}

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

const cloud = require('wx-server-sdk')
cloud.init({
    env: cloud.DYNAMIC_CURRENT_ENV
  })
exports.main = async (event, context) => {
    try {
        const result = await cloud.openapi.security.msgSecCheck({
            content:`特3456書yuuo莞6543李zxcz蒜7782法fgnv級
            完2347全dfji試3726測asad感3847知qwez到`
        })
        return result
    } catch (error) {
        return error
    }
}

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

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

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

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

二、圖片鑒黃

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

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

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

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

const cloud = require('wx-server-sdk')
cloud.init({
    env: cloud.DYNAMIC_CURRENT_ENV
  })
exports.main = async (event, context) => {
  const fileID = 'cloud://xly-xrlur.786c-xly-xrlur-1300446086/1572315793628-366.png'
  const res = await cloud.downloadFile({
    fileID: fileID,
  })
  const Buffer = res.fileContent
  try {
    const result = await cloud.openapi.security.imgSecCheck({
      media: {
        contentType: 'image/png',
        value: Buffer
      }
    })
    return result
   } catch (error) {
    return error
  }
}

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

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

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

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

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

const extCi = require("./../../miniprogram_npm/@cloudbase/extension-ci-wxmp");
Page({
  async imgSec(){
    extCi.invoke({
      action: "DetectType",
      cloudPath: "tcbdemo.jpg", 
      operations: {
        type: 'porn,ads,terrorist,politics'
      }
    }).then(res => {
        console.log(res.data);
    }).catch(err => {
        console.log(err);
    })
  }
})

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

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

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

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

  • Label,為識別的標簽

RecognitionResult{
  PornInfo: {Code: 0, Msg: "OK", HitFlag: 0, Score: 14, Label: ""}
  TerroristInfo: {Code: 0, Msg: "OK", HitFlag: 0, Score: 0, Label: ""}
  PoliticsInfo: {Code: 0, Msg: "OK", HitFlag: 0, Score: 26, Label: ""}
  AdsInfo: {Code: 0, Msg: "OK", HitFlag: 1, Score: 98, Label: "淘寶"}
}

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

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

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

"dependencies": {
  "wx-server-sdk": "latest",
  "@cloudbase/extension-ci": "latest"
}

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

const cloud = require('wx-server-sdk')
cloud.init({
    env: cloud.DYNAMIC_CURRENT_ENV
  })
const extCi = require('@cloudbase/extension-ci')
cloud.registerExtension(extCi)
async function imgSec() {
  try {
    const res = await app.invokeExtension('CloudInfinite', {
      action: 'DetectType',
      cloudPath: 'tcbdemo.png', 
      operations: {
        type: 'porn,ads,terrorist,politics'
      }
    })
    console.log(res)
    return res
  } catch (err) {
    console.log(err)
  }
}

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號