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://www.cloudbed.vip
https://docs.ucloud.cn/ai/uai-censor/access/key
https://docs.ucloud.cn/ai/uai-censor/api/censor/image