小程序进阶-内容安全接口

一、应用场景

  • 检查文本是否含有违法违规内容。
  • 校验图片是否含有违法违规内容。

二、安全接口

access_token请求地址

GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

(1)图片检测security.imgSecCheck
调用方式:

1.HTTPS 调用
检测请求地址:
	POST https://api.weixin.qq.com/wxa/img_sec_check?access_token=ACCESS_TOKEN
请求参数:
	access_token(String)接口调用凭证
	media(FormData)要检测的图片文件,格式支持PNGJPEGJPGGIF,图片尺寸不超过 750px x 1334px
接口返回:
	{
    
    "errcode": "0内容正常,87014内容含有违法违规内容","errmsg": "ok/risky content"}

2.云调用
接口方法:
	openapi.security.imgSecCheck
接口参数:
	media(FormData)媒体文件数据,包含参数{
    
    
	contentType(string):数据类型,传入 MIME Type;value(Buffer):文件 Buffer}
接口返回:同上

(2)文本检测security.msgSecCheck
调用方式:

1.HTTPS 调用
检测请求地址:
	POST https://api.weixin.qq.com/wxa/msg_sec_check?access_token=ACCESS_TOKEN
请求参数:
	access_token(String)接口调用凭证
	content(string)要检测的文本内容,长度不超过 500KB
接口返回:
	{
    
    "errcode": "0内容正常,87014内容含有违法违规内容","errmsg": "ok/risky content"}

2.云调用
接口方法:
	openapi.security.msgSecCheck
接口参数:
	content(string)要检测的文本内容,长度不超过 500KB
接口返回:同上

三、使用范例

(0)获取access_token

$appid ="小程序唯一凭证";
$secret ="小程序密钥";
$grant_type='client_credential';
$result=http_curl("https://api.weixin.qq.com/cgi-bin/token?appid=$appid&secret=$secret&grant_type=$grant_type");
/*
{
    "access_token": "",
    "expires_in": 7200
}
*/
$access_token = json_decode($result,true)['access_token'];
echo $access_token;

function http_curl($url){
    
    
	//初始化一个cURL会话,返回一个cURL句柄,供curl_setopt(), curl_exec()和curl_close() 函数使用
    $curl = curl_init(); 
    //设置URL
    curl_setopt($curl,CURLOPT_URL,$url);
    //curl_setopt — 设置一个cURL传输选项
    //设置发起链接等待超时
    curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,30);
    //将curl_exec()获取的信息以文件流的形式返回
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
    //https请求 不验证证书和hosts
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    //执行命令
    $response=curl_exec($curl);
    //关闭请求
    curl_close($curl);
    return $response;
}

(1)文本检测
https调用

$content = $_GET['content'];
method($content,$accessToken);

function method($content,$accessToken)
{
    
    
	$data['content'] = $content;
    $result=json_decode(curlPost("https://api.weixin.qq.com/wxa/msg_sec_check?access_token=$accessToken",$data),true);
    print_r($result);
   /*
   {
    "errcode": 0,
    "errmsg": "ok"
	}
   */
}

function curlPost($url,$data)
{
    
    
    $ch = curl_init();
    //设置URL和相应的选项
    $params[CURLOPT_URL] = $url;
    $params[CURLOPT_HEADER] = FALSE;
    //https请求 不验证证书和hosts
    $params[CURLOPT_SSL_VERIFYPEER] = false;
    $params[CURLOPT_SSL_VERIFYHOST] = false;
    //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
    $params[CURLOPT_RETURNTRANSFER] = true;
    //启用时会发送一个常规的POST请求
    $params[CURLOPT_POST] = true;
    //传递一个数组到CURLOPT_POSTFIELDS,cURL会把数据编码成 multipart/form-data,而然传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded。
    $params[CURLOPT_POSTFIELDS] = $data;
    //为 cURL 传输会话批量设置选项,不需要重复地调用 curl_setopt()
    curl_setopt_array($ch, $params);
    $content = curl_exec($ch);
    curl_close($ch);
    return $content;
}

云调用

// 云函数入口文件
const cloud = require('wx-server-sdk')
//初始化 SDK 实例
cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
    
    
  try{
    
    
    let result = await cloud.openapi.security.msgSecCheck({
    
    
      content: event.content
    })
    if (result && result.errCode.toString() === '87014'){
    
    
      return {
    
     code: 300, msg: '涉嫌含有违法违规内容,请重新填写', data: result } 
    }else{
    
    
      return {
    
     code: 200, msg: 'ok', data: result }
    }
  } catch (err) {
    
    
    if (err.errCode.toString() === '87014'){
    
    
      return {
    
     code: 300, msg: '涉嫌含有违法违规内容,请重新填写', data: err }
    }
    return {
    
     code: 400, msg: '调用security接口异常', data: err }
  }
}

(2)图片安全检测
https调用

$image = $_FILES['image'];
print_r($image);
/*
Array
(
    [name] => eioihgklsdads.jpg
    [type] => image/jpeg
    [tmp_name] => /tmp/phplsdk
    [error] => 0
    [size] => 219833
)
*/
$fileAdrr = download($image);
method($fileAdrr,$image,$accessToken);

