|
@@ -5,15 +5,20 @@ import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.aliyuncs.DefaultAcsClient;
|
|
import com.aliyuncs.DefaultAcsClient;
|
|
|
import com.aliyuncs.IAcsClient;
|
|
import com.aliyuncs.IAcsClient;
|
|
|
|
|
+import com.aliyuncs.green.model.v20180509.ImageSyncScanRequest;
|
|
|
import com.aliyuncs.green.model.v20180509.TextScanRequest;
|
|
import com.aliyuncs.green.model.v20180509.TextScanRequest;
|
|
|
import com.aliyuncs.http.FormatType;
|
|
import com.aliyuncs.http.FormatType;
|
|
|
import com.aliyuncs.http.HttpResponse;
|
|
import com.aliyuncs.http.HttpResponse;
|
|
|
|
|
+import com.aliyuncs.http.MethodType;
|
|
|
|
|
+import com.aliyuncs.http.ProtocolType;
|
|
|
import com.aliyuncs.profile.DefaultProfile;
|
|
import com.aliyuncs.profile.DefaultProfile;
|
|
|
import com.aliyuncs.profile.IClientProfile;
|
|
import com.aliyuncs.profile.IClientProfile;
|
|
|
import com.izouma.nineth.config.AliyunProperties;
|
|
import com.izouma.nineth.config.AliyunProperties;
|
|
|
|
|
+import com.izouma.nineth.exception.BusinessException;
|
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
+import org.hibernate.internal.util.StringHelper;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.nio.charset.StandardCharsets;
|
|
@@ -54,7 +59,8 @@ public class ContentAuditService {
|
|
|
try {
|
|
try {
|
|
|
HttpResponse httpResponse = client.doAction(textScanRequest);
|
|
HttpResponse httpResponse = client.doAction(textScanRequest);
|
|
|
if (httpResponse.isSuccess()) {
|
|
if (httpResponse.isSuccess()) {
|
|
|
- JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), StandardCharsets.UTF_8));
|
|
|
|
|
|
|
+ JSONObject scrResponse = JSON
|
|
|
|
|
+ .parseObject(new String(httpResponse.getHttpContent(), StandardCharsets.UTF_8));
|
|
|
log.info(JSON.toJSONString(scrResponse, true));
|
|
log.info(JSON.toJSONString(scrResponse, true));
|
|
|
if (200 == scrResponse.getInteger("code")) {
|
|
if (200 == scrResponse.getInteger("code")) {
|
|
|
JSONArray taskResults = scrResponse.getJSONArray("data");
|
|
JSONArray taskResults = scrResponse.getJSONArray("data");
|
|
@@ -87,4 +93,104 @@ public class ContentAuditService {
|
|
|
}
|
|
}
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ public boolean auditImage(String imageUrl) {
|
|
|
|
|
+ IClientProfile profile = DefaultProfile.getProfile("cn-shenzhen",
|
|
|
|
|
+ aliyunProperties.getAccessKeyId(), aliyunProperties.getAccessKeySecret());
|
|
|
|
|
+ DefaultProfile
|
|
|
|
|
+ .addEndpoint("cn-shenzhen", "Green", "green.cn-shenzhen.aliyuncs.com");
|
|
|
|
|
+ IAcsClient client = new DefaultAcsClient(profile);
|
|
|
|
|
+
|
|
|
|
|
+ ImageSyncScanRequest imageSyncScanRequest = new ImageSyncScanRequest();
|
|
|
|
|
+ // 指定API返回格式。
|
|
|
|
|
+ imageSyncScanRequest.setAcceptFormat(FormatType.JSON);
|
|
|
|
|
+ // 指定请求方法。
|
|
|
|
|
+ imageSyncScanRequest.setMethod(MethodType.POST);
|
|
|
|
|
+ imageSyncScanRequest.setEncoding("utf-8");
|
|
|
|
|
+ // 支持HTTP和HTTPS。
|
|
|
|
|
+ imageSyncScanRequest.setProtocol(ProtocolType.HTTP);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ JSONObject httpBody = new JSONObject();
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 设置要检测的风险场景。计费依据此处传递的场景计算。
|
|
|
|
|
+ * 一次请求中可以同时检测多张图片,每张图片可以同时检测多个风险场景,计费按照场景计算。
|
|
|
|
|
+ * 例如,检测2张图片,场景传递porn和terrorism,计费会按照2张图片鉴黄,2张图片暴恐检测计算。
|
|
|
|
|
+ * porn:表示鉴黄场景。
|
|
|
|
|
+ */
|
|
|
|
|
+ httpBody.put("scenes", Collections.singletonList("porn"));
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 设置待检测图片。一张图片对应一个task。
|
|
|
|
|
+ * 多张图片同时检测时,处理的时间由最后一个处理完的图片决定。
|
|
|
|
|
+ * 通常情况下批量检测的平均响应时间比单张检测的要长。一次批量提交的图片数越多,响应时间被拉长的概率越高。
|
|
|
|
|
+ * 这里以单张图片检测作为示例, 如果是批量图片检测,请自行构建多个task。
|
|
|
|
|
+ */
|
|
|
|
|
+ JSONObject task = new JSONObject();
|
|
|
|
|
+ task.put("dataId", UUID.randomUUID().toString());
|
|
|
|
|
+
|
|
|
|
|
+ // 设置图片链接。URL中有特殊字符,需要对URL进行encode编码。
|
|
|
|
|
+ task.put("url", imageUrl);
|
|
|
|
|
+ task.put("time", new Date());
|
|
|
|
|
+ httpBody.put("tasks", Collections.singletonList(task));
|
|
|
|
|
+
|
|
|
|
|
+ imageSyncScanRequest
|
|
|
|
|
+ .setHttpContent(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()),
|
|
|
|
|
+ "UTF-8", FormatType.JSON);
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 请设置超时时间。服务端全链路处理超时时间为10秒,请做相应设置。
|
|
|
|
|
+ * 如果您设置的ReadTimeout小于服务端处理的时间,程序中会获得一个ReadTimeout异常。
|
|
|
|
|
+ */
|
|
|
|
|
+ imageSyncScanRequest.setConnectTimeout(3000);
|
|
|
|
|
+ imageSyncScanRequest.setReadTimeout(10000);
|
|
|
|
|
+ HttpResponse httpResponse = null;
|
|
|
|
|
+ try {
|
|
|
|
|
+ httpResponse = client.doAction(imageSyncScanRequest);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 服务端接收到请求,完成处理后返回的结果。
|
|
|
|
|
+ if (httpResponse != null && httpResponse.isSuccess()) {
|
|
|
|
|
+ JSONObject scrResponse = JSON.parseObject(org.apache.commons.codec.binary.StringUtils
|
|
|
|
|
+ .newStringUtf8(httpResponse.getHttpContent()));
|
|
|
|
|
+ System.out.println(JSON.toJSONString(scrResponse, true));
|
|
|
|
|
+ int requestCode = scrResponse.getIntValue("code");
|
|
|
|
|
+ // 每一张图片的检测结果。
|
|
|
|
|
+ JSONArray taskResults = scrResponse.getJSONArray("data");
|
|
|
|
|
+ if (200 == requestCode) {
|
|
|
|
|
+ for (Object taskResult : taskResults) {
|
|
|
|
|
+ // 单张图片的处理结果。
|
|
|
|
|
+ int taskCode = ((JSONObject) taskResult).getIntValue("code");
|
|
|
|
|
+ // 图片对应检测场景的处理结果。如果是多个场景,则会有每个场景的结果。
|
|
|
|
|
+ JSONArray sceneResults = ((JSONObject) taskResult).getJSONArray("results");
|
|
|
|
|
+ if (200 == taskCode) {
|
|
|
|
|
+ for (Object sceneResult : sceneResults) {
|
|
|
|
|
+ String scene = ((JSONObject) sceneResult).getString("scene");
|
|
|
|
|
+ String suggestion = ((JSONObject) sceneResult).getString("suggestion");
|
|
|
|
|
+ if (StringUtils.equals(suggestion, "pass")) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 根据scene和suggestion做相关处理。
|
|
|
|
|
+ // 根据不同的suggestion结果做业务上的不同处理。例如,将违规数据删除等。
|
|
|
|
|
+ System.out.println("scene = [" + scene + "]");
|
|
|
|
|
+ System.out.println("suggestion = [" + suggestion + "]");
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 单张图片处理失败, 原因视具体的情况详细分析。
|
|
|
|
|
+ System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult));
|
|
|
|
|
+ throw new BusinessException("审核失败");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 表明请求整体处理失败,原因视具体的情况详细分析。
|
|
|
|
|
+ */
|
|
|
|
|
+ System.out.println("the whole image scan request failed. response:" + JSON.toJSONString(scrResponse));
|
|
|
|
|
+ throw new BusinessException("审核失败");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|