zoukankan      html  css  js  c++  java
  • 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
    		}
    	}
    }
    

    撸主只需要关心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

  • 相关阅读:
    Gentoo 使用genkernel之后,修改了kernel,重新编译kernel和生成initramfs
    如何让git自动在commit message中加入你需要的sob?
    Gentoo:请安装bashcompletion package
    Kernel开发 SubmittingPatches,有关ifdef和static inline & macro
    Kernel开发 Thunderbird配置 From kernel documentation
    Gentoo 添加gentoozh overlay
    linux把文件压缩成.tar.gz的命令
    redhat下装ftp服务器(vsftpd)
    GDB调试精粹及使用实例
    linux中常用的头文件
  • 原文地址:https://www.cnblogs.com/smallSevens/p/11957664.html
Copyright © 2011-2022 走看看