(适用于ydm-java接口与后台,如有误入,但愿也能给您带来帮助)
引子:
起源于社交,后宫应用,当时候业主考量周密,让增添这么一个功能,并推荐使用 图谱科技 的鉴黄。说白了就是在视频聊天时,截取两者的画面,传给接口,接口将图片地址告诉图谱,图谱给反馈,色情、性感、正常;并给出认定的百分比以及是否需要复审的状态。
碎碎念:
- 图谱注册一个账户都需要人工审核,想要试用还得加客服QQ,这里也是一样的,官方提供 JavaSDK ,在客服的指引下上传公钥,保存私钥;客服一般会提供一些测试所需的AppKey之类;
- 直到现在Android还做不到在融云视频聊天时截取图片上传,因为各种方面的限制吧;所以这个功能只在iOS上是完美的;App端开一个定时器,按照固定的秒数截取图片上传,以base64的形式,接口解作图片,将地址给图谱发过去,图谱就会有返回值了。这个时候各种逻辑啊,插入数据库啊之类的就开始了;另外,会做一个判断,在返回值是正常且不需要复审的情况下,将刚刚那张图片删除掉,以节省服务器空间;而有嫌疑的图片就留着,当做证据好了。
接口处理的代码:
/**
* 保存鉴黄表信息
*/
public String saveComplaint(Integer video_order,String img,String privateKey,HttpServletRequest request){
//查询双方
BalanceOfPayments balanceOfPayments = balanceOfPaymentsMapper.queryConsumeById(video_order);
//保存
Complaint complaint = new Complaint();
//请求图谱
ArrayList<String> imgs = new ArrayList<String>();
imgs.add(TUPUIMGPATH + img);
String[] tags = {String.valueOf(video_order)};
//返回值
JSONObject obj = TuPuApi.tuPuApi(imgs, tags, privateKey);
//验证是否请求成功
Integer code = (Integer) obj.get("code");
if(0 == code){
log.info("成功接收到图谱的反馈,调用鉴黄成功");
JSONObject objImg = (JSONObject) obj.get("54bcfc6c329af61034f7c2fc");
List<JSONObject> fileList = (List<JSONObject>) objImg.get("fileList");
Double rate = (Double) fileList.get(0).get("rate");
Integer label = (Integer) fileList.get(0).get("label");
String name = (String) fileList.get(0).get("name");
log.info(name);
//fileList.get(0).get("tag");
Boolean flag = (Boolean) fileList.get(0).get("review");
Integer review = 2;
if(flag){
review = 1;
}
complaint.setVideo_order(video_order);//视频聊天订单号
complaint.setBuy_id(balanceOfPayments.getBuyPersion().getId());//拨打人
complaint.setSell_id(balanceOfPayments.getSellPersion().getId());//接听者
complaint.setCreate_date(new Date());//鉴黄申请时间
complaint.setReason("视频聊天自动鉴黄");//鉴黄备注
complaint.setScreenshot(img);//鉴黄投诉图片
complaint.setState(3);//图谱审核
complaint.setType(0);//视频截图自动投诉
complaint.setLabel(label);//(鉴黄)分类: 0:色情; 1:性感; 2:正常;
complaint.setReview(review);//(鉴黄)是否需要人工复审该图片 1需要 2不需要
complaint.setRate(new BigDecimal(rate));//(鉴黄)图像被识别为某个分类的概率值
}else{
log.error("鉴黄反馈出错,具体原因为:" + obj.get("message"));
return "passbuterror";
}
int count = complaintMapper.add_complaint(complaint);
if(count != 1){
log.error("保存鉴黄信息出错,视频订单id为:" + String.valueOf(video_order));
return "passbuterror";
}
if(complaint.getLabel() == 2 && complaint.getReview() == 2){
//删除鉴黄图片
String var = PathUtil.GetAppName(request).replace("/", "\\");
String project = PathUtil.GetAppRealPath(request);
String path = project.replace(var+"\\", "").trim();
FileUtil.delFile(path + img.replace("/", "\\"));
return "pass";
}else if(complaint.getLabel() != 2 && complaint.getReview() == 2){
return "yellow";
}else{
return "maybe";
}
}
图谱提供的Api:
/**
* 请求图谱
* @param fileList url的集合
* @param tags 图片的附属信息
* @param privateKey 私钥的路径
* @return
*/
public static JSONObject tuPuApi(ArrayList<String> fileList,String[] tags,String privateKey){
Api api = new Api(SECRETID, privateKey);
JSONObject result = api.doApiTest(ConfigUtil.UPLOAD_TYPE.UPLOAD_URI_TYPE, fileList,tags);
return result;
}
备注:
- 因为图谱需要的私钥是以路径的形式传入的,不是像支付宝那样写在代码里的;不应该放到upload底下,实际应该放到服务器的某个位置,做自己的读取,放到upload下,外界都能访问到了;
- 每一个(组)图片都对应一个tag,反馈的时候会带过来,我这里放的是订单的id,好对后台的逻辑进行判断;
- 官方的做法是推荐传很多的url,但是这里是实时的需求,所以就单张单张的调用了;
- base64的做法我认为不太可取,实际上App端传图还是以file的形式比较好,接口这边做文件上传的处理就行,另外图谱支持url和流的形式上传图片,当然以url的时候,需要做外网映射,不然图谱那边访问不到;
- 在图谱官网上传公钥的时候,需要将头尾保留;
- 图谱应该是远近闻名了,在融云里、七牛里均有集成。
网友评论