微信小程序的許多業(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)容安全檢測。
使用開發(fā)者工具新建一個(gè)云函數(shù),如msgsec,然后在config.json里添加security.msgSecCheck云調(diào)用的權(quán)限,使用npm install安裝依賴之后,上傳并部署所有文件(此時(shí)也會(huì)更新權(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級(jí)
完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(shí)以及檢測的圖片不能大于1M這樣的一個(gè)限制,當(dāng)圖片尺寸比較大時(shí),我們需要對(duì)圖片進(jìn)行壓縮處理。而且要檢測的圖片文件的格式為PNG、JPEG、JPG、GIF,圖片尺寸不超過 750px x 1334px。通常情況下我們使用小程序端chooseImage上傳圖片時(shí),我們盡量要求使用compressed壓縮圖,相冊(cè)的壓縮圖一般都不會(huì)超過1M。
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
}
}
云調(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í)際的代碼。
首先我們參考上一節(jié)內(nèi)容構(gòu)建圖像處理的npm,然后再在imgprocess.js里引入包以及在Page函數(shù)里寫一個(gè)事件處理函數(shù)。圖像安全審核只能后置校驗(yàn),也就是只能對(duì)已經(jīng)上傳到云存儲(chǔ)的圖片進(jìn)行內(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(涉黃識(shí)別)、terrorist(涉暴恐識(shí)別)、politics(涉政識(shí)別)、ads(廣告識(shí)別),我們可以像上面四個(gè)一起寫,也可以只寫其中的幾個(gè),用逗號(hào),
隔開即可。
打印res.data,內(nèi)有RecognitionResult的對(duì)象,會(huì)顯示圖片內(nèi)容審核的結(jié)果,下面顯示帶有商業(yè)廣告:
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: "淘寶"}
}
在小程序端審核圖片,我們可以先上傳圖片到云存儲(chǔ),然后獲取圖片在云存儲(chǔ)的cloudPath(不是fileID,是相對(duì)云存儲(chǔ)的絕對(duì)路徑),再對(duì)圖片進(jìn)行審核,審核成功才予以顯示,審核失敗就刪除該圖片,讓用戶重新上傳。
使用開發(fā)者工具新建一個(gè)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)
}
}
更多建議: