gitee.com/h79/goutils@v1.22.10/sensitive/sensitive.go (about)

     1  // ζ•ζ„Ÿθ―εΊ“
     2  
     3  package sensitive
     4  
     5  import (
     6  	"encoding/json"
     7  	"errors"
     8  	"gitee.com/h79/goutils/common/logger"
     9  	"gitee.com/h79/goutils/common/option"
    10  	"io"
    11  	"net/http"
    12  	"sync"
    13  	"time"
    14  )
    15  
    16  func WithRegexOpt() option.Option {
    17  	return option.WithOpt(true, "", 1)
    18  }
    19  
    20  func WithDefaultGroupOpt() option.Option {
    21  	return option.WithOpt(true, "", 2)
    22  }
    23  
    24  type SensMgr struct {
    25  	locker    sync.RWMutex
    26  	filterMap map[string]*Filter
    27  }
    28  
    29  const DefaultGroup = "def"
    30  
    31  func NewMgr(opts ...option.Option) *SensMgr {
    32  	m := &SensMgr{
    33  		filterMap: make(map[string]*Filter),
    34  	}
    35  	if option.Select(2, true, opts...) {
    36  		m.Add(DefaultGroup)
    37  	}
    38  	return m
    39  }
    40  
    41  func (m *SensMgr) Add(group string, opts ...option.Option) *Filter {
    42  	m.locker.Lock()
    43  	if filter, ok := m.filterMap[group]; ok {
    44  		m.locker.Unlock()
    45  		return filter
    46  	}
    47  	filter := New(option.Select(1, false, opts...))
    48  	m.filterMap[group] = filter
    49  	m.locker.Unlock()
    50  	return filter
    51  }
    52  
    53  func (m *SensMgr) Get(group string) *Filter {
    54  	m.locker.RLock()
    55  	if filter, ok := m.filterMap[group]; ok {
    56  		m.locker.RUnlock()
    57  		return filter
    58  	}
    59  	m.locker.RUnlock()
    60  	return nil
    61  }
    62  
    63  func (m *SensMgr) Load(group string, path string) error {
    64  	filter := m.Add(group)
    65  	if filter == nil {
    66  		return errors.New("filter not exist")
    67  	}
    68  	if err := filter.LoadWordDict(path); err != nil {
    69  		logger.Error("sensitive load, path= '%s'", path)
    70  		return err
    71  	}
    72  	return nil
    73  }
    74  
    75  func (m *SensMgr) LoadNetworkFileByGroup(group string, url string) error {
    76  	filter := m.Add(group)
    77  	if filter == nil {
    78  		return errors.New("filter not exist")
    79  	}
    80  	if err := filter.LoadWordDictByNetworkFile(url); err != nil {
    81  		logger.Error("sensitive load, url= '%s'", url)
    82  		return err
    83  	}
    84  	return nil
    85  }
    86  
    87  // LoadUrl
    88  //  {"code":200,"data":{"title":[],"":[]}}
    89  
    90  func (m *SensMgr) LoadUrl(url string) error {
    91  
    92  	c := http.Client{
    93  		Timeout: 5 * time.Second,
    94  	}
    95  	rsp, err := c.Get(url)
    96  	if err != nil {
    97  		logger.E("sensitive", "Loaded url=%s, err=%+v", url, err)
    98  		return err
    99  	}
   100  	defer rsp.Body.Close()
   101  
   102  	out, er := io.ReadAll(rsp.Body)
   103  	if er != nil {
   104  		logger.E("sensitive", "read url=%s, err=%+v", url, er)
   105  		return err
   106  	}
   107  	logger.N("sensitive", "data=%v ", logger.Byte2(logger.NDebugLevel, out))
   108  	type Result struct {
   109  		Code int                 `json:"code"`
   110  		Data map[string][]string `json:"data"`
   111  	}
   112  	d := Result{}
   113  	if er = json.Unmarshal(out, &d); er != nil {
   114  		logger.E("sensitive", "read url=%s, err=%+v", url, er)
   115  		return err
   116  	}
   117  	for k, v := range d.Data {
   118  		filter := m.Add(k)
   119  		filter.AddWord(v...)
   120  	}
   121  	return nil
   122  }