167 lines
4.1 KiB
Go
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
|
|
}
|
|
}
|