做的小程序,后端都是用的 Laravel,验证是不是个人脸,验证是不是涉黄图片
关于小程序接入内容安全能力的警告通知2019-09-23
你好,因用户投诉并经平台审核,你的小程序在用户自定义昵称或头像、个人资料签名、聊天室、用户评论、上传图片视频、直播等场景。未具备过滤政治有害等违法违规不当信息的机制,接入微信公众平台内容安全API(imgSecCheck、msgSecCheck、mediaCheckAsync),以及通过其他技术或人工审核手段做好内容审核,对于检测有害的内容及时清理或拦截,确保小程序提供内容及用户产生内容符合相关法律法规的要求。
内容安全接口指引
如平台发现你在2019-9-26 前未进行能力完善,将对你的小程序采取能力限制直至下架处理。
小程序名字叫——签签
用户微信扫码登记进入校园,将人脸头像写入人脸识别机,下次刷脸进出。也不知道哪点做的不对了,用户竟然投诉内容。。。唉
我们在用户注册是这么做的
1.先调用face++的人脸接口监测是否是一张脸,不是一张脸的返回错误重新拍照。
2.是一张脸的话传到我们的云存储,再推送到人脸机。
这个过程用户再上传照片的时候差不多需要3秒钟的时间
以上问题我理解的是需要在1和2之间加个步骤,涉黄验证,就是:
1.先调用face++;
2.调用腾讯的imgSecCheck API;
3.上传到我们的云存储推送到人脸机。
做完后第一次用户到访需要8-9秒的时间传头像,20秒的时间填写姓名、身份证号(这个20秒是学校要求必填的鸡肋),3秒的获取微信手机。半分多钟。。。。。。。较真的用户获客不易啊
下面说下1.2.3个步骤技术实现:
1.调用face++验证人脸
注册face++的用户,申请一个试用的API key就好了(免费的)
用这个接口https://api-cn.faceplusplus.com/facepp/v3/...,这个我直接在小程序端验证了看下面的小程序部分代码
2.请求腾讯的接口进行涉黄验证
POST https://api.weixin.qq.com/wxa/img_sec_check?access_token=ACCESS_TOKEN
laravel控制器这么写的,接口调用picCheck这个方法
public function curl_get($url)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
return $data;
}
public function get_access_token()
{
//这个建议每一小时更新一次放到缓存里能节省1-2秒
$url = config('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET');
return $data = $this->curl_get($url);
}
public function picCheck(Request $request){
$file = $request->file('file');
$access = json_decode($this->get_access_token(), true);
$access_token = $access['access_token'];
$url = 'https://api.weixin.qq.com/wxa/img_sec_check?access_token=' . $access_token;
$file_path = $file->getRealPath();
$file_data = array("media" => new \CURLFile($file_path));
$ch = curl_init();
curl_setopt($ch , CURLOPT_URL , $url);
curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch , CURLOPT_POST, 1);
curl_setopt($ch , CURLOPT_POSTFIELDS, $file_data);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
3.传到自己的云存储返回url链接
laravel的Controller这么写的,用的又拍云的存储,又拍云有个教程来很详细自己配置
private function avatarUpyun($avatar)
{
$file = $request->file('file');
$ext = $file->getClientOriginalExtension(); // 扩展名
$realPath = $file->getRealPath(); //临时文件的绝对路径
$filename = 'avatar' . time() . uniqid() . '.' . $ext;
$filePath = 'real_avatar/' . $filename;
Storage::disk('upyun')->writeStream($filePath, fopen($realPath, 'r'));
return $filePath;
}
小程序部分代码
data: {
avatar:'',
face_token:''
},
uploadAvatar(e){
let that=this
wx.chooseImage({
sizeType: ['compressed']//压缩的就好了,
sourceType: ['camera']//只能自拍,
success: res => {
that.setData({
Avatar: res.tempFilePaths,
})
wx.showLoading({
title: '人脸检测中',
icon: 'loading',
mask: true
})
wx.uploadFile({
url: 'https://api-cn.faceplusplus.com/facepp/v3/detect',
header: {
'content-type': 'application/json'
},
name: 'image_file',
filePath: that.data.Avatar[0],
formData: {
api_key: conf.FaceKey,//face++自己申请
api_secret: conf.FaceSecret,//face++自己申请
},
success(res) {
let faceData = JSON.parse(res.data)
if (faceData.face_num != 1) {
//只要返回的不是一个脸
wx.hideLoading()
Notify('非人脸头像,上传失败')//用的vant框架自己加载进来
return
} else {
that.setData({
'face_token': faceData.faces[0].face_token,//这个挺有用的,建议写到自己的用户表,再对比其他的时候减少传图
})
wx.hideLoading()
wx.showLoading({
title: '涉黄检测中...',
icon: 'loading',
mask: true
})
wx.uploadFile({
url: api.PicCheckUrl,//这个上面第2点的接口请求微信的接口验证是不是露点图片
filePath: that.data.Avatar[0],
name: 'file',
success(res) {
let resData=JSON.parse(res.data)
if (resData.errcode=='0'){
//正常图片的操作
wx.hideLoading()
wx.showLoading({
title: '头像上传中...',
icon: 'loading',
mask: true
})
wx.uploadFile({
url: conf.AvatarUrl,//传到我们的云存储先
header: {
'Content-Type': 'application/json',
},
filePath: that.data.Avatar[0],
name: 'file',
success: (res) => {
wx.hideLoading()
that.setData({
'avatar': res.data,
})
Notify( '头像上传成功')
}
})
}else{
wx.hideLoading()
Notify('涉黄照片,禁止上传!')
}
}
})
}
}
})
}
})
}
不得不佩服,牛b