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