237 lines
6.1 KiB
Go
237 lines
6.1 KiB
Go
|
|
package sensitiveWordsMgr
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"encoding/json"
|
|||
|
|
"errors"
|
|||
|
|
"fmt"
|
|||
|
|
"strconv"
|
|||
|
|
"strings"
|
|||
|
|
"time"
|
|||
|
|
|
|||
|
|
"Framework/goroutineMgr"
|
|||
|
|
. "Framework/managecenterModel"
|
|||
|
|
"goutil/dfaUtil"
|
|||
|
|
"goutil/logUtil"
|
|||
|
|
"goutil/mathUtil"
|
|||
|
|
"goutil/webUtil"
|
|||
|
|
"goutil/zlibUtil"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// const GetForbidWordURL string = "http://10.253.0.186:10090/Query"
|
|||
|
|
type ForbidWords struct {
|
|||
|
|
//游戏ID
|
|||
|
|
GameId int
|
|||
|
|
//屏蔽字
|
|||
|
|
Words string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 请求屏蔽字库地址
|
|||
|
|
const GetForbidWordURL string = "http://forbidword.7qule.com/Query"
|
|||
|
|
|
|||
|
|
var (
|
|||
|
|
mHashValue string
|
|||
|
|
mDFAUtil *dfaUtil.DFAUtil
|
|||
|
|
mGameId int
|
|||
|
|
rand *mathUtil.Rand
|
|||
|
|
mGameOnly bool = false
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 获取屏蔽字
|
|||
|
|
func refreshSensitiveWord() error {
|
|||
|
|
//定义参数
|
|||
|
|
requestParamMap := make(map[string]string, 0)
|
|||
|
|
requestParamMap["GameId"] = strconv.Itoa(mGameId)
|
|||
|
|
requestParamMap["HashValue"] = mHashValue
|
|||
|
|
requestParamMap["DataType"] = "1"
|
|||
|
|
requestParamMap["IsResultCompressed"] = "true"
|
|||
|
|
if mGameOnly {
|
|||
|
|
requestParamMap["GameOnly"] = "true"
|
|||
|
|
}
|
|||
|
|
//data, _ := json.Marshal(requestParamMap)
|
|||
|
|
|
|||
|
|
//请求url,请求头
|
|||
|
|
header := webUtil.GetFormHeader()
|
|||
|
|
transport := webUtil.NewTransport()
|
|||
|
|
transport.DisableKeepAlives = true
|
|||
|
|
transport = webUtil.GetTimeoutTransport(transport, 1000)
|
|||
|
|
|
|||
|
|
statusCode, returnBytesTemp, err := webUtil.PostMapData(GetForbidWordURL, requestParamMap, header, transport)
|
|||
|
|
//statusCode, returnBytes, err := webUtil.PostMapData(GetForbidWordURL, requestParamMap, header, nil)
|
|||
|
|
if err != nil {
|
|||
|
|
logUtil.ErrorLog(fmt.Sprintf("获取敏感字出错,url:%s,错误信息为:%s", GetForbidWordURL, err))
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
if statusCode != 200 {
|
|||
|
|
logUtil.ErrorLog(fmt.Sprintf("获取敏感字出错,url:%s,错误码为:%d", GetForbidWordURL, statusCode))
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//解压
|
|||
|
|
returnBytes, err := zlibUtil.Decompress(returnBytesTemp)
|
|||
|
|
if err != nil {
|
|||
|
|
logUtil.ErrorLog("返回结果解压失败")
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 解析返回值
|
|||
|
|
returnObj := new(ReturnObject)
|
|||
|
|
if err = json.Unmarshal(returnBytes, &returnObj); err != nil {
|
|||
|
|
logUtil.ErrorLog(fmt.Sprintf("获取敏感字反序列化返回值出错,错误信息为:%s, str:%s", err, string(returnBytes)))
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 判断返回状态是否为成功
|
|||
|
|
if returnObj.Code != 0 {
|
|||
|
|
msg := fmt.Sprintf("获取敏感字出错,返回状态:%d,信息为:%s", returnObj.Code, returnObj.Message)
|
|||
|
|
logUtil.ErrorLog(msg)
|
|||
|
|
return errors.New(msg)
|
|||
|
|
} else if returnObj.Code == 0 && len(returnObj.HashValue) == 0 { //表示没有更新
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 解析Data
|
|||
|
|
var tmpSensitiveWordList []*ForbidWords
|
|||
|
|
if data, ok := returnObj.Data.(string); !ok {
|
|||
|
|
msg := "获取敏感字出错,返回的数据不是string类型"
|
|||
|
|
logUtil.ErrorLog(msg)
|
|||
|
|
return errors.New(msg)
|
|||
|
|
} else {
|
|||
|
|
if err = json.Unmarshal([]byte(data), &tmpSensitiveWordList); err != nil {
|
|||
|
|
logUtil.ErrorLog(fmt.Sprintf("获取敏感字反序列化数据出错,错误信息为:%s", err))
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//缓存hasvalue
|
|||
|
|
mHashValue = returnObj.HashValue
|
|||
|
|
|
|||
|
|
//获取敏感字数组
|
|||
|
|
var temWordArray []string
|
|||
|
|
for _, item := range tmpSensitiveWordList {
|
|||
|
|
temWordArray = append(temWordArray, strings.ToUpper(item.Words))
|
|||
|
|
}
|
|||
|
|
//dfa
|
|||
|
|
mDFAUtil = dfaUtil.NewDFAUtil(temWordArray)
|
|||
|
|
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 是否包含屏蔽字
|
|||
|
|
func IsSensitiveWords(input string) (exist bool) {
|
|||
|
|
input = strings.ToUpper(input)
|
|||
|
|
exist = mDFAUtil.IsMatch(input)
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 取出敏感字及开始位置
|
|||
|
|
func SensitiveWords(input string) (words []string, pos []int, exist bool) {
|
|||
|
|
input2 := strings.ToUpper(input)
|
|||
|
|
inputRune := []rune(input)
|
|||
|
|
startIndexList, endIndexList := mDFAUtil.SearchSentence(input2)
|
|||
|
|
if len(startIndexList) > 0 {
|
|||
|
|
exist = true
|
|||
|
|
words = make([]string, 0, len(startIndexList))
|
|||
|
|
pos = make([]int, 0, len(startIndexList))
|
|||
|
|
for i := 0; i < len(startIndexList); i++ {
|
|||
|
|
start := startIndexList[i]
|
|||
|
|
end := endIndexList[i]
|
|||
|
|
words = append(words, string(inputRune[start:end+1]))
|
|||
|
|
pos = append(pos, start)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 取出敏感字及开始及结束位置
|
|||
|
|
func SensitiveWordsEndStartPos(input string) (words []string, starts, ends []int, exist bool) {
|
|||
|
|
input2 := strings.ToUpper(input)
|
|||
|
|
inputRune := []rune(input)
|
|||
|
|
startIndexList, endIndexList := mDFAUtil.SearchSentence(input2)
|
|||
|
|
if len(startIndexList) > 0 {
|
|||
|
|
exist = true
|
|||
|
|
words = make([]string, 0, len(startIndexList))
|
|||
|
|
starts = startIndexList
|
|||
|
|
ends = endIndexList
|
|||
|
|
for i := 0; i < len(startIndexList); i++ {
|
|||
|
|
start := startIndexList[i]
|
|||
|
|
end := endIndexList[i]
|
|||
|
|
words = append(words, string(inputRune[start:end+1]))
|
|||
|
|
//pos = append(pos, start)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 根据用户输入的替换词替换敏感词
|
|||
|
|
func ReplaceSendsitiveWords(input, replaceStr string) (newStr string) {
|
|||
|
|
words, _, _, exist := SensitiveWordsEndStartPos(input)
|
|||
|
|
newStr = input
|
|||
|
|
//如果不存在敏感词,则直接返回
|
|||
|
|
if !exist {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
//循环替换
|
|||
|
|
for _, sendsitiveWord := range words {
|
|||
|
|
newStr = strings.Replace(newStr, sendsitiveWord, replaceStr, -1)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 判断服务器是否存在
|
|||
|
|
func IfServerExists() (exist bool) {
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 处理敏感字
|
|||
|
|
func HandleSendsitiveWords(input string) (newStr string) {
|
|||
|
|
newStr = mDFAUtil.HandleWord(input, rune('*'))
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 定时刷新敏感字库
|
|||
|
|
func StartRefreshSensitiveWordListTread(gameId int) {
|
|||
|
|
rand = mathUtil.GetRand()
|
|||
|
|
mGameId = gameId
|
|||
|
|
// 定时刷新数据
|
|||
|
|
go func() {
|
|||
|
|
goroutineName := "sensitiveWordsMgr.StartRefreshSensitiveWordListTread"
|
|||
|
|
goroutineMgr.Monitor(goroutineName)
|
|||
|
|
defer goroutineMgr.ReleaseMonitor(goroutineName)
|
|||
|
|
|
|||
|
|
for {
|
|||
|
|
// 刷新屏蔽字
|
|||
|
|
refreshSensitiveWord()
|
|||
|
|
|
|||
|
|
// 每5分钟刷新一次
|
|||
|
|
time.Sleep(time.Duration(rand.GetRandRangeInt64(120, 300)) * time.Second)
|
|||
|
|
}
|
|||
|
|
}()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 定时刷新敏感字库(排除公共字库,只刷新游戏内的)
|
|||
|
|
func StartRefreshSensitiveListTreadExcludeComm(gameId int) {
|
|||
|
|
rand = mathUtil.GetRand()
|
|||
|
|
mGameId = gameId
|
|||
|
|
mGameOnly = true
|
|||
|
|
// 定时刷新数据
|
|||
|
|
go func() {
|
|||
|
|
goroutineName := "sensitiveWordsMgr.StartRefreshSensitiveWordListTread"
|
|||
|
|
goroutineMgr.Monitor(goroutineName)
|
|||
|
|
defer goroutineMgr.ReleaseMonitor(goroutineName)
|
|||
|
|
|
|||
|
|
for {
|
|||
|
|
// 刷新屏蔽字
|
|||
|
|
refreshSensitiveWord()
|
|||
|
|
|
|||
|
|
// 每5分钟刷新一次
|
|||
|
|
time.Sleep(time.Duration(rand.GetRandRangeInt64(120, 300)) * time.Second)
|
|||
|
|
}
|
|||
|
|
}()
|
|||
|
|
}
|