最近有个小程序的项目之前用的阿里云的内容检测,更新之后一直通不过检测,评估之后定位原因应该是小程序有一些特殊的测试用例,阿里云的内容检测检测不到(推测),所以换成微信内容检测/图片检测。说明写在代码注释中

内容检测

请求地址:

POST https://api.weixin.qq.com/wxa/msg_sec_check?access_token=ACCESS_TOKEN

请求参数

属性类型默认值必填说明
access_tokenstring 
contentstring 要检测的文本内容,长度不超过 500KB

返回值

Object

返回的 JSON 数据包

属性类型说明
errcodenumber错误码
errMsgstring错误信息

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_tokenstring 
mediaFormData 要检测的图片文件,格式支持PNG、JPEG、JPG、GIF,图片尺寸不超过 750px x 1334px

返回值

Object

返回的 JSON 数据包

属性类型说明
errcodenumber错误码
errMsgstring错误信息

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

}