11package sensitive
22
33import (
4+ "context"
5+ "encoding/json"
46 "fmt"
57 "github.com/opentreehole/backend/common"
68 "github.com/spf13/viper"
79 "github.com/yidun/yidun-golang-sdk/yidun/service/antispam/image/v5"
810 "github.com/yidun/yidun-golang-sdk/yidun/service/antispam/image/v5/check"
11+ "github.com/yidun/yidun-golang-sdk/yidun/service/antispam/label"
12+ "github.com/yidun/yidun-golang-sdk/yidun/service/antispam/label/request"
913 v5 "github.com/yidun/yidun-golang-sdk/yidun/service/antispam/text"
1014 "github.com/yidun/yidun-golang-sdk/yidun/service/antispam/text/v5/check/sync/single"
15+ "net/http"
16+ "net/url"
1117 "strconv"
1218 "strings"
19+ "sync"
1320 "time"
1421)
1522
@@ -43,8 +50,16 @@ func CheckSensitive(params ParamsForCheck) (resp *ResponseForCheck, err error) {
4350 }
4451 if len (images ) != 0 {
4552 for _ , img := range images {
53+ imgUrl , err := url .Parse (img )
54+ if err != nil {
55+ return nil , err
56+ }
57+ host := viper .GetString (common .EnvExternalImageHost )
58+ if host != "" {
59+ imgUrl .Host = host
60+ }
4661 ret , err := checkSensitiveImage (ParamsForCheck {
47- Content : img ,
62+ Content : imgUrl . String () ,
4863 Id : time .Now ().UnixNano (),
4964 TypeName : TypeImage ,
5065 })
@@ -83,7 +98,17 @@ func CheckSensitiveText(params ParamsForCheck) (resp *ResponseForCheck, err erro
8398 }
8499
85100 request := single .NewTextCheckRequest (viper .GetString (common .EnvYiDunBusinessIdText ))
86- textCheckClient := v5 .NewTextClientWithAccessKey (viper .GetString (common .EnvYiDunSecretId ), viper .GetString (common .EnvYiDunSecretKey ))
101+ var textCheckClient * v5.TextClient
102+ if viper .GetString (common .EnvProxyUrl ) != "" {
103+ var url * url.URL
104+ url , err := url .Parse (viper .GetString (common .EnvProxyUrl ))
105+ if err != nil {
106+ return nil , err
107+ }
108+ textCheckClient = v5 .NewTextClientWithAccessKeyWithProxy (viper .GetString (common .EnvYiDunSecretId ), viper .GetString (common .EnvYiDunSecretKey ), http .ProxyURL (url ))
109+ } else {
110+ textCheckClient = v5 .NewTextClientWithAccessKey (viper .GetString (common .EnvYiDunSecretId ), viper .GetString (common .EnvYiDunSecretKey ))
111+ }
87112
88113 request .SetDataID (strconv .FormatInt (params .Id , 10 ) + "_" + params .TypeName )
89114 request .SetContent (params .Content )
@@ -107,31 +132,57 @@ func CheckSensitiveText(params ParamsForCheck) (resp *ResponseForCheck, err erro
107132
108133 common .RequestLog ("Sensitive text check response code is 200" , params .TypeName , params .Id , false )
109134 resp .Pass = false
110- var str string
135+ var sensitiveDetailBuilder strings.Builder
136+ sensitiveLabelMap .RLock ()
137+ defer sensitiveLabelMap .RUnlock ()
111138 for _ , label := range response .Result .Antispam .Labels {
139+ if label .Label == nil {
140+ continue
141+ }
112142 resp .Labels = append (resp .Labels , * label .Label )
113143 // response != nil && response.Result != nil && response.Result.Antispam != nil &&
114144 //if response.Result.Antispam.SecondLabel != nil && response.Result.Antispam.ThirdLabel != nil {
115145 // str := *response.Result.Antispam.SecondLabel + " " + *response.Result.Antispam.ThirdLabel
116146 //}
147+ labelNumber := * label .Label
148+ if sensitiveLabelMap .data [labelNumber ] != nil {
149+ sensitiveDetailBuilder .WriteString ("{" )
150+ sensitiveDetailBuilder .WriteString (sensitiveLabelMap .label [labelNumber ])
151+ sensitiveDetailBuilder .WriteString ("}" )
152+ }
153+
117154 if label .SubLabels != nil {
118155 for _ , subLabel := range label .SubLabels {
156+ if sensitiveLabelMap .data [labelNumber ] != nil {
157+ if subLabel .SubLabel != nil {
158+ sensitiveDetailBuilder .WriteString ("[" + sensitiveLabelMap.data [labelNumber ][* subLabel.SubLabel ] + "]" )
159+ }
160+ if subLabel .SecondLabel != nil {
161+ sensitiveDetailBuilder .WriteString ("[" + sensitiveLabelMap.data [labelNumber ][* subLabel.SecondLabel ] + "]" )
162+ }
163+ if subLabel .ThirdLabel != nil {
164+ sensitiveDetailBuilder .WriteString ("[" + sensitiveLabelMap.data [labelNumber ][* subLabel.ThirdLabel ] + "]" )
165+ }
166+ }
167+
119168 if subLabel .Details != nil && subLabel .Details .HitInfos != nil {
120169 for _ , hitInfo := range subLabel .Details .HitInfos {
121- if str == "" {
122- str = * hitInfo .Value
170+ if hitInfo .Value == nil {
123171 continue
124172 }
125- str += "\n " + * hitInfo .Value
173+ if sensitiveDetailBuilder .Len () != 0 {
174+ sensitiveDetailBuilder .WriteString ("\n " )
175+ }
176+ sensitiveDetailBuilder .WriteString (* hitInfo .Value )
126177 }
127178 }
128179 }
129180 }
130181 }
131- if str == "" {
132- str = "文本敏感,未知原因"
182+ if sensitiveDetailBuilder . Len () == 0 {
183+ sensitiveDetailBuilder . WriteString ( "文本敏感,未知原因" )
133184 }
134- resp .Detail = str
185+ resp .Detail = sensitiveDetailBuilder . String ()
135186 return
136187 }
137188
@@ -147,7 +198,17 @@ func checkSensitiveImage(params ParamsForCheck) (resp *ResponseForCheck, err err
147198 request := check .NewImageV5CheckRequest (viper .GetString (common .EnvYiDunBusinessIdImage ))
148199
149200 // 实例化一个textClient,入参需要传入易盾内容安全分配的secretId,secretKey
150- imageCheckClient := image .NewImageClientWithAccessKey (viper .GetString (common .EnvYiDunSecretId ), viper .GetString (common .EnvYiDunSecretKey ))
201+ var imageCheckClient * image.ImageClient
202+ if viper .GetString (common .EnvProxyUrl ) != "" {
203+ var url * url.URL
204+ url , err := url .Parse (viper .GetString (common .EnvProxyUrl ))
205+ if err != nil {
206+ return nil , err
207+ }
208+ imageCheckClient = image .NewImageClientWithAccessKeyWithProxy (viper .GetString (common .EnvYiDunSecretId ), viper .GetString (common .EnvYiDunSecretKey ), http .ProxyURL (url ))
209+ } else {
210+ imageCheckClient = image .NewImageClientWithAccessKey (viper .GetString (common .EnvYiDunSecretId ), viper .GetString (common .EnvYiDunSecretKey ))
211+ }
151212
152213 imageInst := check .NewImageBeanRequest ()
153214 imageInst .SetData (url )
@@ -183,16 +244,67 @@ func checkSensitiveImage(params ParamsForCheck) (resp *ResponseForCheck, err err
183244 for _ , label := range * ((* response .Result )[0 ].Antispam .Labels ) {
184245 resp .Labels = append (resp .Labels , * label .Label )
185246 }
186- var str string
247+ var sensitiveDetailBuilder strings.Builder
248+ sensitiveLabelMap .RLock ()
249+ defer sensitiveLabelMap .RUnlock ()
187250 for _ , result := range * response .Result {
251+ if result .Antispam != nil && result .Antispam .Labels != nil {
252+ for _ , label := range * result .Antispam .Labels {
253+ if label .Label == nil || label .SubLabels == nil {
254+ continue
255+ }
256+
257+ labelNumber := * label .Label
258+ if sensitiveLabelMap .data [labelNumber ] != nil {
259+ sensitiveDetailBuilder .WriteString ("{" )
260+ sensitiveDetailBuilder .WriteString (sensitiveLabelMap .label [labelNumber ])
261+ sensitiveDetailBuilder .WriteString ("}" )
262+ }
263+
264+ if label .SubLabels != nil {
265+ for _ , subLabel := range * label .SubLabels {
266+ if sensitiveLabelMap .data [labelNumber ] != nil {
267+ if subLabel .SubLabel != nil {
268+ sensitiveDetailBuilder .WriteString ("[" + sensitiveLabelMap.data [labelNumber ][* subLabel.SubLabel ] + "]" )
269+ }
270+ if subLabel .SecondLabel != nil {
271+ sensitiveDetailBuilder .WriteString ("[" + sensitiveLabelMap.data [labelNumber ][* subLabel.SecondLabel ] + "]" )
272+ }
273+ if subLabel .ThirdLabel != nil {
274+ sensitiveDetailBuilder .WriteString ("[" + sensitiveLabelMap.data [labelNumber ][* subLabel.ThirdLabel ] + "]" )
275+ }
276+ }
277+
278+ if subLabel .Details != nil && subLabel .Details .HitInfos != nil {
279+ for _ , hitInfo := range * subLabel .Details .HitInfos {
280+ if hitInfo .Group != nil {
281+ sensitiveDetailBuilder .WriteByte (' ' )
282+ sensitiveDetailBuilder .WriteString (* hitInfo .Group )
283+ }
284+ if hitInfo .Value != nil {
285+ sensitiveDetailBuilder .WriteByte (' ' )
286+ sensitiveDetailBuilder .WriteString (* hitInfo .Value )
287+ }
288+ if hitInfo .Word != nil {
289+ sensitiveDetailBuilder .WriteByte (' ' )
290+ sensitiveDetailBuilder .WriteString (* hitInfo .Word )
291+ }
292+ }
293+ }
294+ }
295+ }
296+ }
297+ }
188298 if result .Ocr != nil {
189299 if result .Ocr .Details != nil {
190300 for _ , detail := range * result .Ocr .Details {
191- if str == "" {
192- str = * detail .Content
301+ if detail .Content == nil {
193302 continue
194303 }
195- str += "\n " + * detail .Content
304+ if sensitiveDetailBuilder .Len () != 0 {
305+ sensitiveDetailBuilder .WriteString ("\n " )
306+ }
307+ sensitiveDetailBuilder .WriteString (* detail .Content )
196308 }
197309 }
198310 }
@@ -201,25 +313,124 @@ func checkSensitiveImage(params ParamsForCheck) (resp *ResponseForCheck, err err
201313 for _ , detail := range * result .Face .Details {
202314 if detail .FaceContents != nil {
203315 for _ , faceContent := range * detail .FaceContents {
204- if str == "" {
205- str = * faceContent .Name
316+ if faceContent .Name == nil {
206317 continue
207318 }
208- str += "\n " + * faceContent .Name
319+ if sensitiveDetailBuilder .Len () != 0 {
320+ sensitiveDetailBuilder .WriteString ("\n " )
321+ }
322+ sensitiveDetailBuilder .WriteString (* faceContent .Name )
209323 }
210324 }
211325 }
212326 }
213327 }
214328 }
215- if str == "" {
216- str = "图片敏感,未知原因"
329+ if sensitiveDetailBuilder . Len () == 0 {
330+ sensitiveDetailBuilder . WriteString ( "图片敏感,未知原因" )
217331 }
218- resp .Detail = str
332+ resp .Detail = sensitiveDetailBuilder . String ()
219333 return
220334 }
221335
222336 common .RequestLog ("Sensitive image check http response code is not 200" , params .TypeName , params .Id , false )
223337 resp .Pass = false
224338 return
225339}
340+
341+ var sensitiveLabelMap struct {
342+ sync.RWMutex
343+ label map [int ]string
344+ data map [int ]map [string ]string
345+ lastLength int
346+ }
347+
348+ func InitSensitiveLabelMap () {
349+ // skip when bench
350+
351+ // || viper.GetString(common.AuthUrl) == ""
352+ if viper .GetString (common .EnvMode ) == "bench" {
353+ return
354+ }
355+
356+ // 创建一个LabelQueryRequest实例
357+ request := request .NewLabelQueryRequest ()
358+
359+ // 实例化Client,入参需要传入易盾内容安全分配的AccessKeyId,AccessKeySecret
360+ labelClient := label .NewLabelClientWithAccessKey (viper .GetString (common .EnvYiDunAccessKeyId ), viper .GetString (common .EnvYiDunAccessKeySecret ))
361+
362+ // 传入请求参数
363+ //设置返回标签的最大层级
364+ request .SetMaxDepth (3 )
365+ //指定业务类型
366+ // request.SetBusinessTypes(&[]string{"1", "2"})
367+ //制定业务
368+ // request.SetBusinessID("SetBusinessID")
369+ // request.SetClientID("YOUR_CLIENT_ID")
370+ // request.SetLanguage("en")
371+
372+ response , err := labelClient .QueryLabel (request )
373+ if err != nil {
374+ // log.Err(err).Str("model", "get admin").Msg("error sending auth server")
375+ common .RequestLog ("Sensitive label init error" , "label error" , - 1 , false )
376+ return
377+ }
378+
379+ if response .GetCode () != 200 {
380+ // log.Error().Str("model", "get admin").Msg("auth server response failed" + res.Status)
381+ common .RequestLog ("Sensitive label init http response code is not 200" , "label error" , - 1 , false )
382+ return
383+ }
384+
385+ responseByte , err := json .Marshal (response )
386+ if err != nil {
387+ common .RequestLog ("Sensitive label Marshal error" , "label error" , - 1 , false )
388+ return
389+ }
390+
391+ if sensitiveLabelMap .lastLength == len (responseByte ) {
392+ common .RequestLog ("Sensitive label unchanged" , "label unchanged" , 1 , false )
393+ return
394+ }
395+
396+ sensitiveLabelMap .Lock ()
397+ defer sensitiveLabelMap .Unlock ()
398+ sensitiveLabelMap .lastLength = len (responseByte )
399+ sensitiveLabelMap .label = make (map [int ]string )
400+ sensitiveLabelMap .data = make (map [int ]map [string ]string )
401+ data := response .Data
402+
403+ for _ , label := range data {
404+ if label .Label == nil || label .Name == nil {
405+ continue
406+ }
407+ sensitiveLabelMap .label [* label .Label ] = * label .Name
408+ labelNumber := * label .Label
409+ labelMap := make (map [string ]string )
410+ for _ , subLabel := range label .SubLabels {
411+ if subLabel .Code == nil || subLabel .Name == nil {
412+ continue
413+ }
414+ labelMap [* subLabel .Code ] = * subLabel .Name
415+ for _ , subSubLabel := range subLabel .SubLabels {
416+ if subSubLabel .Code == nil || subSubLabel .Name == nil {
417+ continue
418+ }
419+ labelMap [* subLabel .Code ] = * subLabel .Name
420+ }
421+ }
422+ sensitiveLabelMap .data [labelNumber ] = labelMap
423+ }
424+ }
425+
426+ func UpdateSensitiveLabelMap (ctx context.Context ) {
427+ ticker := time .NewTicker (time .Hour )
428+ for {
429+ select {
430+ case <- ctx .Done ():
431+ return
432+ case <- ticker .C :
433+ InitSensitiveLabelMap ()
434+ }
435+ }
436+ }
0 commit comments