Skip to content

Commit 157dbe2

Browse files
authored
Merge pull request #140 from ppolariss/main
feat: synchronize sensitive api
2 parents 20cf93b + cce7e29 commit 157dbe2

File tree

5 files changed

+253
-23
lines changed

5 files changed

+253
-23
lines changed

common/config.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ const (
2222
EnvYiDunSecretKey = "YI_DUN_SECRET_KEY"
2323
EnvValidImageUrl = "VALID_IMAGE_URL"
2424
EnvUrlHostnameWhitelist = "URL_HOSTNAME_WHITELIST"
25+
EnvExternalImageHost = "EXTERNAL_IMAGE_HOST"
26+
EnvProxyUrl = "PROXY_URL"
27+
EnvYiDunAccessKeyId = "YI_DUN_ACCESS_KEY_ID"
28+
EnvYiDunAccessKeySecret = "YI_DUN_ACCESS_KEY_SECRET"
2529
)
2630

2731
var defaultConfig = map[string]string{
@@ -37,6 +41,10 @@ var defaultConfig = map[string]string{
3741
EnvYiDunSecretKey: "",
3842
EnvValidImageUrl: "",
3943
EnvUrlHostnameWhitelist: "",
44+
EnvExternalImageHost: "",
45+
EnvProxyUrl: "",
46+
EnvYiDunAccessKeyId: "",
47+
EnvYiDunAccessKeySecret: "",
4048
}
4149

4250
var GormConfig = &gorm.Config{

common/sensitive/api.go

Lines changed: 231 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
package sensitive
22

33
import (
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

Comments
 (0)