contentSecurity/cmd/main.go
2025-10-15 14:52:37 +08:00

258 lines
6.1 KiB
Go

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)
if config.AccessKeyID != "" {
fmt.Printf(" AccessKey ID: %s...\n", config.AccessKeyID[:8])
}
if config.AccessKeySecret != "" {
fmt.Printf(" AccessKey Secret: %s...\n", config.AccessKeySecret[:8])
}
fmt.Println()
// 检查必要的配置
if config.AccessKeyID == "" || config.AccessKeySecret == "" {
fmt.Println("❌ 缺少必要的配置信息:")
if config.AccessKeyID == "" {
fmt.Println(" - ALIBABA_CLOUD_ACCESS_KEY_ID 未设置")
}
if config.AccessKeySecret == "" {
fmt.Println(" - ALIBABA_CLOUD_ACCESS_KEY_SECRET 未设置")
}
fmt.Println()
fmt.Println("请检查以下配置文件:")
fmt.Println(" - .env")
fmt.Println(" - conf/alibabacloud.env")
fmt.Println(" - 环境变量")
return
}
// 显示菜单
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. 通过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"))
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"))
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("请选择文本输入方式:")
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"))
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)
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. 同步扫描(等待结果返回)")
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)
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, 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)
}