contentSecurity/internal/api/text_scanner.go
2025-10-15 14:52:37 +08:00

167 lines
4.1 KiB
Go

package api
import (
"encoding/json"
"fmt"
"contentSecurityDemo/conf"
"contentSecurityDemo/internal/model"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/alibaba-cloud-sdk-go/services/green"
)
// TextScanner 文本内容安全扫描器
type TextScanner struct {
Client *green.Client
Config *conf.Config
}
// NewTextScanner 创建文本扫描器
func NewTextScanner(config *conf.Config) (*TextScanner, error) {
client, err := green.NewClientWithAccessKey(config.Region, config.AccessKeyID, config.AccessKeySecret)
if err != nil {
return nil, fmt.Errorf("创建客户端失败: %v", err)
}
return &TextScanner{
Client: client,
Config: config,
}, nil
}
// ScanText 扫描文本内容
func (s *TextScanner) ScanText(content string, dataID string) (*model.TextScanResponse, error) {
request := requests.NewCommonRequest()
request.Method = "POST"
request.Scheme = "https"
request.Domain = s.Config.Endpoint
request.Version = "2018-05-09"
request.ApiName = "TextScan"
request.QueryParams["RegionId"] = s.Config.Region
scanRequest := model.TextScanRequest{
Tasks: []model.TextTask{
{
DataID: dataID,
Content: content,
},
},
Scenes: []string{"antispam"},
}
requestBody, err := json.Marshal(scanRequest)
if err != nil {
return nil, fmt.Errorf("序列化请求失败: %v", err)
}
request.Content = requestBody
response, err := s.Client.ProcessCommonRequest(request)
if err != nil {
return nil, fmt.Errorf("请求失败: %v", err)
}
var scanResponse model.TextScanResponse
if err := json.Unmarshal(response.GetHttpContentBytes(), &scanResponse); err != nil {
return nil, fmt.Errorf("解析响应失败: %v", err)
}
return &scanResponse, nil
}
// ScanTextBatch 批量扫描文本内容
func (s *TextScanner) ScanTextBatch(texts []string, dataIDs []string) (*model.TextScanResponse, error) {
if len(texts) != len(dataIDs) {
return nil, fmt.Errorf("文本数量和ID数量不匹配")
}
request := requests.NewCommonRequest()
request.Method = "POST"
request.Scheme = "https"
request.Domain = s.Config.Endpoint
request.Version = "2018-05-09"
request.ApiName = "TextScan"
request.QueryParams["RegionId"] = s.Config.Region
var tasks []model.TextTask
for i, text := range texts {
tasks = append(tasks, model.TextTask{
DataID: dataIDs[i],
Content: text,
})
}
scanRequest := model.TextScanRequest{
Tasks: tasks,
Scenes: []string{"antispam"},
}
requestBody, err := json.Marshal(scanRequest)
if err != nil {
return nil, fmt.Errorf("序列化请求失败: %v", err)
}
request.Content = requestBody
response, err := s.Client.ProcessCommonRequest(request)
if err != nil {
return nil, fmt.Errorf("请求失败: %v", err)
}
var scanResponse model.TextScanResponse
if err := json.Unmarshal(response.GetHttpContentBytes(), &scanResponse); err != nil {
return nil, fmt.Errorf("解析响应失败: %v", err)
}
return &scanResponse, nil
}
// PrintResult 打印扫描结果
func (s *TextScanner) PrintResult(response *model.TextScanResponse) {
fmt.Println("=== 文本内容安全审核结果 ===")
fmt.Printf("状态码: %d\n", response.Code)
fmt.Printf("消息: %s\n", response.Message)
for _, data := range response.Data {
fmt.Printf("\n数据ID: %s\n", data.DataID)
fmt.Printf("处理状态: %d - %s\n", data.Code, data.Message)
if len(data.Results) == 0 {
fmt.Println("✅ 未检测到违规内容")
continue
}
for _, result := range data.Results {
fmt.Printf("场景: %s\n", result.Scene)
fmt.Printf("标签: %s\n", result.Label)
fmt.Printf("建议: %s\n", result.Suggestion)
fmt.Printf("置信度: %.2f\n", result.Rate)
// 打印详细信息
if len(result.Details) > 0 {
fmt.Println("违规详情:")
for _, detail := range result.Details {
fmt.Printf(" 内容: %s\n", detail.Context.Context)
fmt.Printf(" 位置: %v\n", detail.Context.Pos)
}
}
fmt.Println("---")
}
}
}
// GetSuggestionText 获取建议文本
func GetSuggestionText(suggestion string) string {
switch suggestion {
case "pass":
return "通过"
case "review":
return "需要人工审核"
case "block":
return "拒绝"
default:
return suggestion
}
}