function method($fileAdrr,$image,$accessToken)
{
    
    
	//创建一个 CURLFile 对象, 用与上传文件
    $curl_file = curl_file_create($fileAdrr,$image['type'],$image['name']);
    print_r($curl_file);
    /*
    CURLFile Object
	(
	    [name] => 1617590721.jpg
	    [mime] => image/jpeg
	    [postname] => JKHLDKJHDIUH323HKJDHKJ8982379387HH.jpg
	)
    */
    $data['media'] = $curl_file;
    $result=json_decode(curlPost("https://api.weixin.qq.com/wxa/img_sec_check?access_token=$accessToken",$data),true);
    print_r($result);
    /*
   {
    "errcode": 0,
    "errmsg": "ok"
	}
   */
    if (file_exists($fileAdrr)){
    
    
	   unlink($fileAdrr); //删除文件
    }
}

function curlPost($url,$data)
{
    
    
    $ch = curl_init();
    //设置URL和相应的选项
    $params[CURLOPT_URL] = $url;
    $params[CURLOPT_HEADER] = FALSE;
    //https请求 不验证证书和hosts
    $params[CURLOPT_SSL_VERIFYPEER] = false;
    $params[CURLOPT_SSL_VERIFYHOST] = false;
    //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
    $params[CURLOPT_RETURNTRANSFER] = true;
    //启用时会发送一个常规的POST请求
    $params[CURLOPT_POST] = true;
    //传递一个数组到CURLOPT_POSTFIELDS,cURL会把数据编码成 multipart/form-data,而然传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded。
    $params[CURLOPT_POSTFIELDS] = $data;
    //为 cURL 传输会话批量设置选项,不需要重复地调用 curl_setopt()
    curl_setopt_array($ch, $params);
    $content = curl_exec($ch);
    curl_close($ch);
    return $content;
}

//下载文件到本地,并返回路径
function download($image) {
    
    
	//explode()函数把字符串打散为数组
    $temp = explode(".", $image["name"]);
    //获取文件后缀名,end()函数将数组内部指针指向最后一个元素
    $extension = end($temp);
    $fileAddr =  time().'.'.$extension;
    move_uploaded_file($image["tmp_name"], $fileAddr);
    return $fileAddr;
}

云调用:imgSecCheck.js

// 云函数入口文件
const cloud = require('wx-server-sdk')
//初始化sdk示例
cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
    
    
  try{
    
    
  	//获取CDN链接的文件流
  	const qs = await new Promise((resolve, reject) => {
    
    
	     //encoding: null,这个是关键,否则返回字符串而不是二进制数组
	    request({
    
    method: 'GET',url:event.url,encoding: null}, 
	    (error, response, body) => {
    
    
	      if (error) {
    
    
	        reject(error)
	      } else {
    
    
	        resolve(body)
	      }
	    })
  	})
  	/**
  	let qs = await axios({
	  method: 'get',
	  url: event.url,
	  responseType: 'arraybuffer',
	  headers: { "Content-Type": "*" }
	})
  	*/
    let result = await cloud.openapi.security.imgSecCheck({
    
    
      media: {
    
    
        contentType: 'image/png',
        value: qs
      }
    })
    if (result && result.errCode.toString() === '87014'){
    
    
      return {
    
     code: 300, msg: '涉嫌含有违法违规内容,请重新上传', data: result } 
    }else{
    
    
      return {
    
     code: 200, msg: 'ok', data: result }
    }
  } catch (err) {
    
    
    if (err.errCode.toString() === '87014'){
    
    
      return {
    
     code: 300, msg: '涉嫌含有违法违规内容,请重新上传', data: err }
    }
    return {
    
     code: 400, msg: '调用security接口异常', data: err }
  }
}
wx.chooseImage({
    
    
      count: 1, //图片数量限制
      sizeType: ['compressed'
    ], //压缩图
      sourceType: ['album', 'camera'
    ],//相册,相机
      success: (res) => {
    
    
        const tempFiles = res.tempFiles;
        console.log(tempFiles)
       //[path:"http://tmp/JKLDSn4353DSLKHKJLDH.jpg",size: 3253]
        tempFiles.forEach( (items,id) => {
    
    
            // 官方云调用imgSecCheck 限1M
            if (items && items.size <= 1024*1024) {
    
    
              //图片转buffer
              //获取全局唯一的文件管理器,读取本地文件内容
              wx.getFileSystemManager().readFile({
    
    
                filePath: items.path,
                success: res => {
    
    
                  //data(string/ArrayBuffer)
                  var buff = res.data
                  wx.cloud.callFunction({
    
    
                    name: 'imgSecCheck',
                    data: {
    
    
                    	//如果 data 中包含大数据字段(建议临界值 256KB),建议使用 wx.cloud.CDN 标记大数据字段,标记后在调用云函数时,该字段的内容将会上传至临时 CDN,然后在云函数中接收到的该字段值将是 CDN url,可在云函数中下载访问。通过这种方式,可以避免大数据传输造成的性能问题、及避免触及调用链路的传输大小限制。
                      	url:wx.cloud.CDN(buff) 
                    }
                   })
                  .then(res => {
    
    
                    let {
    
    errCode} = res.result.data;
                    switch (errCode) {
    
    
                      case 87014:
                          //此时说明图片内容不过
                          console.log("图片违规")
                          break;
                        case 0:
                          break;
                        default:
                          break;
                            }
                        })
                  .catch(err => {
    
    
                    console.error(err);
                        })
                    }
                })
            }
        })
    }
})

参考:https://developers.weixin.qq.com/community/develop/article/doc/0004829fb5419803893b162eb51813
https://developers.weixin.qq.com/community/develop/doc/000288cdd340f8c7798b289bb5c000?highLine=axios

猜你喜欢

转载自blog.csdn.net/weixin_43166227/article/details/115438156