UCloud 雲服務內容審覈 Java 版本實現

前言

最近不少小夥伴反映上傳小黃圖偶爾性的異常,並且不能上傳動態圖片,很是苦惱!無她,鑑黃API還沒有這麼智能,畢竟是自己訓練的,不是那麼專業!爲了更好的服務廣大網友,擼主決定接入更加智能快速的鑑黃服務。

UCloud

UCloud內容審覈產品,基於海量訓練數據,結合深度學習識別技術,基於UCloud底層雲服務,提供99.9%的服務穩定性保障。能夠精準識別圖片、視頻中的低俗內容,適用於各類用戶的鑑黃審覈需求,幫助您在業務層面降低違規風險,同時應用算法服務,也大大減輕了人工審覈的投入成本。

最主要的是,鑑黃識別服務在2020年6月30日前,均免費試用。即使到期以後,小夥伴們也不用太擔心,鑑黃識別服務定價採取階梯定價方式,每日2000張免費調用額度,剩餘部分不累積。日2000張,爾等也只有仰望的份了。

申請

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

  • 創建UAI Censor AI內容審覈應用
  • 獲取賬戶公私鑰,鑑黃必備

總之很簡單,都是中文文檔,三五分鐘就可以搞定的事情。

代碼案例

比較扯淡的是官方只提供了PythonPHP版本的生成簽名代碼,難道我大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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章