contentSecurity/cmd/main.go
2025-10-16 15:21:30 +08:00

309 lines
7.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"bufio"
"contentSecurityDemo/conf"
"contentSecurityDemo/internal/api"
"fmt"
"os"
"strings"
"time"
)
func main() {
fmt.Println("=== 阿里云内容安全2.0 Demo ===")
fmt.Println("支持视频、图片、文字内容安全审核")
fmt.Println()
// 加载配置
fmt.Println("正在加载配置...")
config, err := conf.LoadConfigFromFile("conf/alibabacloud.env")
if err != nil {
fmt.Printf("❌ 加载配置失败: %v\n", err)
return
}
// 显示配置信息(隐藏敏感信息)
fmt.Printf("✅ 配置加载成功\n")
fmt.Printf(" 区域: %s\n", config.Region)
fmt.Printf(" 端点: %s\n", config.Endpoint)
fmt.Printf(" RAM AccessKey ID: %s...\n", config.RAMAccessKeyID[:8])
fmt.Printf(" RAM角色ARN: %s\n", config.RAMRoleArn)
fmt.Println()
// STS模式检查
if config.RAMAccessKeyID == "" || config.RAMAccessKeySecret == "" || config.RAMRoleArn == "" {
fmt.Println("❌ STS模式缺少必要的配置信息:")
if config.RAMAccessKeyID == "" {
fmt.Println(" - RAM_ACCESS_KEY_ID 未设置")
}
if config.RAMAccessKeySecret == "" {
fmt.Println(" - RAM_ACCESS_KEY_SECRET 未设置")
}
if config.RAMRoleArn == "" {
fmt.Println(" - RAM_ROLE_ARN 未设置")
}
fmt.Println()
fmt.Println("请检查以下配置文件:")
fmt.Println(" - .env")
fmt.Println(" - conf/alibabacloud.env")
fmt.Println(" - 环境变量")
return
}
// 获取STS临时凭证
fmt.Println("正在获取STS临时凭证...")
if err := config.GetSTSToken(); err != nil {
fmt.Printf("❌ 获取STS临时凭证失败: %v\n", err)
return
}
fmt.Println("✅ STS临时凭证获取成功")
// 显示菜单
for {
showMenu()
choice := getUserInput("请选择操作 (1-4): ")
switch choice {
case "1":
handleImageScan(config)
case "2":
handleTextScan(config)
case "3":
handleVideoScan(config)
case "4":
fmt.Println("感谢使用!")
return
default:
fmt.Println("❌ 无效选择,请重新输入")
}
fmt.Println()
}
}
func showMenu() {
fmt.Println("请选择要测试的功能:")
fmt.Println("1. 图片内容安全审核")
fmt.Println("2. 文本内容安全审核")
fmt.Println("3. 视频内容安全审核")
fmt.Println("4. 退出")
fmt.Println()
}
func handleImageScan(config *conf.Config) {
fmt.Println("\n=== 图片内容安全审核===")
scanner, err := api.NewImageScanner(config)
if err != nil {
fmt.Printf("❌ 创建图片扫描器失败: %v\n", err)
return
}
// 选择服务类型
fmt.Println("请选择图片审核服务类型:")
fmt.Println("1. 通用基线检测")
fmt.Println("2. 大小模型融合图片审核服务")
fmt.Println("3. AI生成图片鉴别")
serviceChoice := getUserInput("请选择服务类型 (1-3): ")
var serviceType api.ImageServiceType
switch serviceChoice {
case "1":
serviceType = api.BaselineCheckGlobal
fmt.Println("✅ 已选择:通用基线检测")
case "2":
serviceType = api.PostImageCheckByVLGlobal
fmt.Println("✅ 已选择:大小模型融合图片审核服务")
case "3":
serviceType = api.AigcDetectorGlobal
fmt.Println("✅ 已选择AI生成图片鉴别")
default:
fmt.Println("❌ 无效选择")
return
}
fmt.Println("\n请选择图片输入方式:")
fmt.Println("1. 通过URL")
fmt.Println("2. 通过本地文件")
choice := getUserInput("请选择 (1-2): ")
switch choice {
case "1":
url := getUserInput("请输入图片URL: ")
if url == "" {
fmt.Println("❌ URL不能为空")
return
}
fmt.Println("正在扫描图片...")
result, err := scanner.ScanImageByURL(url, "image_"+time.Now().Format("20060102150405"), serviceType)
if err != nil {
fmt.Printf("❌ 扫描失败: %v\n", err)
return
}
scanner.PrintResult(result)
case "2":
filePath := getUserInput("请输入图片文件路径: ")
if filePath == "" {
fmt.Println("❌ 文件路径不能为空")
return
}
fmt.Println("正在扫描图片...")
result, err := scanner.ScanImageByFile(filePath, "image_"+time.Now().Format("20060102150405"), serviceType)
if err != nil {
fmt.Printf("❌ 扫描失败: %v\n", err)
return
}
scanner.PrintResult(result)
default:
fmt.Println("❌ 无效选择")
}
}
func handleTextScan(config *conf.Config) {
fmt.Println("\n=== 文本内容安全审核===")
scanner, err := api.NewTextScanner(config)
if err != nil {
fmt.Printf("❌ 创建文本扫描器失败: %v\n", err)
return
}
fmt.Println("\n请选择文本输入方式:")
fmt.Println("1. 单条文本")
fmt.Println("2. 批量文本")
choice := getUserInput("请选择 (1-2): ")
switch choice {
case "1":
text := getUserInput("请输入要审核的文本: ")
if text == "" {
fmt.Println("❌ 文本不能为空")
return
}
fmt.Println("正在扫描文本...")
result, err := scanner.ScanText(text, "text_"+time.Now().Format("20060102150405"), api.TextBaselineCheckGlobal)
if err != nil {
fmt.Printf("❌ 扫描失败: %v\n", err)
return
}
scanner.PrintResult(result)
case "2":
fmt.Println("请输入多条文本,每行一条,输入空行结束:")
var texts []string
var dataIDs []string
for i := 1; ; i++ {
text := getUserInput(fmt.Sprintf("文本%d: ", i))
if text == "" {
break
}
texts = append(texts, text)
dataIDs = append(dataIDs, fmt.Sprintf("text_%d_%s", i, time.Now().Format("20060102150405")))
}
if len(texts) == 0 {
fmt.Println("❌ 没有输入任何文本")
return
}
fmt.Printf("正在批量扫描 %d 条文本...\n", len(texts))
result, err := scanner.ScanTextBatch(texts, dataIDs, api.TextBaselineCheckGlobal)
if err != nil {
fmt.Printf("❌ 扫描失败: %v\n", err)
return
}
scanner.PrintResult(result)
default:
fmt.Println("❌ 无效选择")
}
}
func handleVideoScan(config *conf.Config) {
fmt.Println("\n=== 视频内容安全审核===")
scanner, err := api.NewVideoScanner(config)
if err != nil {
fmt.Printf("❌ 创建视频扫描器失败: %v\n", err)
return
}
// 选择服务类型
fmt.Println("请选择视频审核服务类型:")
fmt.Println("1. 通用基线检测")
fmt.Println("2. 大小模型融合视频审核服务")
serviceChoice := getUserInput("请选择服务类型 (1-2): ")
var serviceType api.VideoServiceType
switch serviceChoice {
case "1":
serviceType = api.VideoBaselineCheckGlobal
fmt.Println("✅ 已选择:通用基线检测")
case "2":
serviceType = api.VideoPostCheckByVLGlobal
fmt.Println("✅ 已选择:大小模型融合视频审核服务")
default:
fmt.Println("❌ 无效选择")
return
}
fmt.Println("\n请选择视频审核方式:")
fmt.Println("1. 异步扫描(提交任务后立即返回)")
fmt.Println("2. 同步扫描(等待结果返回)")
choice := getUserInput("请选择 (1-2): ")
videoURL := getUserInput("请输入视频URL: ")
if videoURL == "" {
fmt.Println("❌ 视频URL不能为空")
return
}
dataID := "video_" + time.Now().Format("20060102150405")
switch choice {
case "1":
fmt.Println("正在提交视频扫描任务...")
result, err := scanner.ScanVideoAsync(videoURL, dataID, serviceType)
if err != nil {
fmt.Printf("❌ 提交任务失败: %v\n", err)
return
}
scanner.PrintScanResult(result)
if len(result.Data) > 0 && result.Data[0].TaskID != "" {
fmt.Printf("\n💡 提示: 使用任务ID %s 可以稍后查询结果\n", result.Data[0].TaskID)
}
case "2":
fmt.Println("正在扫描视频(这可能需要几分钟)...")
result, err := scanner.ScanVideoAndWait(videoURL, dataID, serviceType, 10*time.Minute)
if err != nil {
fmt.Printf("❌ 扫描失败: %v\n", err)
return
}
scanner.PrintResult(result)
default:
fmt.Println("❌ 无效选择")
}
}
func getUserInput(prompt string) string {
fmt.Print(prompt)
reader := bufio.NewReader(os.Stdin)
input, _ := reader.ReadString('\n')
return strings.TrimSpace(input)
}