腾讯云内容安全实现文本内容安全

        登录腾讯云账号后,进入安全服务:服务体验 - 内容安全 - 控制台,将服务全都开通。之后进入应用管理创建应用(文本内容安全简介_文本内容安全购买指南_文本内容安全操作指南-腾讯云)。应用创建完成后创建secretKey和secretId(访问密钥 - 控制台)。准备工作就做好了。

代码直接就直接给了,

1.pom依赖

<!--腾讯云-->
<dependency>
    <groupId>com.tencentcloudapi</groupId>
    <artifactId>tencentcloud-sdk-java-cvm</artifactId>
    <version>3.1.528</version>
</dependency>

<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java-tms</artifactId>
<version>3.1.528</version>
</dependency>

<dependency>
    <groupId>com.tencentcloudapi</groupId>
    <artifactId>tencentcloud-sdk-java-ims</artifactId>
    <version>3.1.528</version>
</dependency>

<dependency>
    <groupId>com.tencentcloudapi</groupId>
    <artifactId>tencentcloud-sdk-java</artifactId>
    <version>3.1.714</version> <!-- 使用最新版本,参考腾讯云官方文档 -->
</dependency>

2.配置文件

secretId和secretKey替换成自己的

tencentcloud.secretId=  AKID******457ygCV
tencentcloud.secretKey= csADQQdw3*******
tencentcloud.region=ap-guangzhou

3.controller层

import com.tencentcloudapi.cms.v20190321.models.TextData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class ContentModerationController {
    @Autowired
    private ContentModerationService moderationService;

    @PostMapping("/moderate/text")
    public ResponseEntity<ApiResponse> moderateText(
            @RequestParam String content,
            @RequestParam(required = false,defaultValue = "") String bizType) {
        try {
            // 将空字符串转为 null
            String finalBizType = bizType.isEmpty() ? null : bizType;

            TextData response = moderationService.checkText(content, finalBizType);
            // 将原始响应转换为前端需要的结构化数据
            Map<String, Object> result = new HashMap<>();

            // 1. 处理建议类型(Suggestion)
            String suggestion = response.getSuggestion();
            result.put("suggestion", convertSuggestion(suggestion)); // "Review" -> "建议人工审核"

            // 2. 处理违规类型(EvilType)
            int evilType = Math.toIntExact(response.getEvilType());
            result.put("evilType", convertEvilType(evilType)); // 20006 -> "违法/毒品"

            // 3. 关键词和置信度
            result.put("keywords", response.getKeywords()); // ["海洛因"]
            result.put("score", response.getScore() + "%"); // 74 -> "74%"
            return ResponseEntity.ok(ApiResponse.success(result));
        } catch (Exception e) {
            e.printStackTrace();  // 打印堆栈信息
            return ResponseEntity.badRequest().body(ApiResponse.error(e.getMessage()));
        }
    }

    // 建议类型转换
    private String convertSuggestion(String suggestion) {
        switch (suggestion) {
            case "Block": return "建议拦截";
            case "Review": return "建议人工审核";
            case "Pass": return "建议通过";
            default: return "未知建议";
        }
    }

    // 违规类型转换(需根据腾讯云文档完善映射)
    private String convertEvilType(int evilType) {
        switch (evilType) {
            case 20006: return "违法/毒品";
            case 20001: return "暴恐/政治/敏感机构";
            case 100   : return "无";
            case 24001 :return "暴恐/恐怖事件";
            // 其他类型...
            default: return "其他类型";
        }
    }

}

4.实体层

@Data
@Getter
@Setter

public class ApiResponse<T> {
    private int code;
    private String message;
    private T data;

    // 构造方法、Getter、Setter省略,以下是静态工厂方法
    public static <T> ApiResponse<T> success(T data) {
        ApiResponse<T> response = new ApiResponse<>();
        response.setCode(200);
        response.setMessage("success");
        response.setData(data);
        return response;
    }

    public static <T> ApiResponse<T> error(String message) {
        ApiResponse<T> response = new ApiResponse<>();
        response.setCode(400);
        response.setMessage(message);
        return response;
    }
}

5.配置层

import com.tencentcloudapi.cms.v20190321.CmsClient;
import com.tencentcloudapi.common.Credential;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration

public class TencentClogConfig {
    @Value("${tencentcloud.secret-id}")
    private String secretId;

    @Value("${tencentcloud.secret-key}")
    private String secretKey;

    @Value("${tencentcloud.region}")
    private String region;


