From e61c31ae237f70217c9b3e12a9a36c2524e8c091 Mon Sep 17 00:00:00 2001
From: bao <19271189822@163.com>
Date: Thu, 18 Dec 2025 21:37:46 +0800
Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=AE=A1=E6=A0=B8=20?=
=?UTF-8?q?=E6=96=87=E6=9C=AC=E5=AE=A1=E6=A0=B8=E6=B5=8B=E8=AF=95=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 28 +++
.../dating/common/aliyun/GreenImageScan.java | 108 ++++++++++
.../dating/common/aliyun/GreenTextScan.java | 127 ++++++++++++
.../common/aliyun/util/ClientUploader.java | 195 ++++++++++++++++++
.../common/aliyun/util/CustomLibUploader.java | 159 ++++++++++++++
.../common/aliyun/util/UploadCredentials.java | 90 ++++++++
src/main/resources/application.yml | 5 +-
.../bao/dating/DatingApplicationTests.java | 50 ++++-
8 files changed, 758 insertions(+), 4 deletions(-)
create mode 100644 src/main/java/com/bao/dating/common/aliyun/GreenImageScan.java
create mode 100644 src/main/java/com/bao/dating/common/aliyun/GreenTextScan.java
create mode 100644 src/main/java/com/bao/dating/common/aliyun/util/ClientUploader.java
create mode 100644 src/main/java/com/bao/dating/common/aliyun/util/CustomLibUploader.java
create mode 100644 src/main/java/com/bao/dating/common/aliyun/util/UploadCredentials.java
diff --git a/pom.xml b/pom.xml
index 81cc07a..aa07664 100644
--- a/pom.xml
+++ b/pom.xml
@@ -73,6 +73,34 @@
1.2.83
+
+ com.aliyun
+ aliyun-java-sdk-core
+ 4.6.3
+
+
+ com.aliyun
+ aliyun-java-sdk-green
+ 3.4.2
+
+
+ com.aliyun
+ imageaudit20191230
+ 2.0.6
+
+
+
+ com.aliyun
+ tea-openapi
+ 0.2.8
+
+
+
+ com.aliyun
+ teautil
+ 0.2.16
+
+
diff --git a/src/main/java/com/bao/dating/common/aliyun/GreenImageScan.java b/src/main/java/com/bao/dating/common/aliyun/GreenImageScan.java
new file mode 100644
index 0000000..8d02cfa
--- /dev/null
+++ b/src/main/java/com/bao/dating/common/aliyun/GreenImageScan.java
@@ -0,0 +1,108 @@
+package com.bao.dating.common.aliyun;
+
+import com.alibaba.fastjson.JSON;
+import com.aliyun.imageaudit20191230.models.ScanImageRequest;
+import com.aliyun.imageaudit20191230.models.ScanImageResponse;
+import com.aliyun.imageaudit20191230.models.ScanImageResponseBody;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+@Getter
+@Setter
+@Component
+@ConfigurationProperties(prefix = "aliyun")
+public class GreenImageScan {
+
+ private String accessKeyId;
+ private String secret;
+ private String scenes;
+
+ public Map imageScan(List imageList) throws Exception {
+ com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+ .setAccessKeyId(accessKeyId)
+ .setAccessKeySecret(secret);
+ // 访问的域名
+ config.endpoint = "imageaudit.cn-shanghai.aliyuncs.com";
+
+ com.aliyun.imageaudit20191230.Client client = new com.aliyun.imageaudit20191230.Client(config);
+
+ List taskList = new ArrayList<>();
+
+ for (String img: imageList) {
+ ScanImageRequest.ScanImageRequestTask task = new ScanImageRequest.ScanImageRequestTask();
+ task.setImageURL(img); // 修复:直接使用图片URL而不是转换为字符数组 task.setDataId(UUID.randomUUID().toString());
+ task.setImageTimeMillisecond(1L);
+ task.setInterval(1);
+ task.setMaxFrames(1);
+ taskList.add(task);
+ }
+
+
+ //场景
+ List sceneList = new ArrayList<>();
+ // 移除了不支持的"antispam"场景,使用支持的场景
+ sceneList.add("porn"); // 涉黄识别
+ sceneList.add("terrorism"); // 暴恐识别
+ sceneList.add("ad"); // 图片广告
+ sceneList.add("live"); // 不良场景
+ sceneList.add("logo"); // logo识别
+
+ com.aliyun.imageaudit20191230.models.ScanImageRequest scanImageRequest = new com.aliyun.imageaudit20191230.models.ScanImageRequest()
+ .setTask(taskList)
+ .setScene(sceneList);
+ com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
+ try {
+ ScanImageResponse scanImageResponse = client.scanImageWithOptions(scanImageRequest, runtime);
+ Map resultMap = new HashMap<>();
+
+ if (scanImageResponse.getStatusCode() == 200) {
+
+ List subResults = scanImageResponse.body.data.results.get(0).getSubResults();
+
+ ListIterator listIterator = subResults.listIterator();
+ while (listIterator.hasNext()) {
+ ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResults item = listIterator.next();
+ /* System.out.println("scene = [" + item.scene + "]");
+ System.out.println("suggestion = [" + item.suggestion + "]");
+ System.out.println("label = [" + item.label + "]");*/
+
+ if (!item.suggestion.equals("pass")) {
+ resultMap.put("suggestion", item.suggestion);
+ resultMap.put("label", item.label);
+ return resultMap;
+ }
+ }
+ // 所有审核项都通过时,返回pass结果
+ resultMap.put("suggestion", "pass");
+ resultMap.put("label", "normal");
+ return resultMap;
+
+ } else {
+ /* *
+ * 表明请求整体处理失败,原因视具体的情况详细分析
+ */
+ System.out.println("the whole image scan request failed. response:" + JSON.toJSONString(scanImageResponse));
+ return null;
+ }
+
+
+ } catch (com.aliyun.tea.TeaException teaException) {
+ // 获取整体报错信息
+ System.out.println(com.aliyun.teautil.Common.toJSONString(teaException));
+ // 获取单个字段
+ System.out.println(teaException.getCode());
+ return null;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+
+ /* Map resultMap = new HashMap<>();
+ resultMap.put("suggestion", "pass");
+ return resultMap;*/
+ }
+}
diff --git a/src/main/java/com/bao/dating/common/aliyun/GreenTextScan.java b/src/main/java/com/bao/dating/common/aliyun/GreenTextScan.java
new file mode 100644
index 0000000..b27303e
--- /dev/null
+++ b/src/main/java/com/bao/dating/common/aliyun/GreenTextScan.java
@@ -0,0 +1,127 @@
+package com.bao.dating.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 lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Getter
+@Setter
+@Component
+@ConfigurationProperties(prefix = "aliyun")
+public class GreenTextScan {
+
+
+ private String accessKeyId;
+ private String secret;
+
+ public Map greeTextScan(String content) throws Exception {
+// accessKeyId = "LTAI5tKo9TpWH1aW6JxWm1Gp";
+// secret = "LHk9DdHECKCwIdaIM9fkGgEuowt18W";
+ Config config = new Config();
+ config.setAccessKeyId(accessKeyId);
+ config.setAccessKeySecret(secret);
+ //接入区域和地址请根据实际情况修改
+ config.setRegionId("cn-shanghai");
+ config.setEndpoint("green-cip.cn-shanghai.aliyuncs.com");
+ //连接时超时时间,单位毫秒(ms)。
+ config.setReadTimeout(6000);
+ //读取时超时时间,单位毫秒(ms)。
+ config.setConnectTimeout(3000);
+ Client client = new Client(config);
+
+ // 创建RuntimeObject实例并设置运行参数。
+ RuntimeOptions runtime = new RuntimeOptions();
+ runtime.readTimeout = 10000;
+ runtime.connectTimeout = 10000;
+
+ //检测参数构造
+ JSONObject serviceParameters = new JSONObject();
+ serviceParameters.put("content", content);
+
+ //检测结果构造
+ Map resultMap = new HashMap<>();
+ if (serviceParameters.get("content") == null || serviceParameters.getString("content").trim().length() == 0) {
+
+ resultMap.put("suggestion","检测内容为空");
+ System.out.println("text moderation content is empty");
+ return resultMap;
+ }
+ TextModerationRequest textModerationRequest = new TextModerationRequest();
+ /*
+ 文本检测service:内容安全控制台文本增强版规则配置的serviceCode,示例:chat_detection
+ */
+ textModerationRequest.setService("comment_detection");
+ textModerationRequest.setServiceParameters(serviceParameters.toJSONString());
+
+ try {
+
+ // 调用方法获取检测结果。
+ TextModerationResponse response = client.textModerationWithOptions(textModerationRequest, runtime);
+
+ // 自动路由。
+ if (response != null) {
+
+ // 服务端错误,区域切换到cn-beijing。
+ if (500 == response.getStatusCode()) {
+
+ // 接入区域和地址请根据实际情况修改。
+ 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));
+ // 直接使用JSON解析来获取code值,避免类型不匹配问题
+ JSONObject resultJson = JSON.parseObject(JSON.toJSONString(result));
+ String code = resultJson.getString("code");
+
+ if (code != null && "200".equals(code)) {
+
+ TextModerationResponseBody.TextModerationResponseBodyData data = result.getData();
+ if (data.getLabels().isEmpty() && data.getReason().isEmpty()) {
+
+ resultMap.put("suggestion", "pass");
+ }else {
+
+ resultMap.put("suggestion","block");
+ resultMap.put("labels",data.getLabels());
+ resultMap.put("reason", data.getReason());
+ }
+ System.out.println("labels = [" + data.getLabels() + "]");
+ System.out.println("reason = [" + data.getReason() + "]");
+ } else {
+
+ System.out.println("text moderation not success. code:" + code);
+ }
+ } else {
+
+ System.out.println("response not success. status:" + response.getStatusCode());
+ }
+ }
+ } catch (Exception e) {
+
+ e.printStackTrace();
+ }
+ return resultMap;
+ }
+}
diff --git a/src/main/java/com/bao/dating/common/aliyun/util/ClientUploader.java b/src/main/java/com/bao/dating/common/aliyun/util/ClientUploader.java
new file mode 100644
index 0000000..b11d16a
--- /dev/null
+++ b/src/main/java/com/bao/dating/common/aliyun/util/ClientUploader.java
@@ -0,0 +1,195 @@
+package com.bao.dating.common.aliyun.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.ObjectMetadata;
+import com.aliyun.oss.model.PutObjectResult;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.green.model.v20180509.UploadCredentialsRequest;
+import com.aliyuncs.http.FormatType;
+import com.aliyuncs.http.HttpResponse;
+import com.aliyuncs.http.ProtocolType;
+import com.aliyuncs.profile.IClientProfile;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 用于本地图片文件检测时,上传本地图片
+ */
+public class ClientUploader {
+
+ private IClientProfile profile;
+ private volatile UploadCredentials uploadCredentials;
+ private Map headers;
+ private String prefix;
+
+ private boolean internal = false;
+
+ private Object lock = new Object();
+
+ private ClientUploader(IClientProfile profile, String prefix, boolean internal) {
+ this.profile = profile;
+ this.uploadCredentials = null;
+ this.headers = new HashMap();
+ this.prefix = prefix;
+ this.internal = internal;
+ }
+
+
+ public static ClientUploader getImageClientUploader(IClientProfile profile, boolean internal){
+ return new ClientUploader(profile, "images", internal);
+ }
+
+ public static ClientUploader getVideoClientUploader(IClientProfile profile, boolean internal){
+ return new ClientUploader(profile, "videos", internal);
+ }
+
+ public static ClientUploader getVoiceClientUploader(IClientProfile profile, boolean internal){
+ return new ClientUploader(profile, "voices", internal);
+ }
+
+ public static ClientUploader getFileClientUploader(IClientProfile profile, boolean internal){
+ return new ClientUploader(profile, "files", internal);
+ }
+
+ /**
+ * 上传并获取上传后的图片链接
+ * @param filePath
+ * @return
+ */
+ public String uploadFile(String filePath){
+ FileInputStream inputStream = null;
+ OSSClient ossClient = null;
+ try {
+ File file = new File(filePath);
+ UploadCredentials uploadCredentials = getCredentials();
+ if(uploadCredentials == null){
+ throw new RuntimeException("can not get upload credentials");
+ }
+ ObjectMetadata meta = new ObjectMetadata();
+ meta.setContentLength(file.length());
+ inputStream = new FileInputStream(file);
+
+ ossClient = new OSSClient(getOssEndpoint(uploadCredentials), uploadCredentials.getAccessKeyId(), uploadCredentials.getAccessKeySecret(), uploadCredentials.getSecurityToken());
+
+ String object = uploadCredentials.getUploadFolder() + '/' + this.prefix + '/' + String.valueOf(filePath.hashCode());
+ PutObjectResult ret = ossClient.putObject(uploadCredentials.getUploadBucket(), object, inputStream, meta);
+ return "oss://" + uploadCredentials.getUploadBucket() + "/" + object;
+ } catch (Exception e) {
+ throw new RuntimeException("upload file fail.", e);
+ } finally {
+ if(ossClient != null){
+ ossClient.shutdown();
+ }
+ if(inputStream != null){
+ try {
+ inputStream.close();
+ }catch (Exception e){
+
+ }
+ }
+ }
+ }
+
+
+ private String getOssEndpoint(UploadCredentials uploadCredentials){
+ if(this.internal){
+ return uploadCredentials.getOssInternalEndpoint();
+ }else{
+ return uploadCredentials.getOssEndpoint();
+ }
+ }
+
+ /**
+ * 上传并获取上传后的图片链接
+ * @param bytes
+ * @return
+ */
+ public String uploadBytes(byte[] bytes){
+ OSSClient ossClient = null;
+ try {
+ UploadCredentials uploadCredentials = getCredentials();
+ if(uploadCredentials == null){
+ throw new RuntimeException("can not get upload credentials");
+ }
+
+ ossClient = new OSSClient(getOssEndpoint(uploadCredentials), uploadCredentials.getAccessKeyId(), uploadCredentials.getAccessKeySecret(), uploadCredentials.getSecurityToken());
+
+ String object = uploadCredentials.getUploadFolder() + '/' + this.prefix + '/' + UUID.randomUUID().toString();
+ PutObjectResult ret = ossClient.putObject(uploadCredentials.getUploadBucket(), object, new ByteArrayInputStream(bytes));
+ return "oss://" + uploadCredentials.getUploadBucket() + "/" + object;
+ } catch (Exception e) {
+ throw new RuntimeException("upload file fail.", e);
+ } finally {
+ if(ossClient != null){
+ ossClient.shutdown();
+ }
+ }
+ }
+
+
+ public void addHeader(String key, String value){
+ this.headers.put(key, value);
+ }
+
+
+ private UploadCredentials getCredentials() throws Exception{
+ if(this.uploadCredentials == null || this.uploadCredentials.getExpiredTime() < System.currentTimeMillis()){
+ synchronized(lock){
+ if(this.uploadCredentials == null || this.uploadCredentials.getExpiredTime() < System.currentTimeMillis()){
+ this.uploadCredentials = getCredentialsFromServer();
+ }
+ }
+ }
+ return this.uploadCredentials;
+ }
+
+ /**
+ * 从服务器端获取上传凭证
+ * @return
+ * @throws Exception
+ */
+ private UploadCredentials getCredentialsFromServer() throws Exception{
+ UploadCredentialsRequest uploadCredentialsRequest = new UploadCredentialsRequest();
+ uploadCredentialsRequest.setAcceptFormat(FormatType.JSON); // 指定api返回格式
+ uploadCredentialsRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定请求方法
+ uploadCredentialsRequest.setEncoding("utf-8");
+ uploadCredentialsRequest.setProtocol(ProtocolType.HTTP);
+ for (Map.Entry kv : this.headers.entrySet()) {
+ uploadCredentialsRequest.putHeaderParameter(kv.getKey(), kv.getValue());
+ }
+
+ uploadCredentialsRequest.setHttpContent(new JSONObject().toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON);
+
+ IAcsClient client = null;
+ try{
+ client = new DefaultAcsClient(profile);
+ HttpResponse httpResponse = client.doAction(uploadCredentialsRequest);
+ if (httpResponse.isSuccess()) {
+ JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
+ if (200 == scrResponse.getInteger("code")) {
+ JSONObject data = scrResponse.getJSONObject("data");
+ return new UploadCredentials(data.getString("accessKeyId"), data.getString("accessKeySecret"),
+ data.getString("securityToken"), data.getLongValue("expiredTime"),
+ data.getString("ossEndpoint"), data.getString("ossInternalEndpoint"), data.getString("uploadBucket"), data.getString("uploadFolder"));
+ }
+
+ String requestId = scrResponse.getString("requestId");
+ throw new RuntimeException("get upload credential from server fail. requestId:" + requestId + ", code:" + scrResponse.getInteger("code"));
+ }
+ throw new RuntimeException("get upload credential from server fail. http response status:" + httpResponse.getStatus());
+ }finally {
+ client.shutdown();
+ }
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/bao/dating/common/aliyun/util/CustomLibUploader.java b/src/main/java/com/bao/dating/common/aliyun/util/CustomLibUploader.java
new file mode 100644
index 0000000..dec33ba
--- /dev/null
+++ b/src/main/java/com/bao/dating/common/aliyun/util/CustomLibUploader.java
@@ -0,0 +1,159 @@
+package com.bao.dating.common.aliyun.util;
+
+
+import javax.activation.MimetypesFileTypeMap;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.*;
+
+/**
+ * 用于自定义图库上传图片
+ */
+public class CustomLibUploader {
+
+
+ public String uploadFile(String host, String uploadFolder, String ossAccessKeyId,
+ String policy, String signature,
+ String filepath) throws Exception {
+ LinkedHashMap textMap = new LinkedHashMap();
+ // key
+ String objectName = uploadFolder + "/imglib_" + UUID.randomUUID().toString() + ".jpg";
+ textMap.put("key", objectName);
+ // Content-Disposition
+ textMap.put("Content-Disposition", "attachment;filename="+filepath);
+ // OSSAccessKeyId
+ textMap.put("OSSAccessKeyId", ossAccessKeyId);
+ // policy
+ textMap.put("policy", policy);
+ // Signature
+ textMap.put("Signature", signature);
+
+ Map fileMap = new HashMap();
+ fileMap.put("file", filepath);
+
+ String ret = formUpload(host, textMap, fileMap);
+ System.out.println("[" + host + "] post_object:" + objectName);
+ System.out.println("post reponse:" + ret);
+ return objectName;
+ }
+
+ private static String formUpload(String urlStr, Map textMap, Map fileMap) throws Exception {
+ String res = "";
+ HttpURLConnection conn = null;
+ String BOUNDARY = "9431149156168";
+ try {
+ URL url = new URL(urlStr);
+ conn = (HttpURLConnection) url.openConnection();
+ conn.setConnectTimeout(5000);
+ conn.setReadTimeout(10000);
+ conn.setDoOutput(true);
+ conn.setDoInput(true);
+ conn.setRequestMethod("POST");
+ conn.setRequestProperty("User-Agent",
+ "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");
+ conn.setRequestProperty("Content-Type",
+ "multipart/form-data; boundary=" + BOUNDARY);
+
+ OutputStream out = new DataOutputStream(conn.getOutputStream());
+ // text
+ if (textMap != null) {
+ StringBuffer strBuf = new StringBuffer();
+ Iterator iter = textMap.entrySet().iterator();
+ int i = 0;
+ while (iter.hasNext()) {
+ Map.Entry entry = (Map.Entry) iter.next();
+ String inputName = (String) entry.getKey();
+ String inputValue = (String) entry.getValue();
+ if (inputValue == null) {
+ continue;
+ }
+ if (i == 0) {
+ strBuf.append("--").append(BOUNDARY).append(
+ "\r\n");
+ strBuf.append("Content-Disposition: form-data; name=\""
+ + inputName + "\"\r\n\r\n");
+ strBuf.append(inputValue);
+ } else {
+ strBuf.append("\r\n").append("--").append(BOUNDARY).append(
+ "\r\n");
+ strBuf.append("Content-Disposition: form-data; name=\""
+ + inputName + "\"\r\n\r\n");
+
+ strBuf.append(inputValue);
+ }
+
+ i++;
+ }
+ out.write(strBuf.toString().getBytes());
+ }
+
+ // file
+ if (fileMap != null) {
+ Iterator iter = fileMap.entrySet().iterator();
+ while (iter.hasNext()) {
+ Map.Entry entry = (Map.Entry) iter.next();
+ String inputName = (String) entry.getKey();
+ String inputValue = (String) entry.getValue();
+ if (inputValue == null) {
+ continue;
+ }
+ File file = new File(inputValue);
+ String filename = file.getName();
+ String contentType = new MimetypesFileTypeMap().getContentType(file);
+ if (contentType == null || contentType.equals("")) {
+ contentType = "application/octet-stream";
+ }
+
+ StringBuffer strBuf = new StringBuffer();
+ strBuf.append("\r\n").append("--").append(BOUNDARY).append(
+ "\r\n");
+ strBuf.append("Content-Disposition: form-data; name=\""
+ + inputName + "\"; filename=\"" + filename
+ + "\"\r\n");
+ strBuf.append("Content-Type: " + contentType + "\r\n\r\n");
+
+ out.write(strBuf.toString().getBytes());
+
+ DataInputStream in = new DataInputStream(new FileInputStream(file));
+ int bytes = 0;
+ byte[] bufferOut = new byte[1024];
+ while ((bytes = in.read(bufferOut)) != -1) {
+ out.write(bufferOut, 0, bytes);
+ }
+ in.close();
+ }
+ StringBuffer strBuf = new StringBuffer();
+ out.write(strBuf.toString().getBytes());
+ }
+
+ byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();
+ out.write(endData);
+ out.flush();
+ out.close();
+
+ // 读取返回数据
+ StringBuffer strBuf = new StringBuffer();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(
+ conn.getInputStream()));
+ String line = null;
+ while ((line = reader.readLine()) != null) {
+ strBuf.append(line).append("\n");
+ }
+ res = strBuf.toString();
+ reader.close();
+ reader = null;
+ } catch (Exception e) {
+ System.err.println("发送POST请求出错: " + urlStr);
+ throw e;
+ } finally {
+ if (conn != null) {
+ conn.disconnect();
+ conn = null;
+ }
+ }
+ return res;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/bao/dating/common/aliyun/util/UploadCredentials.java b/src/main/java/com/bao/dating/common/aliyun/util/UploadCredentials.java
new file mode 100644
index 0000000..de012d3
--- /dev/null
+++ b/src/main/java/com/bao/dating/common/aliyun/util/UploadCredentials.java
@@ -0,0 +1,90 @@
+package com.bao.dating.common.aliyun.util;
+
+import java.io.Serializable;
+
+public class UploadCredentials implements Serializable {
+
+ private String accessKeyId;
+ private String accessKeySecret;
+ private String securityToken;
+ private Long expiredTime;
+ private String ossEndpoint;
+ private String ossInternalEndpoint;
+ private String uploadBucket;
+ private String uploadFolder;
+
+ public UploadCredentials(String accessKeyId, String accessKeySecret, String securityToken, Long expiredTime, String ossEndpoint, String ossInternalEndpoint, String uploadBucket, String uploadFolder) {
+ this.accessKeyId = accessKeyId;
+ this.accessKeySecret = accessKeySecret;
+ this.securityToken = securityToken;
+ this.expiredTime = expiredTime;
+ this.ossEndpoint = ossEndpoint;
+ this.ossInternalEndpoint = ossInternalEndpoint;
+ this.uploadBucket = uploadBucket;
+ this.uploadFolder = uploadFolder;
+ }
+
+ public String getAccessKeyId() {
+ return accessKeyId;
+ }
+
+ public void setAccessKeyId(String accessKeyId) {
+ this.accessKeyId = accessKeyId;
+ }
+
+ public String getAccessKeySecret() {
+ return accessKeySecret;
+ }
+
+ public void setAccessKeySecret(String accessKeySecret) {
+ this.accessKeySecret = accessKeySecret;
+ }
+
+ public String getSecurityToken() {
+ return securityToken;
+ }
+
+ public void setSecurityToken(String securityToken) {
+ this.securityToken = securityToken;
+ }
+
+ public Long getExpiredTime() {
+ return expiredTime;
+ }
+
+ public void setExpiredTime(Long expiredTime) {
+ this.expiredTime = expiredTime;
+ }
+
+ public String getOssEndpoint() {
+ return ossEndpoint;
+ }
+
+ public void setOssEndpoint(String ossEndpoint) {
+ this.ossEndpoint = ossEndpoint;
+ }
+
+ public String getUploadBucket() {
+ return uploadBucket;
+ }
+
+ public void setUploadBucket(String uploadBucket) {
+ this.uploadBucket = uploadBucket;
+ }
+
+ public String getUploadFolder() {
+ return uploadFolder;
+ }
+
+ public void setUploadFolder(String uploadFolder) {
+ this.uploadFolder = uploadFolder;
+ }
+
+ public String getOssInternalEndpoint() {
+ return ossInternalEndpoint;
+ }
+
+ public void setOssInternalEndpoint(String ossInternalEndpoint) {
+ this.ossInternalEndpoint = ossInternalEndpoint;
+ }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 800e60d..8ab6301 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -22,4 +22,7 @@ aliyun:
endpoint: oss-cn-beijing.aliyuncs.com
access-key-id: LTAI5tKo9TpWH1aW6JxWm1Gp
access-key-secret: LHk9DdHECKCwIdaIM9fkGgEuowt18W
- bucket-name: heimato
\ No newline at end of file
+ bucket-name: heimato
+ accessKeyId: LTAI5t5vpcbCZwweNHEDDDaF
+ secret: bBHBAPiCqGyVBHUv07348wsHXkKqrk
+ scenes: antispam
diff --git a/src/test/java/com/bao/dating/DatingApplicationTests.java b/src/test/java/com/bao/dating/DatingApplicationTests.java
index 8e40b11..c38057b 100644
--- a/src/test/java/com/bao/dating/DatingApplicationTests.java
+++ b/src/test/java/com/bao/dating/DatingApplicationTests.java
@@ -1,13 +1,57 @@
package com.bao.dating;
+import com.bao.dating.common.aliyun.GreenImageScan;
+import com.bao.dating.common.aliyun.GreenTextScan;
import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
-@SpringBootTest
-class DatingApplicationTests {
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@SpringBootTest // 添加这个注解以启用Spring上下文
+public class DatingApplicationTests {
+
+ @Autowired
+ private GreenTextScan greenTextScan;
+
+ @Autowired
+ private GreenImageScan greenImageScan;
@Test
- void contextLoads() {
+ public void testScanText() throws Exception {
+ Map map = greenTextScan.greeTextScan("冰毒");
+ System.out.println(map);
+ }
+ /**
+ * 测试从网络URL上传图片到阿里云OSS并进行内容安全检测
+ */
+ @Test
+ public void testUploadAndScanImageFromUrl() {
+ try {
+ // 阿里oss图片url
+ String imageUrl = "https://heimato.oss-cn-beijing.aliyuncs.com/9d1325d1-6e5a-426c-8081-306e7d3f6386.jpg?x-oss-credential=LTAI5tKo9TpWH1aW6JxWm1Gp%2F20251218%2Fcn-beijing%2Foss%2Faliyun_v4_request&x-oss-date=20251218T132839Z&x-oss-expires=3600&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-signature=a1b6b5a8e8728012093e9c38c6fb6f4487e7adf983db63c412848d3dbb0697b8";
+
+ // 将图片URL添加到列表中进行检测
+ List imageUrls = Arrays.asList(imageUrl);
+
+ // 调用图片检测服务
+ Map scanResult = greenImageScan.imageScan(imageUrls);
+
+ if (scanResult != null) {
+ System.out.println("图片检测结果:");
+ System.out.println("建议: " + scanResult.get("suggestion"));
+ System.out.println("标签: " + scanResult.get("label"));
+ } else {
+ System.out.println("图片检测失败");
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
}
+
+
}