360 lines
9.5 KiB
Go
360 lines
9.5 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.LoginMode)
|
||
fmt.Printf(" 区域: %s\n", config.Region)
|
||
fmt.Printf(" 端点: %s\n", config.Endpoint)
|
||
|
||
if config.LoginMode == "sts" {
|
||
fmt.Printf(" RAM AccessKey ID: %s...\n", config.RAMAccessKeyID[:8])
|
||
fmt.Printf(" RAM角色ARN: %s\n", config.RAMRoleArn)
|
||
} else {
|
||
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.LoginMode == "sts" {
|
||
// 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临时凭证获取成功")
|
||
} else {
|
||
// 直接模式检查
|
||
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=== 图片内容安全审核(2.0版本)===")
|
||
|
||
scanner, err := api.NewImageScanner(config)
|
||
if err != nil {
|
||
fmt.Printf("❌ 创建图片扫描器失败: %v\n", err)
|
||
return
|
||
}
|
||
|
||
// 选择服务类型
|
||
fmt.Println("请选择图片审核服务类型:")
|
||
fmt.Println("1. 通用基线检测(baselineCheck_global)")
|
||
fmt.Println("2. 大小模型融合图片审核服务(postImageCheckByVL_global)")
|
||
fmt.Println("3. AI生成图片鉴别(aigcDetector_global)")
|
||
|
||
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=== 文本内容安全审核(2.0版本)===")
|
||
|
||
scanner, err := api.NewTextScanner(config)
|
||
if err != nil {
|
||
fmt.Printf("❌ 创建文本扫描器失败: %v\n", err)
|
||
return
|
||
}
|
||
|
||
// 选择服务类型
|
||
fmt.Println("请选择文本审核服务类型:")
|
||
fmt.Println("1. 通用基线检测(baselineCheck_global)")
|
||
fmt.Println("2. 大小模型融合文本审核服务(postTextCheckByVL_global)")
|
||
|
||
serviceChoice := getUserInput("请选择服务类型 (1-2): ")
|
||
var serviceType api.TextServiceType
|
||
|
||
switch serviceChoice {
|
||
case "1":
|
||
serviceType = api.TextBaselineCheckGlobal
|
||
fmt.Println("✅ 已选择:通用基线检测")
|
||
case "2":
|
||
serviceType = api.TextPostCheckByVLGlobal
|
||
fmt.Println("✅ 已选择:大小模型融合文本审核服务")
|
||
default:
|
||
fmt.Println("❌ 无效选择")
|
||
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"), serviceType)
|
||
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, serviceType)
|
||
if err != nil {
|
||
fmt.Printf("❌ 扫描失败: %v\n", err)
|
||
return
|
||
}
|
||
scanner.PrintResult(result)
|
||
|
||
default:
|
||
fmt.Println("❌ 无效选择")
|
||
}
|
||
}
|
||
|
||
func handleVideoScan(config *conf.Config) {
|
||
fmt.Println("\n=== 视频内容安全审核(2.0版本)===")
|
||
|
||
scanner, err := api.NewVideoScanner(config)
|
||
if err != nil {
|
||
fmt.Printf("❌ 创建视频扫描器失败: %v\n", err)
|
||
return
|
||
}
|
||
|
||
// 选择服务类型
|
||
fmt.Println("请选择视频审核服务类型:")
|
||
fmt.Println("1. 通用基线检测(baselineCheck_global)")
|
||
fmt.Println("2. 大小模型融合视频审核服务(postVideoCheckByVL_global)")
|
||
|
||
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)
|
||
}
|