站长视角
服务为王

UCloud优刻得云服务UAI Censor内容鉴黄Java版本实现

本文目录
显示

1.
前言

2.
UCloud

3.
申请

4.
代码案例

5.
小结

前言

最近不少小伙伴反映上传小黄图偶尔性的异常,并且不能上传动态图片,很是苦恼!无她,鉴黄API还没有这么智能,毕竟是自己训练的,不是那么专业!为了更好的服务广大网友,撸主决定接入更加智能快速的鉴黄服务。内容推荐阅读《通过UCloud AI内容审核UAI-Censor免费搭建鉴黄平台教程》。

UCloud

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

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

申请

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

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

代码案例

比较扯淡的是官方只提供了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://zhuanlan.zhihu.com/p/94460909


赞(0)
未经允许不得转载:康维主机测评-网站SEO优化 » UCloud优刻得云服务UAI Censor内容鉴黄Java版本实现
分享到

康维主机测评网 方便 全面 快速 找到你的需求

专注IDC行业国内外服务器资源共享发布