码迷,mamicode.com
首页 > 编程语言 > 详细

java对接阿里云内容安全接口,实现敏感字图检测

时间:2021-01-27 13:51:07      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:计费   概率   ISE   uuid   获得   catch   sage   dom   action   

AliyunContentSafetyService.java
`@Component
public class AliyunContentSafetyService {

/**
 * 图片鉴黄
 */
public static final String SCENE_PORN="porn";
/**
 * 图片暴恐涉政
 */
public static final String SCENE_TERRORISM="terrorism";
/**
 * 图文违规
 */
public static final String SCENE_AD="ad";
/**
 * 图片二维码
 */
public static final String SCENE_QRCODE="qrcode";
/**
 * 图片不良场景
 */
public static final String SCENE_LIVE="live";
/**
 * 图片logo
 */
public static final String SCENE_LOGO="logo";

/**
 * 文本内容检测  文本检测不可和图片检测一起使用
 */
public static final String SCENE_ANTISPAM="antispam";

private static final Logger logger=LoggerFactory.getLogger(AliyunContentSafetyService.class);
@Value("${oss.region}")
private static String region;
@Value("${oss.accessKeyId}")
private static String accessKeyId; 
@Value("${oss.secretAccessKey}")
private static String secretAccessKey;


/**
 * 检测图片
 * @param scenes 官方检测场景
 * @param bizType 自定义业务检测场景
 * @param photos 需要检测的图片地址 非本地
 * @return
 */
public static List<ContentSafetyResult> photoSafety(List<String> scenes,String bizType,List<String> photos) {
    if(photos == null || photos.isEmpty()) {
        logger.error("photos is empty");
        return null;
    }
    IClientProfile profile = DefaultProfile
            .getProfile(region, accessKeyId, secretAccessKey);
      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张图片暴恐检测计算。
       * scenes:表示鉴黄场景。
       */
      httpBody.put("scenes", scenes);
      if(StringUtils.isBlank(bizType)) {
          httpBody.put("bizType", Arrays.asList(bizType));
      }
      
      List<JSONObject> tasks=new ArrayList<JSONObject>();
      for(String photo:photos) {
          /**
           * 设置待检测图片。一张图片对应一个task。
           * 多张图片同时检测时,处理的时间由最后一个处理完的图片决定。
           * 通常情况下批量检测的平均响应时间比单张检测的要长。一次批量提交的图片数越多,响应时间被拉长的概率越高。
           * 这里以单张图片检测作为示例, 如果是批量图片检测,请自行构建多个task。
           */
          JSONObject task = new JSONObject();
          task.put("dataId", UUID.randomUUID().toString());

          // 设置图片链接。
          task.put("url", photo);
          task.put("time", new Date());
          
          tasks.add(task);
      }
      httpBody.put("tasks", tasks);
      
      imageSyncScanRequest.setHttpContent(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()),
          "UTF-8", FormatType.JSON);

      /**
       * 请设置超时时间。服务端全链路处理超时时间为10秒,请做相应设置。
       * 如果您设置的ReadTimeout小于服务端处理的时间,程序中会获得一个read timeout异常。
       */
      imageSyncScanRequest.setConnectTimeout(3000);
      imageSyncScanRequest.setReadTimeout(10000);
      HttpResponse httpResponse = null;
      try {
          httpResponse = client.doAction(imageSyncScanRequest);
          logger.info("send photoSafety request");
      } catch (Exception e) {
          logger.error(e.getMessage(),e);
      }
      List<ContentSafetyResult> results=new ArrayList<ContentSafetyResult>();
      // 服务端接收到请求,完成处理后返回的结果。
      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) {
                          ContentSafetyResult result=new ContentSafetyResult();
                          result.setScene(((JSONObject) sceneResult).getString("scene"));
                          result.setSuggestion(((JSONObject) sceneResult).getString("suggestion"));
                          result.setLabel(((JSONObject) sceneResult).getString("label"));
                          result.setContent(((JSONObject) taskResult).getString("url"));
                          result.setType(ContentSafetyResult.TYPE_PHOTO);
                          results.add(result);
                      }
                  } else {
                      // 单张图片处理失败, 原因视具体的情况详细分析。
                      logger.error("task process fail. task response:" + JSON.toJSONString(taskResult));
                      return null;
                  }
              }
          } else {
              /**
               * 表明请求整体处理失败,原因视具体的情况详细分析。
               */
              logger.error("the whole image scan request failed. response:" + JSON.toJSONString(scrResponse));
              return null;
          }
      }
      return results;
}

/**
 * 检测文字
 * @param content 要检测的文本
 * @param scene 官方检测场景
 * @return
 */
public static List<ContentSafetyResult> textSafety(String content,String scene){
    if(StringUtils.isBlank(content)) {
        return null;
    }
    IClientProfile profile = DefaultProfile
            .getProfile(region, accessKeyId, secretAccessKey);             
        IAcsClient client = new DefaultAcsClient(profile);
        TextScanRequest textScanRequest = new TextScanRequest();
        textScanRequest.setAcceptFormat(FormatType.JSON); // 指定API返回格式。
        textScanRequest.setHttpContentType(FormatType.JSON);
        textScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定请求方法。
        textScanRequest.setEncoding("UTF-8");
        textScanRequest.setRegionId("cn-beijing");
        List<Map<String, Object>> tasks = new ArrayList<Map<String, Object>>();
        Map<String, Object> task1 = new LinkedHashMap<String, Object>();
        task1.put("dataId", UUID.randomUUID().toString());
        /**
         * 待检测的文本,长度不超过10000个字符。
         */
        task1.put("content", content);
        tasks.add(task1);
        JSONObject data = new JSONObject();

        /**
         * 检测场景。文本垃圾检测请传递antispam。
         **/
        data.put("scenes", Arrays.asList(scene));
        data.put("tasks", tasks);

        try {
            textScanRequest.setHttpContent(data.toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON);
        } catch (UnsupportedEncodingException e) {
            logger.error(e.getMessage(),e);
            return null;
        }
        // 请务必设置超时时间。
        textScanRequest.setConnectTimeout(3000);
        textScanRequest.setReadTimeout(6000);
        List<ContentSafetyResult> results=new ArrayList<ContentSafetyResult>();
        try {
            HttpResponse httpResponse = client.doAction(textScanRequest);
            if(httpResponse.isSuccess()){
                JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
                System.out.println(JSON.toJSONString(scrResponse, true));
                if (200 == scrResponse.getInteger("code")) {
                    JSONArray taskResults = scrResponse.getJSONArray("data");
                    for (Object taskResult : taskResults) {
                        if(200 == ((JSONObject)taskResult).getInteger("code")){
                            JSONArray sceneResults = ((JSONObject)taskResult).getJSONArray("results");
                            for (Object sceneResult : sceneResults) {
                                ContentSafetyResult result=new ContentSafetyResult();
                                result.setType(ContentSafetyResult.TYPE_TEXT);
                                result.setContent(content);
                                result.setScene(((JSONObject)sceneResult).getString("scene"));
                                result.setSuggestion(((JSONObject)sceneResult).getString("suggestion"));
                                result.setLabel(((JSONObject)sceneResult).getString("label"));
                                results.add(result);
                            }
                        }else{
                            logger.warn("task process fail:" + ((JSONObject)taskResult).getInteger("code"));
                        }
                    }
                } else {
                    logger.warn("detect not success. code:" + scrResponse.getInteger("code"));
                }
            }else{
                logger.warn("response not success. status:" + httpResponse.getStatus());
            }
        } catch (ServerException e) {
            logger.error(e.getMessage(),e);
        } catch (ClientException e) {
            logger.error(e.getMessage(),e);
        } catch (Exception e) {
            logger.error(e.getMessage(),e);
        }
    return results;
}

/**
 * 查找预警的数据
 * @param results
 * @return
 */
public static List<ContentSafetyResult> findWarningData(List<ContentSafetyResult> results){
    if(results == null || results.isEmpty()) {
        return Collections.emptyList();
    }
    List<ContentSafetyResult> warningResults=new ArrayList<ContentSafetyResult>();
    for (ContentSafetyResult result : results) {
        if(result.getSuggestion() != ContentSafetyResult.SUGGESTION_PASS) {
            warningResults.add(result);
        }
    }
    return warningResults;
}

}`

