P62问题1:调用不了阿里云文本内容安全接口

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);
    }

测试结果:

阿里云 结果查询:

猜你喜欢

转载自blog.csdn.net/qq_1910444202/article/details/134905395