最近有个小程序的项目之前用的阿里云的内容检测,更新之后一直通不过检测,评估之后定位原因应该是小程序有一些特殊的测试用例,阿里云的内容检测检测不到(推测),所以换成微信内容检测/图片检测。说明写在代码注释中
内容检测
请求地址:
POST https://api.weixin.qq.com/wxa/msg_sec_check?access_token=ACCESS_TOKEN
请求参数
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
access_token | string | 是 | ||
content | string | 是 | 要检测的文本内容,长度不超过 500KB |
返回值
Object
返回的 JSON 数据包
属性 | 类型 | 说明 |
---|---|---|
errcode | number | 错误码 |
errMsg | string | 错误信息 |
errcode 的合法值
值 | 说明 | 最低版本 |
---|---|---|
0 | 内容正常 | |
87014 | 内容含有违法违规内容 |
errMsg 的合法值
值 | 说明 | 最低版本 |
---|---|---|
"ok" | 内容正常 | |
"risky | content" 内容含有违法违规内容 |
代码如下:
//WechatDetectContent 通过为true 返回值这里忽略错误,只有成功与失败,也可以将错误抛给上层处理
func WechatDetectContent(contents, accessToken string) bool {
client := http.DefaultClient
//请求需要json形式,用map包装contents
vs := make(map[string]interface{})
vs["content"] = contents
bts, _ := json.Marshal(vs)
//access_token在url中,内容在request body中
resp, err := client.Post("https://api.weixin.qq.com/wxa/msg_sec_check?access_token="+accessToken, "application/json", bytes.NewReader(bts))
if err != nil {
fmt.Println(err.Error())
return false
}
defer resp.Body.Close()
result, err := ioutil.ReadAll(resp.Body)
if err != nil {
return false
}
//复用了map
err = json.Unmarshal(result, &vs)
if err != nil {
return false
}
//errcode 存在,且为0,返回通过
//errcode合法值只有87014和0,其他返回值可以视为错误,可以细化处理
if _, ok := vs["errcode"]; ok && vs["errcode"].(float64) == 0.0 {
return true
}
return false
}
图片检测
请求地址:
POST https://api.weixin.qq.com/wxa/img_sec_check?access_token=ACCESS_TOKEN
请求参数
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
access_token | string | 是 | ||
media | FormData | 是 | 要检测的图片文件,格式支持PNG、JPEG、JPG、GIF,图片尺寸不超过 750px x 1334px |
返回值
Object
返回的 JSON 数据包
属性 | 类型 | 说明 |
---|---|---|
errcode | number | 错误码 |
errMsg | string | 错误信息 |
errcode 的合法值
值 | 说明 | 最低版本 |
---|---|---|
0 | 内容正常 | |
87014 | 内容含有违法违规内容 |
errMsg 的合法值
值 | 说明 | 最低版本 |
---|---|---|
"ok" | 内容正常 | |
"risky content" | 内容含有违法违规内容 |
调用示例
curl -F media=@test.jpg 'https://api.weixin.qq.com/wxa/img_sec_check?access_token=ACCESS_TOKEN'
//通过为true
func WechatDetectImg(bts []byte, accessToken string) bool {
var bufReader bytes.Buffer
// "mime/multipart" 可以将上传文件封装
mpWriter := multipart.NewWriter(&bufReader)
//文件名无所谓
fileName := "detect"
//字段名必须为media
writer, err := mpWriter.CreateFormFile("media", fileName)
if err != nil {
fmt.Println(err.Error())
return false
}
reader := bytes.NewReader(bts
io.Copy(writer, reader)
//关闭了才能把内容写入
mpWriter.Close()
client := http.DefaultClient
destURL := "https://api.weixin.qq.com/wxa/img_sec_check?access_token=" + accessToken
req, _ := http.NewRequest("POST", destURL, &bufReader)
//从mpWriter中获取content-Type
req.Header.Set("Content-Type", mpWriter.FormDataContentType())
resp, err := client.Do(req)
if err != nil {
fmt.Println(err.Error())
}
defer resp.Body.Close()
vs := make(map[string]interface{})
result, _ := ioutil.ReadAll(resp.Body)
if err != nil {
return false
}
err = json.Unmarshal(result, &vs)
if err != nil {
return false
}
//errcode 存在,且为0,返回通过
if _, ok := vs["errcode"]; ok && vs["errcode"].(float64) == 0.0 {
return true
}
return false
}