// utils/sensitive.go // 敏感词过滤工具 package utils import ( "embed" "strings" "sync" "github.com/importcjj/sensitive" ) //go:embed sensitive_words.txt var sensitiveWordsFS embed.FS var ( filter *sensitive.Filter filterOnce sync.Once ) // GetSensitiveFilter 获取敏感词过滤器单例 func GetSensitiveFilter() *sensitive.Filter { filterOnce.Do(func() { filter = sensitive.New() loadDefaultWords() }) return filter } // loadDefaultWords 加载默认敏感词库 func loadDefaultWords() { // 从嵌入的文件系统读取 data, err := sensitiveWordsFS.ReadFile("sensitive_words.txt") if err != nil { // 如果文件不存在,使用内置的基础词库 loadBuiltinWords() return } words := strings.Split(string(data), "\n") for _, word := range words { word = strings.TrimSpace(word) if word != "" && !strings.HasPrefix(word, "#") { filter.AddWord(word) } } } // loadBuiltinWords 加载内置基础敏感词 func loadBuiltinWords() { // 基硎敏感词列表 builtinWords := []string{ // 政治相关 "习近平", "江泽民", "胡锦涛", "温家宝", "李克强", "法轮功", "六四", "天安门", "台独", "藏独", "疆独", // 色情相关 "色情", "黄色", "裸体", "做爱", "性交", "强奸", "乱伦", // 暴力相关 "杀人", "自杀", "爆炸", "恐怖", "炸弹", "袭击", // 赌博相关 "赌博", "赌钱", "博彩", "六合彩", // 毒品相关 "毒品", "吸毒", "贩毒", "冰毒", "海洛因", // 侮辱性词汇 "傻逼", "操你", "妈的", "王八蛋", "畜生", } for _, word := range builtinWords { filter.AddWord(word) } } // FilterSensitive 过滤敏感词,替换为 * func FilterSensitive(text string) string { f := GetSensitiveFilter() return f.Replace(text, '*') } // ContainsSensitive 检查是否包含敏感词 func ContainsSensitive(text string) bool { f := GetSensitiveFilter() has, _ := f.FindIn(text) return has } // FindAllSensitive 查找所有敏感词 func FindAllSensitive(text string) []string { f := GetSensitiveFilter() return f.FindAll(text) } // ValidateContent 验证内容,返回是否通过和第一个敏感词 func ValidateContent(text string) (bool, string) { f := GetSensitiveFilter() return f.Validate(text) } // AddSensitiveWord 动态添加敏感词 func AddSensitiveWord(word string) { f := GetSensitiveFilter() f.AddWord(word) } // AddSensitiveWords 批量添加敏感词 func AddSensitiveWords(words []string) { f := GetSensitiveFilter() for _, word := range words { f.AddWord(word) } }