UCloud 云服务内容审核 Java 版本实现

前言
最近不少小伙伴反映上传小黄图偶尔性的异常,并且不能上传动态图片,很是苦恼!无她,鉴黄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
		}
	}
}
撸主只需要关心RetCode和Porn这两个参数就可以了,RetCode 为0说明API调用正常,Porn中的参数Suggestion为pass说明通过。
小结
只有壳的小黄图是没有灵魂的,希望各位网友,发扬艰苦奋斗的精神,把有限的灵魂注入到无限的小黄图中!这样,撸主才有动力升级更多有趣的功能。
此次升级优化了手机端显示的问题,使其更加耐看。接入新的鉴黄服务,和自建鉴黄一起使用双重保驾护航,同时小伙伴们可以自由的上传喜欢的动图了。
参考
https://docs.ucloud.cn/ai/uai-censor/access/key
https://docs.ucloud.cn/ai/uai-censor/api/censor/image
UCloud 云服务内容审核 Java 版本实现的更多相关文章
- 利用VisualVM监测Azure云服务中的Java应用
		在做Java开发的时候,我们需要在上线之前对程序进行压力测试,对程序的性能进行全面的监控,了解JVM的CPU,内存,GC,classes,线程等等信息,或者在程序上线运行的过程当中以便于诊断问题或者对 ... 
- 关于消息推送的补充,主要介绍服务端的实现,包含object c 版本 c 版本 java 版本 php 版本 (转)
		要实现消息推送功能,我们可以采用第三方(腾讯:信鸽:百度:云推送:极光推送:友盟):当然,因为各种原因,我们不能使用第三方的推送服务,那我们就需要自己编写服务端.在网上寻觅了很久,找到一篇很不错的讲解 ... 
- 北京联想招聘-java 云服务开发工程师 加入qq 群:220486180 或者直接在此 留言咨询
		Position Title: 云服务开发工程师 Experience Required: 3 - 5 Years 负责联想企业网盘服务端开发 Position Requirements 1. ... 
- 自动判断文本文件编码来读取文本文件内容(.net版本和java版本)
		.net版本 using System; using System.IO; using System.Text; namespace G2.Common { /// <summary> / ... 
- [转]在 Azure 云服务上设计大规模服务的最佳实践
		本文转自:http://technet.microsoft.com/zh-cn/magazine/jj717232.aspx 英文版:http://msdn.microsoft.com/library ... 
- 前后端分离ueditor富文本编辑器的使用-Java版本
		最近在写一个自己的后台管理系统(主要是写着玩的,用来熟悉后端java的知识,目前只是会简单的写点接口),想在项目中编写一个发布新闻文章的功能,想到了使用百度的ueditor富文本编辑器,网上找了很多j ... 
- Linux云服务部署Spring boot项目
		Linux云服务部署Spring boot项目 背景: 之前经过两个周的时间,做了一个简单的博客网站,网址:点击进入,在本地可以正常使用以后,想着部署到服务器上,给大家伙看个乐呵,于是有了这篇部署文章 ... 
- 基于云服务MRS构建DolphinScheduler2调度系统
		摘要:本文介绍如何搭建DolphinScheduler并运行MRS作业. 本文分享自华为云社区<基于云服务MRS构建DolphinScheduler2调度系统>,作者: 啊喔YeYe . ... 
- 基于AWS的云服务架构最佳实践
		ZZ from: http://blog.csdn.net/wireless_com/article/details/43305701 近年来,对于打造高度可扩展的应用程序,软件架构师们挖掘了若干相关 ... 
随机推荐
- Django 从零开始
			Django在Python的web开发框架中属于重量级的框架,功能多而全,但是相对的体积和坑也会比较多,但是其实学习Python的web开发个人觉得Django其实会比Flask好上手,特别是0基础的 ... 
- Java自动化测试框架-04 - 来给你的测试报告化个妆整个形 - (上)(详细教程)
			简介 前边通过宏哥的讲解和分享想必小伙伴们和童鞋们都已经见过testng框架生成的测试报告,是不是它的样子和长相实在是不敢让大家伙恭维.那么今天宏哥就当一回美容师,由宏哥来给它美美容:当一回外科医生, ... 
- .NET Core3.0 日志 logging
			多年的经验,日志记录是软件开发的重要组成部分.没有日志记录机制的系统不是完善的系统.在开发阶段可以通过debug附件进程进行交互调试,可以检测到一些问题,但是在上线之后,日志的记录起到至关重要的作用. ... 
- 简单多层神经网络实现异或XOR
			最近在看<Neural Network Design_Hagan> 然后想自己实现一个XOR 的网络. 由于单层神经网络不能将异或的判定分为两类. 根据 a^b=(a&~b)|(~ ... 
- django-Views之装饰器(四)
			1.选择支持的请求方式 from django.views.decorators.http import require_http_methods from django.shortcuts impo ... 
- 随机数产生器:Random.Next
			Random类是一个产生伪随机数字的类,它的构造函数有两种,一个是直接New Random(),另外一个是New Random(Int32),前者是根据触发那刻的系统时间做为种子,来产生一个随机数字, ... 
- java 调用启动远程shell脚本,启动spark
			1 依赖 <!--远程调用shell--> <dependency> <groupId>ch.ethz.ganymed</groupId> <ar ... 
- python写购物车小程序
			#!/usr/bin/env python3 # -*- coding:utf-8 -*- # @Author: Skyell Wang # @Time : 2018/5/22 15:50 # 基础要 ... 
- 智和网管平台SugarNMS助力网络安全运维等保2.0建设
			智和信通智和网管平台SugarNMS结合<信息安全技术 网络安全等级保护基本要求>(GB/T 22239-2019)等国家标准文件以及用户提出的网络安全管理需求进行产品设计,推出“监控+展 ... 
- python——多线程
			多线程特点: • 线程的并发是利用cpu上下文的切换(是并发,不是并行) • 多线程执行的顺序是无序的 • 多线程共享全局变量 • 线程是继承在进程里的,没有进程就没有线程 • GIL全局解释器锁 • ... 
