前言

最近不少小伙伴反映上传小黄图偶尔性的异常,并且不能上传动态图片,很是苦恼!无她,鉴黄API还没有这么智能,毕竟是自己训练的,不是那么专业!为了更好的服务广大网友,撸主决定接入更加智能快速的鉴黄服务。

UCloud

UCloud内容审核产品,基于海量训练数据,结合深度学习识别技术,基于UCloud底层云服务,提供99.9%的服务稳定性保障。能够精准识别图片、视频中的低俗内容,适用于各类用户的鉴黄审核需求,帮助您在业务层面降低违规风险,同时应用算法服务,也大大减轻了人工审核的投入成本。

最主要的是,鉴黄识别服务在2020年6月30日前,均免费试用。即使到期以后,小伙伴们也不用太担心,鉴黄识别服务定价采取阶梯定价方式,每日2000张免费调用额度,剩余部分不累积。日2000张,尔等也只有仰望的份了。

申请

地址:www.ucloud.cn/site/product/uaicensor.html

  • 创建UAI Censor AI内容审核应用
  • 获取账户公私钥,鉴黄必备

总之很简单,都是中文文档,三五分钟就可以搞定的事情。

代码案例

比较扯淡的是官方只提供了Python PHP 版本的生成签名代码,难道我大Java不是宇宙第一语言?于是趁着夜深人静只能自己撸一把了!

application.properties 引入以下配置

# ===================================
# UCloud鉴黄
# ===================================
ucloud.yellow.flag = true
ucloud.publicKey = **********
ucloud.privateKey = **********
ucloud.resourceId= **********
ucloud.url= http://api.uai.ucloud.cn/v1/image/scan

鉴黄工具类:

/**
* ucloud 鉴黄
* @param imageUrl
* @return
* 返回值
* RetCode 0 标识正常 其余一律异常
* Suggestion 建议, pass-放行, forbid-封禁, check-人工审核
*/
public String check(String imageUrl) {
try {
//图片绝对路径
imageUrl = toolsUrl + imageUrl;
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
/**
* 生成signature,首字母排序
*/
String timestamp = System.currentTimeMillis()+"";
SortedMap<Object, Object> packageParams = new TreeMap<>();
packageParams.put("PublicKey", publicKey);
packageParams.put("ResourceId", resourceId);
packageParams.put("Timestamp", timestamp);
packageParams.put("Url", imageUrl);
String signature = UCloudUtil.createSign(packageParams,privateKey);
/**
* 参数
*/
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("Scenes", "porn");
param.add("Method", "url");
param.add("Url", imageUrl);
/**
* headers 参数
*/
headers.setContentType(MediaType.parseMediaType("multipart/form-data; charset=UTF-8"));
headers.set("PublicKey", publicKey);
headers.set("Signature",signature);
headers.set("ResourceId",resourceId);
headers.set("Timestamp", timestamp);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(param, headers);
ResponseEntity<String> responseEntity = rest.exchange(ucloudUrl, HttpMethod.POST, httpEntity, String.class);
return responseEntity.getBody();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}

生成Signature签名算法流程包括四步:

  • 将请求参数按照名进行升序排列;
  • 构造被签名参数串;
  • 计算签名;
  • 使用签名组合HTTP请求。

代码案例:

/**
* 生成签名
*/
public class UCloudUtil {
/**
* sign签名
*/
public static String createSign(SortedMap<Object, Object> packageParams,
String privateKey) throws Exception {
StringBuffer sb = new StringBuffer();
Set es = packageParams.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String)entry.getValue();
sb.append(k + v);
}
sb.append(privateKey);
String sign = shaEncode(sb.toString());
return sign;
}
public static String shaEncode(String inStr) throws Exception {
MessageDigest sha = null;
try {
sha = MessageDigest.getInstance("SHA");
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
return "";
} byte[] byteArray = inStr.getBytes("UTF-8");
byte[] md5Bytes = sha.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
}

返回结果:

{
"RetCode": 0,
"Message": "",
"Timestamp": 1574821854,
"Status": "Success",
"StartTime": 1574821852685,
"EndTime": 1574821854,
"Result": {
"Porn": {
"Suggestion": "pass",
"Score": 0.00187
},
"Politician": {
"Suggestion": "",
"Score": 0
},
"Terror": {
"Suggestion": "",
"Score": 0
}
}
}

撸主只需要关心RetCodePorn这两个参数就可以了,RetCode0说明API调用正常,Porn中的参数Suggestionpass说明通过。

小结

只有壳的小黄图是没有灵魂的,希望各位网友,发扬艰苦奋斗的精神,把有限的灵魂注入到无限的小黄图中!这样,撸主才有动力升级更多有趣的功能。

此次升级优化了手机端显示的问题,使其更加耐看。接入新的鉴黄服务,和自建鉴黄一起使用双重保驾护航,同时小伙伴们可以自由的上传喜欢的动图了。

参考

https://www.cloudbed.vip

https://docs.ucloud.cn/ai/uai-censor/access/key

https://docs.ucloud.cn/ai/uai-censor/api/censor/image

