最近很多小夥伴反映上傳小黃圖偶爾性的異常,而且不能上傳動態圖片,非常苦惱!無她,鑑黃API
尚未這麼智能,畢竟是本身訓練的,不是那麼專業!爲了更好的服務廣大網友,擼主決定接入更加智能快速的鑑黃服務。html
UCloud
內容審覈產品,基於海量訓練數據,結合深度學習識別技術,基於UCloud
底層雲服務,提供99.9%
的服務穩定性保障。可以精準識別圖片、視頻中的低俗內容,適用於各種用戶的鑑黃審覈需求,幫助您在業務層面下降違規風險,同時應用算法服務,也大大減輕了人工審覈的投入成本。算法
最主要的是,鑑黃識別服務在2020年6月30日
前,均免費試用。即便到期之後,小夥伴們也不用太擔憂,鑑黃識別服務訂價採起階梯訂價方式,每日2000
張免費調用額度,剩餘部分不累積。日2000
張,爾等也只有仰望的份了。api
地址:www.ucloud.cn/site/product/uaicensor.htmlapp
總之很簡單,都是中文文檔,三五分鐘就能夠搞定的事情。工具
比較扯淡的是官方只提供了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
鑑黃工具類:url
/** * 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
簽名算法流程包括四步:rest
代碼案例:code
/** * 生成簽名 */ 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
說明經過。
只有殼的小黃圖是沒有靈魂的,但願各位網友,發揚艱苦奮鬥的精神,把有限的靈魂注入到無限的小黃圖中!這樣,擼主纔有動力升級更多有趣的功能。
這次升級優化了手機端顯示的問題,使其更加耐看。接入新的鑑黃服務,和自建鑑黃一塊兒使用雙重保駕護航,同時小夥伴們能夠自由的上傳喜歡的動圖了。