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