ContentSafetyResult.java
`public class ContentSafetyResult {
/**
* 图片
/
public static final int TYPE_PHOTO=1;
/
*
* 文字
*/
public static final int TYPE_TEXT=2;

/**
 * 文本正常,可以直接放行
 */
public static final String SUGGESTION_PASS="pass";
/**
 * 文本需要进一步人工审核
 */
public static final String SUGGESTION_REVIEW="review";
/**
 * 文本违规,可以直接删除或者限制公开
 */
public static final String SUGGESTION_BLOCK="block";

private Integer type;
private String  content;
private String  scene;
private String  suggestion;
private String  label;
public Integer getType() {
    return type;
}
public void setType(Integer type) {
    this.type = type;
}
public String getContent() {
    return content;
}
public void setContent(String content) {
    this.content = content;
}
public String getScene() {
    return scene;
}
public void setScene(String scene) {
    this.scene = scene;
}
public String getSuggestion() {
    return suggestion;
}
public void setSuggestion(String suggestion) {
    this.suggestion = suggestion;
}
public String getLabel() {
    return label;
}
public void setLabel(String label) {
    this.label = label;
}
@Override
public String toString() {
    return "ContentSafetyResult [type=" + type + ", content=" + content + ", scene=" + scene + ", suggestion="
            + suggestion + ", label=" + label + "]";
}

}`

java对接阿里云内容安全接口,实现敏感字图检测

标签:计费   概率   ISE   uuid   获得   catch   sage   dom   action   

原文地址:https://www.cnblogs.com/pipiapi/p/14331879.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!