前言

至于为什么使用百度智能云,因为百度智能云有免费的api。

1、怎么使用?先看官方的api在线调试,前提你需要登录

2、观看视频后就已经学会基本的使用了!

3、使用之前推荐先观看官方的使用文档:官方文档

项目使用

这里只记录怎么在java代码中使用。

1 导入maven依赖

        <!--百度智能云 https://cloud.baidu.com/doc/ANTIPORN/s/hk3h6xdbp-->
        <dependency>
            <groupId>com.baidu.aip</groupId>
            <artifactId>java-sdk</artifactId>
            <version>4.16.6</version>
        </dependency>
        <!--百度智能云-->

2.1 工具类 BaiDuYunContentModerationUtil

/**
 * @Classname BaiDuYunContentModerationUtil
 * @Date 2023/7/13 8:55
 * @Created ZFC
 */

import com.baidu.aip.contentcensor.AipContentCensor;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;


/**
 * 百度智能云内容审核工具类
 */
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "baiduyun")
public class BaiDuYunContentModerationUtil {
	/**
     * 这里的参数之所以没有直接声明是因为使用到了nacos
     * 因为用到了@ConfigurationProperties注解,他会在springboot启动的时候注入baiduyun
     *
     * 我在nacos定义的内容是:
     * baiduyun:
     *   api_key: ******
     *   secret_key: ******
     *   appid: ******
     */

    private String api_key;
    private String secret_key;
    private String appid;

    /**
     * 内容审核
     * @return
     */
    public AipContentCensor contentScan(){
        AipContentCensor aipContentCensor = new AipContentCensor(appid,api_key,secret_key);
        // 可选:设置网络连接参数
        aipContentCensor.setConnectionTimeoutInMillis(3000);
        aipContentCensor.setSocketTimeoutInMillis(60000);
        //这里可能还有其他相关的参数,我也不是太了解,暂时先用着,如果看到这篇文章的大佬有更好的工具类希望可以分享一下,嘿嘿
        return aipContentCensor;
    }
}

2.2 定义测试类测试 MyTestContent

import com.baidu.aip.contentcensor.AipContentCensor;
import com.baidu.aip.contentcensor.EImgType;
import com.heima.common.baiduyun.result.CensorResult;
import com.heima.common.baiduyun.util.BaiDuYunContentModerationUtil;
import com.heima.wemedia.WemediaApplication;
import org.json.JSONObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @Classname MyTestContent
 * @Date 2023/7/12 16:35
 * @Created ZFC
 */
@SpringBootTest(classes = WemediaApplication.class)
@RunWith(SpringRunner.class)
public class MyTestContent {

    @Autowired
    private BaiDuYunContentModerationUtil contentModerationUtil;

    @Test
    public void getTextContent() {
        AipContentCensor aipContentCensor = contentModerationUtil.contentScan();
        //
        String compliance = "在这个充满机遇和挑战的时代,我们需要更多的勇气和创新精神,才能在激烈的市场竞争中获得成功。";
        String irregularity = "冰毒、国家主席";
        String suspected = "这里有一些涉及敏感话题的文本,包括色情、暴力、恐怖主义等。";
        JSONObject jsonObject = aipContentCensor.textCensorUserDefined(irregularity);

        CensorResult censorResult = new CensorResult();
        System.out.println("censorResult.getCensorResult(jsonObject) = " + censorResult.textCacn(jsonObject));
    }

    @Test
    public void getImageContent(){
        AipContentCensor aipContentCensor = contentModerationUtil.contentScan();
        String imageUrl = "https://img-blog.csdnimg.cn/20200718111324945.png";
        String weigui = "http://agzy.youth.cn/zt/2019qmjyl/kglx1/201903/W020190330297608130021.jpg";
        JSONObject jsonObject = aipContentCensor.imageCensorUserDefined(weigui, EImgType.URL, null);

        CensorResult censorResult = new CensorResult();
        System.out.println("censorResult.getCensorResult(jsonObject) = " + censorResult.imageScan(jsonObject));
    }
}

2.3 定义实体类接收参数(根据自己的需要来)

package com.heima.common.baiduyun.result;

import lombok.Data;
import lombok.ToString;
import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *     审核内容的返回结果
 * </p>
 * @Classname CensorResult
 * @Date 2023/7/13 9:39
 * @Created ZFC
 */
@Data
@ToString
public class CensorResult {
    /**
     * 	请求唯一id
     */
    private Long log_id;

    /**
     * 审核结果,可取值:合规、不合规、疑似、审核失败
     */
    private String conclusion;

    /**
     * 	不合规项描述信息
     */
    private String msg;

