1 问题
调用阿里云 内容安全 文本内容审核接口时,内容安全1.0版企业才能开通,个人无法开通使用,因此调不了接口。
2 解决思路
我去阿里云开通服务,发现有内容安全增强版,个人账户即可开通使用。开通后,发现它调用的接口不同。我根据内容安全增强版的接口文档,参照内容安全1.0版的方法进行修改,注意不同参数,成功调用内容安全接口。
注意:图片安全接口调用更复杂,需要根据接口文档去修改工具类和测试代码。
文本内容审核增强接口 如何使用文本审核增强版_内容安全-阿里云帮助中心
图片内容审核增强接口 如何使用图片审核增强版API_内容安全-阿里云帮助中心
3 工具类
需要构建一个变量保存需要返回的数据:Map<String, String> resultMap = new HashMap<>();
文本自动检查工具类GreenTextScan2:
package com.heima.common.aliyun;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.green20220302.Client;
import com.aliyun.green20220302.models.TextModerationRequest;
import com.aliyun.green20220302.models.TextModerationResponse;
import com.aliyun.green20220302.models.TextModerationResponseBody;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.green.model.v20180509.TextScanRequest;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.http.HttpResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.util.*;
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "aliyun")
//文本审核增强版
public class GreenTextScan2 {
private String accessKeyId;
private String secret;
private String scenes;
public Map greeTextScan(String content) throws Exception {
System.out.println(accessKeyId);
Config config = new Config();
/**
* 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
* 常见获取环境变量方式:
* 方式一:
* 获取RAM用户AccessKey ID:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 获取RAM用户AccessKey Secret:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
* 方式二:
* 获取RAM用户AccessKey ID:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 获取RAM用户AccessKey Secret:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
*/
config.setAccessKeyId(accessKeyId);
config.setAccessKeySecret(secret);
//接入区域和地址请根据实际情况修改
//config.setRegionId("cn-shanghai");
config.setRegionId("cn-hangzhou");
//config.setEndpoint("green-cip.cn-shanghai.aliyuncs.com");
config.setEndpoint("green-cip.cn-hangzhou.aliyuncs.com");
//连接时超时时间,单位毫秒(ms)。
config.setReadTimeout(6000);
//读取时超时时间,单位毫秒(ms)。
config.setConnectTimeout(3000);
//设置http代理。
//config.setHttpProxy("http://10.10.xx.xx:xxxx");
//设置https代理。
//config.setHttpsProxy("https://10.10.xx.xx:xxxx");
// 注意,此处实例化的client请尽可能重复使用,避免重复建立连接,提升检测性能
Client client = new Client(config);
// 创建RuntimeObject实例并设置运行参数。
RuntimeOptions runtime = new RuntimeOptions();
runtime.readTimeout = 10000;
runtime.connectTimeout = 10000;
//检测参数构造
JSONObject serviceParameters = new JSONObject();
serviceParameters.put("content", content);
if (serviceParameters.get("content") == null || serviceParameters.getString("content").trim().length() == 0) {
System.out.println("text moderation content is empty");
return null;
}
TextModerationRequest textModerationRequest = new TextModerationRequest();
/*
文本检测service:内容安全控制台文本增强版规则配置的serviceCode,示例:chat_detection
审核服务类型,包括:
nickname_detection:用户昵称检测
chat_detection:私聊互动内容检测
comment_detection:公聊评论内容检测
ai_art_detection:AIGC文字检测
ad_compliance_detection:广告法合规检测
pgc_detection:PGC教学物料检测
Arrays.asList("ad_compliance_detection")
*/
// textModerationRequest.setService("service code");
textModerationRequest.setService("ad_compliance_detection");
textModerationRequest.setServiceParameters(serviceParameters.toJSONString());
Map<String, String> resultMap = new HashMap<>();
try {
// 调用方法获取检测结果。
TextModerationResponse response = client.textModerationWithOptions(textModerationRequest, runtime);
System.out.println(response);
// 自动路由。
if (response != null) {
// 服务端错误,区域切换到cn-beijing。
if (500 == response.getStatusCode() || (response.getBody() != null && 500 == (response.getBody().getCode()))) {
// 接入区域和地址请根据实际情况修改。
config.setRegionId("cn-beijing");
config.setEndpoint("green-cip.cn-beijing.aliyuncs.com");
client = new Client(config);
response = client.textModerationWithOptions(textModerationRequest, runtime);
}
}
// 打印检测结果。
if (response != null) {
if (response.getStatusCode() == 200) {
TextModerationResponseBody result = response.getBody();
System.out.println(JSON.toJSONString(result));
Integer code = result.getCode();
if (code != null && code == 200) {
TextModerationResponseBody.TextModerationResponseBodyData data = result.getData();
System.out.println("labels = [" + data.getLabels() + "]");
System.out.println("reason = [" + data.getReason() + "]");
resultMap.put("suggestion", "pass");
resultMap.put("labels", data.getLabels());
resultMap.put("reason", data.getReason());
return resultMap;
} else {
System.out.println("text moderation not success. code:" + code);
resultMap.put("message", "text moderation not success. code:");
resultMap.put("code", code.toString());
return resultMap;
}
} else {
System.out.println("response not success. status:" + response.getStatusCode());
return null;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
图片自动检查工具类GreenImageScan3:
package com.heima.common.aliyun;
import com.alibaba.fastjson.JSON;
import com.aliyun.green20220302.Client;
import com.aliyun.green20220302.models.ImageModerationRequest;
import com.aliyun.green20220302.models.ImageModerationResponse;
import com.aliyun.green20220302.models.ImageModerationResponseBody;
import com.aliyun.green20220302.models.ImageModerationResponseBody.ImageModerationResponseBodyData;
import com.aliyun.green20220302.models.ImageModerationResponseBody.ImageModerationResponseBodyDataResult;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "aliyun")
public class GreenImageScan3 {
private String accessKeyId;
private String secret;
private String scenes;
/**
* 一张阿里云oss图片可检测
* @param imageUrl
* @return
* @throws Exception
*/
public Map imageScan(String imageUrl) throws Exception {
/**
* 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
* 常见获取环境变量方式:
* 方式一:
* 获取RAM用户AccessKey ID:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 获取RAM用户AccessKey Secret:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
* 方式二:
* 获取RAM用户AccessKey ID:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 获取RAM用户AccessKey Secret:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
*/
String accessKeyId2 = accessKeyId;
String accessKeySecret = secret;
// 接入区域和地址请根据实际情况修改。
ImageModerationResponse response = invokeFunction(accessKeyId2, accessKeySecret, "green-cip.cn-hangzhou.aliyuncs.com", imageUrl);
Map<String, String> resultMap = new HashMap<>();
try {
// 自动路由。
if (response != null) {
//区域切换到cn-beijing。
if (500 == response.getStatusCode() || (response.getBody() != null && 500 == (response.getBody().getCode()))) {
// 接入区域和地址请根据实际情况修改。
response = invokeFunction(accessKeyId2, accessKeySecret, "green-cip.cn-beijing.aliyuncs.com", imageUrl);
}
}
// 打印检测结果。
if (response != null) {
if (response.getStatusCode() == 200) {
ImageModerationResponseBody body = response.getBody();
System.out.println("requestId=" + body.getRequestId());
System.out.println("code=" + body.getCode());
System.out.println("msg=" + body.getMsg());
if (body.getCode() == 200) {
ImageModerationResponseBodyData data = body.getData();
System.out.println("dataId=" + data.getDataId());
List<ImageModerationResponseBodyDataResult> results = data.getResult();
for (ImageModerationResponseBodyDataResult result : results) {
System.out.println("label=" + result.getLabel());
System.out.println("confidence=" + result.getConfidence());
resultMap.put("suggestion", "pass");
resultMap.put("label", result.getLabel());
resultMap.put("confidence", result.getConfidence() + "");
return resultMap;
}
} else {
System.out.println("image moderation not success. code:" + body.getCode());
resultMap.put("message", "image moderation not success. code:");
resultMap.put("code", body.getCode().toString());
return resultMap;
}
} else {
System.out.println("response not success. status:" + response.getStatusCode());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 创建请求客户端
*
* @param accessKeyId
* @param accessKeySecret
* @param endpoint
* @return
* @throws Exception
*/
public Client createClient(String accessKeyId, String accessKeySecret, String endpoint) throws Exception {
Config config = new Config();
config.setAccessKeyId(accessKeyId);
config.setAccessKeySecret(accessKeySecret);
// 设置http代理。
//config.setHttpProxy("http://10.10.xx.xx:xxxx");
// 设置https代理。
//config.setHttpsProxy("https://10.10.xx.xx:xxxx");
// 接入区域和地址请根据实际情况修改
config.setEndpoint(endpoint);
return new Client(config);
}
public ImageModerationResponse invokeFunction(String accessKeyId, String accessKeySecret, String endpoint, String imageUrl) throws Exception {
//注意,此处实例化的client请尽可能重复使用,避免重复建立连接,提升检测性能。
Client client = createClient(accessKeyId, accessKeySecret, endpoint);
// 创建RuntimeObject实例并设置运行参数
RuntimeOptions runtime = new RuntimeOptions();
// 检测参数构造。
Map<String, String> serviceParameters = new HashMap<>();
//公网可访问的URL。
serviceParameters.put("imageUrl", imageUrl);
//待检测数据唯一标识
serviceParameters.put("dataId", UUID.randomUUID().toString());
ImageModerationRequest request = new ImageModerationRequest();
// 图片检测service:内容安全控制台图片增强版规则配置的serviceCode,示例:baselineCheck, profilePhotoCheck
request.setService("baselineCheck");
request.setServiceParameters(JSON.toJSONString(serviceParameters));
ImageModerationResponse response = null;
try {
response = client.imageModerationWithOptions(request, runtime);
System.out.println(response);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
}
4 测试
测试代码:
/**
* 测试增强文本内容审核2
*/
@Test
public void testScanText2() throws Exception {
//Map map = greenTextScan2.greeTextScan("我是一个好人,我吸冰毒");
Map map = greenTextScan2.greeTextScan("我是一个好人");
System.out.println(map);
}
/**
* 测试增强图片审核3 阿里云oss图片
*/
@Test
public void testScanImage3() throws Exception {
// 阿里云oss图片:https://web-tlias-wen.oss-cn-hangzhou.aliyuncs.com/0edd8d5a-064b-44dd-9979-44bc3a64cc48.jpg
// byte[] bytes = fileStorageService.downLoadFile("https://web-tlias-wen.oss-cn-hangzhou.aliyuncs.com/0edd8d5a-064b-44dd-9979-44bc3a64cc48.jpg");
String imageUrl = "https://web-tlias-wen.oss-cn-hangzhou.aliyuncs.com/0edd8d5a-064b-44dd-9979-44bc3a64cc48.jpg";
Map map = greenImageScan3.imageScan(imageUrl);
System.out.println(map);
}