    @Bean
    public CmsClient cmsClient() {
        Credential cred = new Credential(secretId, secretKey);
        return new CmsClient(cred,region);
    }
}

6.服务层

import com.tencentcloudapi.cms.v20190321.CmsClient;
import com.tencentcloudapi.cms.v20190321.models.TextData;
import com.tencentcloudapi.cms.v20190321.models.TextModerationRequest;
import com.tencentcloudapi.cms.v20190321.models.TextModerationResponse;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.*;

@Service
public class ContentModerationService {
    @Autowired
    private CmsClient cmsClient;

    public TextData checkText(String content, String bizType) throws TencentCloudSDKException {
        // 对 content 进行 Base64 编码
        String encodedContent = Base64.getEncoder().encodeToString(content.getBytes(StandardCharsets.UTF_8));

        TextModerationRequest req = new TextModerationRequest();
        req.setContent(encodedContent); // 设置 Base64 编码后的 content
        if (bizType != null && !bizType.isEmpty()) {
            req.setBizType(Long.valueOf(bizType));
        }
        TextModerationResponse resp = cmsClient.TextModeration(req);
//        System.out.println("Data响应: " + TextModerationResponse.toJsonString(resp.getData())); // 关键日
        return resp.getData();
    }
}

测试页面:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>腾讯云内容安全测试页面</title>
    <style>
        body { font-family: Arial, sans-serif; padding: 20px; max-width: 800px; margin: 0 auto; }
        .form-group { margin-bottom: 15px; }
        label { display: block; margin-bottom: 5px; }
        textarea { width: 100%; height: 150px; padding: 8px; }
        button { padding: 10px 20px; background: #007bff; color: white; border: none; cursor: pointer; }
        button:hover { background: #0056b3; }
        #result { margin-top: 20px; padding: 15px; border: 1px solid #ddd; }
    </style>
</head>
<body>
<h2>文本内容安全检测</h2>

<div class="form-group">
    <label for="content">待检测文本:</label>
    <textarea id="content" placeholder="请输入文本内容..."></textarea>
</div>

<div class="form-group">
    <label for="bizType">策略ID(可选):</label>
    <input type="text" id="bizType" placeholder="输入自定义策略ID">
</div>

<button onclick="checkContent()">开始检测</button>
<div id="result">
    <div class="section">
        <h3>审核结果</h3>
        <div class="result-item">
            <label>建议处理:</label>
            <span class="suggestion-tag" id="suggestion"></span>
        </div>
        <div class="result-item">
            <label>违规类型:</label>
            <span id="evilType"></span>
        </div>
        <div class="result-item">
            <label>命中关键词:</label>
            <span id="keywords"></span>
        </div>
        <div class="result-item">
            <label>置信度:</label>
            <span id="score"></span>
        </div>
    </div>
</div>

<style>
    .suggestion-tag {
        padding: 4px 8px;
        border-radius: 4px;
        font-weight: bold;
    }
    .suggestion-tag[data-type="建议拦截"] { background: #ffcccc; color: #d33; }
    .suggestion-tag[data-type="建议人工审核"] { background: #ffe6cc; color: #f90; }
    .suggestion-tag[data-type="建议通过"] { background: #ccffcc; color: #090; }
</style>


<script>
    function checkContent() {
        const content = document.getElementById('content').value;
        const bizType = document.getElementById('bizType').value;
        const resultDiv = document.getElementById('result');

        if (!content) {
            resultDiv.innerHTML = '<p style="color: red;">请输入待检测文本!</p>';
            return;
        }

        // 修改前端逻辑:如果 bizType 为空,则不传递该参数
        const params = { 'content': content };
        if (bizType) {  // 仅在 bizType 非空时添加
            params.bizType = bizType;
        }

        fetch('/moderate/text', {
            method: 'POST',
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            body: new URLSearchParams(params)
        }).then(response => response.json())
            .then(data => {
                if (data.code === 200) {
                    const result = data.data;

                    // 动态填充结果
                    document.getElementById('suggestion').innerHTML =
                        `<span class="suggestion-tag" data-type="${result.suggestion}">${result.suggestion}</span>`;
                    document.getElementById('evilType').textContent = result.evilType;
                    document.getElementById('keywords').textContent =
                        result.keywords.length > 0 ? result.keywords.join(', ') : '无';
                    document.getElementById('score').textContent = result.score;
                } });
    }
</script>
</body>
</html>

以上就是实现文本内容安全的所需依赖和代码,更多需求可查看官方文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值