前言
最近不少小夥伴反映上傳小黃圖偶爾性的異常,並且不能上傳動態圖片,很是苦惱!無她,鑑黃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
說明通過。
小結
只有殼的小黃圖是沒有靈魂的,希望各位網友,發揚艱苦奮鬥的精神,把有限的靈魂注入到無限的小黃圖中!這樣,擼主纔有動力升級更多有趣的功能。
此次升級優化了手機端顯示的問題,使其更加耐看。接入新的鑑黃服務,和自建鑑黃一起使用雙重保駕護航,同時小夥伴們可以自由的上傳喜歡的動圖了。