    /**
     * 0:低质灌水、1:违禁违规、2:文本色情、3:敏感信息、4:恶意推广、5:低俗辱骂 6:恶意推广-联系方式、7:恶意推广-软文推广
     */
    private Integer subType;

    /**
     * 审核结果类型,可取值1.合规,2.不合规,3.疑似,4.审核失败
     */
    private Integer conclusionType;

    /**
     * 敏感关键字
     */
    private List<String> words;


     /**
     * 文本审核
     * @param jsonObject
     * @return
     */
    public CensorResult textCacn(JSONObject jsonObject){
        CensorResult censorResult = new CensorResult();

        //审核内容为空直接返回
        if (jsonObject.length() == 0 || jsonObject == null){
            return censorResult;
        }

        //唯一编号
        censorResult.setLog_id((Long) jsonObject.get("log_id"));
        //审核结果类型,可取值1、2、3、4,分别代表1:合规,2:不合规,3:疑似,4:审核失败
        Integer conclusionType = (Integer) jsonObject.get("conclusionType");
        censorResult.setConclusionType(conclusionType);


        if (conclusionType!=1){
            JSONArray jsonArray = (JSONArray) jsonObject.get("data");

            for (int i = 0; i < jsonArray.length(); i++) {
                // 获取当前位置上的 JSONObject
                JSONObject jsonData = jsonArray.getJSONObject(i);
                // 获取 JSONObject 中的 msg 属性值 并赋值
                censorResult.setMsg((String) jsonData.get("msg"));
                // 获取 JSONObject 中的 conclusion 属性值 并赋值
                censorResult.setConclusion((String) jsonData.get("conclusion"));
                // 获取 JSONObject 中的 msg 属性值 并赋值
                censorResult.setMsg((String) jsonData.get("msg"));
                // 获取 JSONObject 中的 subType 属性值 并赋值
                censorResult.setSubType((Integer) jsonData.get("subType"));

                //文本违规原因的详细信息 遍历
                JSONArray hitsArray = jsonData.getJSONArray("hits");

                if (hitsArray!=null && hitsArray.length()>0){
                    for (int h = 0; h < hitsArray.length(); h++) {
                        JSONObject hits_key = hitsArray.getJSONObject(h);
                        //获取文本命中词库的关键词
                        JSONArray words = hits_key.getJSONArray("words");

                        if (words.length() >0 && words != null){
                            //定义list 存储审核失败的文字
                            List<String> list = new ArrayList<>();
                            for (int w = 0; w < words.length(); w++) {
                                String word_name = words.getString(w);
                                list.add(word_name);
                            }
                            censorResult.setWords(list);
                        }
                    }
                }
            }
        }

        return censorResult;
    }

    /**
     * 图片审核
     * @param jsonObject
     * @return
     */
    public CensorResult imageScan(JSONObject jsonObject){
        CensorResult censorResult = new CensorResult();

        //审核内容为空直接返回
        if (jsonObject.length() == 0 || jsonObject == null){
            return censorResult;
        }

        //唯一编号
        censorResult.setLog_id((Long) jsonObject.get("log_id"));
        //审核结果类型,可取值1、2、3、4,分别代表1:合规,2:不合规,3:疑似,4:审核失败
        Integer conclusionType = (Integer) jsonObject.get("conclusionType");
        censorResult.setConclusionType(conclusionType);

        if (conclusionType!=1){
            JSONArray jsonArray = (JSONArray) jsonObject.get("data");

            for (int i = 0; i < jsonArray.length(); i++) {
                // 获取当前位置上的 JSONObject
                JSONObject jsonData = jsonArray.getJSONObject(i);
                // 获取 JSONObject 中的 msg 属性值 并赋值
                censorResult.setMsg((String) jsonData.get("msg"));
                // 获取 JSONObject 中的 conclusion 属性值 并赋值
                censorResult.setConclusion((String) jsonData.get("conclusion"));
                // 获取 JSONObject 中的 msg 属性值 并赋值
                censorResult.setMsg((String) jsonData.get("msg"));
                // 获取 JSONObject 中的 subType 属性值 并赋值
                censorResult.setSubType((Integer) jsonData.get("subType"));

                //文本违规原因的详细信息 遍历
                JSONArray starsList = jsonData.getJSONArray("stars");

                if (starsList.length() >0 && starsList != null){
                    //定义list 存储审核失败的文字
                    List<String> list = new ArrayList<>();
                    for (int j = 0; j < starsList.length(); j++) {
                        JSONObject starsData = starsList.getJSONObject(j);
                        list.add(starsData.getString("name"));
                    }
                    censorResult.setWords(list);
                }
            }

        }
        return censorResult;
    }
}

这里定义的实体类中解析数据有很多重复的代码,可以改进。

后续

如果大佬有更好的工具类方便分享的话私我或者留言等都可以,感谢!