package main import ( "context" "fmt" "github.com/importcjj/sensitive" "go.mongodb.org/mongo-driver/bson/primitive" "google.golang.org/grpc" "gopkg.in/olivere/elastic.v1" "gopkg.in/yaml.v2" "io/ioutil" "log" "math/big" "net" "net/http" "regexp" "sensitiveWords.udp/proto_grpc" "sensitiveWords.udp/util" "strconv" "strings" ) const ( YAMLFILE = "./server.yaml" ) var reg_alias = regexp.MustCompile("(税务局|工商行政管理局|文化广播电视新闻出版局|外国专家局|" + "中医药管理局|市场监督管理局|广播电视局|医疗保障局|机关事务管理局|粮食和物资储备局|" + "监狱管理局|畜牧兽医局|食品药品监督管理局|城市管理行政执法局|城市管理局|国家保密局|密码管理局|" + "地方金融监督管理局|住房保障和房屋管理局|质量技术监督局|人力资源与社会保障局|公路管理局|国土资源局|" + "卫生和计划生育局|民事政务局|公众安全局|交通管理局|人力资源和社会保障局|劳动和社会保障局|" + "住房和城乡建设局|就业服务局|文物管理局|环境保护局|粮食和物资储备局|教育体育局|" + "体育局|教育局|招商局|农业局|农机局|水务局|林业局|财政局|审计局|统计局|商务局)$") var reglen *regexp.Regexp = regexp.MustCompile("^(.{1,5}|.{40,})$") var strReg *regexp.Regexp = regexp.MustCompile("^(.{0,3}工程队|.{0,3}总公司|_+|.{0,2}设备安装公司|.{0,2}装[饰修潢]公司|.{0,2}开发公司|.{0,4}有限公司|.{0,4}有限责任公司|.{0,4}设计院|建筑设计研?究?院|省文物考古研究所|经济开发区|省.*|镇人民政府|.{0,2}服务公司|" + ".{0,2}工程质量监督站|.{0,3}经[营销]部|.{0,3}事务所|.{0,4}工程公司|.{0,4}责任公司|.*勘测|.{0,4}研究院|.*能源建|.{0,2}安装工程|.*[市省]{1}|.{0,4}中心|.*区.?|" + ".{0,3}税务局|.{0,3}财政局|.{0,3}商行|.{0,2}公安处|.{0,2}测绘院|.{0,3}开发|.{0,2}建设局|.{0,2}经销部|.{0,3}委员会|.{0,2}分公司|.{0,2}管理站|.{0,2}事务管理局|" + ".*资料|.{0,2}办公用品.{1,2}|.*唯亭|.*设备|.+安装|.{0,2}技术服务|市.+[台院社局司]|城?区.+[府局室院]|县.+[院台局]|.{0,2}发展公司|经济技术开发|" + "发展和改革局|贵州有色地质|铝塑门窗加工|生产力促进中心|特殊普通合伙|工业集团公司|人民调解协会|人民政府办公厅|机电设备公司|房地产开发有限公司|.{0,4}商店|中等专业学校|" + "农村信用联社|.{0,4}经营部|.{0,4}销售部|驾驶员培训学校|.{2}县.{2}镇|保安服务总公司|住房和城乡建设局|地产评估事务所|生产资料门市部|×+|.{0,3}[0-9]{15}|.*[0-9]+|.*路|.*无字号名称.*|.*车|.*[,,]{1}.*|.*个体工商户|.*运输户)$") //非中文开头... var unstart_strReg *regexp.Regexp = regexp.MustCompile("^([\u4e00-\u9fa5])") //开头 var start_strReg *regexp.Regexp = regexp.MustCompile("^([a-zA-Z]{1,2}[\u4e00-\u9fa5]{6,}|省|市|县|区|业绩|资格|中标|项目|预算单位)") //结尾 var end_strReg *regexp.Regexp = regexp.MustCompile("(\\.|\\.\\.|餐馆|店|腻子|肉庄|画社|美发屋|发廊|网吧|网咖|零售点|新街|包子铺|奶茶铺|(株)|先生|女士|小姐|" + "资格|业绩|中标|项目|预算单位|摊位号|号|厅|室|部|点|馆|场|厂|床|所|处|站|行|中心|合作社|ATMS|" + "吧|楼|摊|摊位|廊|茶社|坊|圃|汤锅|园|民宿|美容院|房|排挡|府|庄|栈|队|批发|苑|养殖户|棋牌|农家乐|货运|" + "城|社|基地|会|服务|娱乐|种植|百货|汽修|农家菜|亭|小吃|快餐|粮库|卫生院|书画院|面|门窗|鸡排|屋|橱|堂|肉铺|服务|服饰|/*)$") //包含 var con_strReg *regexp.Regexp = regexp.MustCompile("(\\?|?|%|代码标识|删除|错误|吊销|注销|发起人|待清理|&#|护照号|身份证号|" + "法人| |国家拨入|借款|积累资金|单位自有|认股人|--|、|&|`|美元|[\u4e00-\u9fa5]{2,6}·[\u4e00-\u9fa5]{2,6})|" + "[a-zA-Z]{5,}") var uncon_strReg *regexp.Regexp = regexp.MustCompile("(园|政府|集团|公司|有限|合伙|企|院|学|局|处)") var YamlConfig YAMLConfig var MixDataMgo *util.MongodbSim var Filter *sensitive.Filter var es_type, es_index string var Client_Es *elastic.Client var data_mgo *MongodbSim func init() { yamlFile, err := ioutil.ReadFile(YAMLFILE) if err != nil { log.Fatalln("load conf error") } err = yaml.Unmarshal(yamlFile, &YamlConfig) if err != nil { fmt.Println(err.Error()) } log.Printf("%#v", YamlConfig) MixDataMgo = &util.MongodbSim{ MongodbAddr: YamlConfig.MixdataMgoAddr, Size: YamlConfig.MongodbPoolSize, DbName: YamlConfig.DbName, UserName: YamlConfig.UserName, PassWord: YamlConfig.PassWord, } MixDataMgo.InitPool() data_mgo = &MongodbSim{ MongodbAddr: "192.168.3.207:27092", DbName: "zhengkun", Size: 10, UserName: "", Password: "", } data_mgo.InitPool() Client_Es ,_= elastic.NewClient(http.DefaultClient, "http://192.168.3.11:9800") es_type, es_index = "azktest","azktest" } func main() { //测试 temporaryTest() return if YamlConfig.IsAddTask==0{ initSensitiveWordsData() //初始化敏感词数据 }else { go addTaskSensitiveWordsData() //增量-改配置文件 } lis, err := net.Listen("tcp", YamlConfig.Port) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() proto_grpc.RegisterSensitiveWordsServer(s, &server{}) log.Println("server start:", YamlConfig.Port) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } } //协议方法---等 type server struct { proto_grpc.SensitiveWordsServer } func (s *server) Search(ctx context.Context, in *proto_grpc.Request) (*proto_grpc.ResultSensitiveWords, error) { text := in.GetText() log.Println(text) findAll := Filter.FindAll(text) return &proto_grpc.ResultSensitiveWords{SensitiveWords: strings.Join(findAll, ",")}, nil } type YAMLConfig struct { MixdataMgoAddr string `yaml:"mixdataMgoAddr"` UserName string `yaml:"userName"` PassWord string `yaml:"passWord"` DbName string `yaml:"dbName"` MongodbPoolSize int `yaml:"mongodbPoolSize"` TaskGteId string `yaml:"taskGteId"` TaskLteId string `yaml:"taskLteId"` IsAddTask int `yaml:"isAddTask"` Port string `yaml:"port"` } //其他方法 func StringTOBsonId(id string) primitive.ObjectID { objectId, _ := primitive.ObjectIDFromHex(id) return objectId } func BsonTOStringId(id interface{}) string { return id.(primitive.ObjectID).Hex() } func toMegaBytes(bytes uint64) float64 { return float64(bytes) / 1024 / 1024 } func IntAll(num interface{}) int { return IntAllDef(num, 0) } func Int64All(num interface{}) int64 { if i, ok := num.(int64); ok { return int64(i) } else if i0, ok0 := num.(int32); ok0 { return int64(i0) } else if i1, ok1 := num.(float64); ok1 { return int64(i1) } else if i2, ok2 := num.(int); ok2 { return int64(i2) } else if i3, ok3 := num.(float32); ok3 { return int64(i3) } else if i4, ok4 := num.(string); ok4 { i64, _ := strconv.ParseInt(i4, 10, 64) //in, _ := strconv.Atoi(i4) return i64 } else if i5, ok5 := num.(int16); ok5 { return int64(i5) } else if i6, ok6 := num.(int8); ok6 { return int64(i6) } else if i7, ok7 := num.(*big.Int); ok7 { in, _ := strconv.ParseInt(fmt.Sprint(i7), 10, 64) return int64(in) } else if i8, ok8 := num.(*big.Float); ok8 { in, _ := strconv.ParseInt(fmt.Sprint(i8), 10, 64) return int64(in) } else { return 0 } } func Float64All(num interface{}) float64 { if i, ok := num.(float64); ok { return float64(i) } else if i0, ok0 := num.(int32); ok0 { return float64(i0) } else if i1, ok1 := num.(int64); ok1 { return float64(i1) } else if i2, ok2 := num.(int); ok2 { return float64(i2) } else if i3, ok3 := num.(float32); ok3 { return float64(i3) } else if i4, ok4 := num.(string); ok4 { in, _ := strconv.ParseFloat(i4, 64) return in } else if i5, ok5 := num.(int16); ok5 { return float64(i5) } else if i6, ok6 := num.(int8); ok6 { return float64(i6) } else if i6, ok6 := num.(uint); ok6 { return float64(i6) } else if i6, ok6 := num.(uint8); ok6 { return float64(i6) } else if i6, ok6 := num.(uint16); ok6 { return float64(i6) } else if i6, ok6 := num.(uint32); ok6 { return float64(i6) } else if i6, ok6 := num.(uint64); ok6 { return float64(i6) } else if i7, ok7 := num.(*big.Float); ok7 { in, _ := strconv.ParseFloat(fmt.Sprint(i7), 64) return float64(in) } else if i8, ok8 := num.(*big.Int); ok8 { in, _ := strconv.ParseFloat(fmt.Sprint(i8), 64) return float64(in) } else { return 0 } } func IntAllDef(num interface{}, defaultNum int) int { if i, ok := num.(int); ok { return int(i) } else if i0, ok0 := num.(int32); ok0 { return int(i0) } else if i1, ok1 := num.(float64); ok1 { return int(i1) } else if i2, ok2 := num.(int64); ok2 { return int(i2) } else if i3, ok3 := num.(float32); ok3 { return int(i3) } else if i4, ok4 := num.(string); ok4 { in, _ := strconv.Atoi(i4) return int(in) } else if i5, ok5 := num.(int16); ok5 { return int(i5) } else if i6, ok6 := num.(int8); ok6 { return int(i6) } else if i7, ok7 := num.(*big.Int); ok7 { in, _ := strconv.Atoi(fmt.Sprint(i7)) return int(in) } else if i8, ok8 := num.(*big.Float); ok8 { in, _ := strconv.Atoi(fmt.Sprint(i8)) return int(in) } else { return defaultNum } } func ObjToString(old interface{}) string { if nil == old { return "" } else { r, _ := old.(string) return r } } func ObjToStringDef(old interface{}, defaultstr string) string { if nil == old { return defaultstr } else { r, _ := old.(string) if r == "" { return defaultstr } return r } } //对象数组转成string数组 func ObjArrToStringArr(old []interface{}) []string { if old != nil { new := make([]string, len(old)) for i, v := range old { new[i] = v.(string) } return new } else { return nil } } //对象数组转成map数组 func ObjArrToMapArr(old []interface{}) []map[string]interface{} { if old != nil { new := make([]map[string]interface{}, len(old)) for i, v := range old { new[i] = v.(map[string]interface{}) } return new } else { return nil } } //map数组转成对象数组 func MapArrToObjArr(old []map[string]interface{}) []interface{} { if old != nil { new := make([]interface{}, len(old)) for i, v := range old { new[i] = v } return new } else { return nil } }