前言
至于为什么使用百度智能云,因为百度智能云有免费的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;
}
}
这里定义的实体类中解析数据有很多重复的代码,可以改进。
后续
如果大佬有更好的工具类方便分享的话私我或者留言等都可以,感谢!