258 lines
6.1 KiB
Go
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)
|
|
}
|