UCloud 云服务内容审核 Java 版本实现的更多相关文章

  1. 利用VisualVM监测Azure云服务中的Java应用

    在做Java开发的时候,我们需要在上线之前对程序进行压力测试,对程序的性能进行全面的监控,了解JVM的CPU,内存,GC,classes,线程等等信息,或者在程序上线运行的过程当中以便于诊断问题或者对 ...

  2. 关于消息推送的补充,主要介绍服务端的实现,包含object c 版本 c 版本 java 版本 php 版本 (转)

    要实现消息推送功能,我们可以采用第三方(腾讯:信鸽:百度:云推送:极光推送:友盟):当然,因为各种原因,我们不能使用第三方的推送服务,那我们就需要自己编写服务端.在网上寻觅了很久,找到一篇很不错的讲解 ...

  3. 北京联想招聘-java 云服务开发工程师 加入qq 群:220486180 或者直接在此 留言咨询

     Position Title: 云服务开发工程师 Experience Required:  3 - 5 Years 负责联想企业网盘服务端开发  Position Requirements  1. ...

  4. 自动判断文本文件编码来读取文本文件内容(.net版本和java版本)

    .net版本 using System; using System.IO; using System.Text; namespace G2.Common { /// <summary> / ...

  5. [转]在 Azure 云服务上设计大规模服务的最佳实践

    本文转自:http://technet.microsoft.com/zh-cn/magazine/jj717232.aspx 英文版:http://msdn.microsoft.com/library ...

  6. 前后端分离ueditor富文本编辑器的使用-Java版本

    最近在写一个自己的后台管理系统(主要是写着玩的,用来熟悉后端java的知识,目前只是会简单的写点接口),想在项目中编写一个发布新闻文章的功能,想到了使用百度的ueditor富文本编辑器,网上找了很多j ...

  7. Linux云服务部署Spring boot项目

    Linux云服务部署Spring boot项目 背景: 之前经过两个周的时间,做了一个简单的博客网站,网址:点击进入,在本地可以正常使用以后,想着部署到服务器上,给大家伙看个乐呵,于是有了这篇部署文章 ...

  8. 基于云服务MRS构建DolphinScheduler2调度系统

    摘要:本文介绍如何搭建DolphinScheduler并运行MRS作业. 本文分享自华为云社区<基于云服务MRS构建DolphinScheduler2调度系统>,作者: 啊喔YeYe . ...

  9. 基于AWS的云服务架构最佳实践

    ZZ from: http://blog.csdn.net/wireless_com/article/details/43305701 近年来,对于打造高度可扩展的应用程序,软件架构师们挖掘了若干相关 ...

随机推荐

  1. 基于深度学习方法的dota2游戏数据分析与胜率预测(python3.6+keras框架实现)

    很久以前就有想过使用深度学习模型来对dota2的对局数据进行建模分析,以便在英雄选择,出装方面有所指导,帮助自己提升天梯等级,但苦于找不到数据源,该计划搁置了很长时间.直到前些日子,看到社区有老哥提到 ...

  2. web常用知识

    Html 1.打电话,发短信和发邮件 <a href="tel:0755-10086">打电话给:0755-10086</a> <a href=&qu ...

  3. day20作业

    1.下面这段代码的输出结果将是什么?请解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): ...

  4. GO基础之List

    一.List定义 概述1.list是一种非连续存储的容器,由多个节点组成,节点通过一些变量记录彼此之间的关系.list有多种实现方法,如单向链表.双向链表等.2.Go语言中list的实现原理是双向链表 ...

  5. spring-boot-plus是易于使用,快速,高效,功能丰富,开源的spring boot 脚手架.

    Everyone can develop projects independently, quickly and efficiently! spring-boot-plus是一套集成spring bo ...

  6. 【Redis深度历险】那些年Redis的数据结构

    [Redis深度历险]那些年Redis的数据结构 Redis端口号6379的来源 Redis的端口号是6379,但这个端口号并不是随机选择的,源于"MERZ",这个单词在手机当中的 ...

  7. swift 实现iOS手势密码、指纹密码、faceID

    本博客包含了如何实现iOS手势密码.指纹密码.faceID全步骤,包括了完整的代码. 先附上demo地址https://github.com/Liuyubao/LYBTouchID,支持swift3. ...

  8. Mysql 性能优化及问题

    MySQL max_allowed_packet设置及问题 查看 max_allowed_packet show VARIABLES like '%max_allowed_packet%'; 以下内容 ...

  9. 前端技术之:JavaScript Test 断言库

    expect 声称可以写更好的断言. https://github.com/mjackson/expect   chai 可以写BDD样式的断言,也可以写TDD样式的断言,可用于Node.js与浏览器 ...

  10. 暑期集训20190729 字典序(dictionary)

    [题目描述] 你需要构造一个1~n的排列,使得它满足m个条件,每个条件形如(ai,bi),表示ai必须在bi前面. 在此基础上,你需要让1尽可能靠前,然后你需要让2尽可能靠前,然后是3,4,5,…,n ...