评论

【Java后台】校验一张图片是否含有违法违规内容

【Java后台】校验一张图片是否含有违法违规内容 imgSecCheck 接口 Java实现调用

近期应该部分个人开发者小程序会收到如下通知

为了快速解决问题,就直接使用官方提供的接口

imgSecCheck校验一张图片是否含有违法违规内容

个人小程序只是图片的一些处理识别。固只拿imgSecCheck接口进行代码示例了。
1.在自己的Java后台服务增加接口调用(api.weixin.qq.com不能直接加入小程序安全域名中)
2.在小程序选择图片后优先走违法违规校验。校验通过再走自己的业务代码。

Java实现获取小程序的图片文件并进行违法违规校验

wx.uploadFile 传递图片文件到后台

 wx.uploadFile({
    url: 图片违法违规校验接口地址,
    filePath: res.tempFilePaths[0],
    header: {
        'content-type': 'multipart/form-data'
    },
    name: 'file',
    success: function(checkres) {
        var checkResult = JSON.parse(checkres.data);
        console.info(checkResult);
        if (checkResult.errcode == '0') {
            //校验没有违法违规进行自己业务代码处理
        } else {
            if (checkResult.errcode == '87014') {
                wx.hideLoading();
                wx.showModal({
                    content: '存在敏感内容,请更换图片',
                    showCancel: false,
                    confirmText: '明白了'
                })
            } else {
                wx.hideLoading();
                wx.showModal({
                    content: '其他错误,稍后再试',
                    showCancel: false,
                    confirmText: '明白了'
                })
            }
        }
    }

后台代码

/**
     * 图片过滤检测
     * @param file 图片文件
     * @return
     */
    @RequestMapping(value = "/imgcheck", method = {RequestMethod.POST})
    @ResponseBody
    public AccessTokenWX checkPic(@RequestParam(value = "file") MultipartFile file, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        String token = "";
        //自己写一个定时任务或其他方式 获取AccessToken
        AccessTokenWX accessTokenWX = new AccessTokenWX();
        try {
                token = getAccessTokenJob.getAccessToken();
                String url = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=" + token;
                String result = uploadFile(url, file);
                accessTokenWX = JSON.parseObject(result, AccessTokenWX.class);
                System.out.println("图片检测结果 = " + result);
                return accessTokenWX;
        } catch (Exception e) {
            System.out.println("----------------调用腾讯内容过滤系统出错------------------" + e.getMessage());
            accessTokenWX.setErrcode("500");
            accessTokenWX.setErrmsg("system错误");
            return accessTokenWX;
        }
    }
    /**
     * 上传二进制文件
     * @param graphurl 接口地址
     * @param file 图片文件
     * @return
     */
    public static String uploadFile(String graphurl,MultipartFile file) {
        String line = null;//接口返回的结果
        try {
            // 换行符
            final String newLine = "\r\n";
            final String boundaryPrefix = "--";
            // 定义数据分隔线
            String BOUNDARY = "========7d4a6d158c9";
            // 服务器的域名
            URL url = new URL(graphurl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 设置为POST情
            conn.setRequestMethod("POST");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            // 设置请求头参数
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("Charsert", "UTF-8");
            conn.setRequestProperty("Content-Type","multipart/form-data; boundary=" + BOUNDARY);
            conn.setRequestProperty("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1");
            OutputStream out = new DataOutputStream(conn.getOutputStream());

            // 上传文件
            StringBuilder sb = new StringBuilder();
            sb.append(boundaryPrefix);
            sb.append(BOUNDARY);
            sb.append(newLine);
            // 文件参数,photo参数名可以随意修改
            sb.append("Content-Disposition: form-data;name=\"image\";filename=\""
                    + "https://api.weixin.qq.com" + "\"" + newLine);
            sb.append("Content-Type:application/octet-stream");
            // 参数头设置完以后需要两个换行,然后才是参数内容
            sb.append(newLine);
            sb.append(newLine);

            // 将参数头的数据写入到输出流中
            out.write(sb.toString().getBytes());

            // 读取文件数据
            out.write(file.getBytes());
            // 最后添加换行
            out.write(newLine.getBytes());

            // 定义最后数据分隔线,即--加上BOUNDARY再加上--。
            byte[] end_data = (newLine + boundaryPrefix + BOUNDARY
                    + boundaryPrefix + newLine).getBytes();
            // 写上结尾标识
            out.write(end_data);
            out.flush();
            out.close();
            // 定义BufferedReader输入流来读取URL的响应
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    conn.getInputStream()));
            while ((line = reader.readLine()) != null) {
                return line;
            }
        } catch (Exception e) {
            System.out.println("发送POST请求出现异常!" + e);
        }
        return line;
    }

为了方便大家。我这里直接封装了一个接口供大家使用

接口地址:https://www.ydxiaoshuai.cn/xai/rest/token/imgcheck/general

请求方式: POST

Body参数:

access_token 接口调用凭证
file 图片文件

POSTMAN截图示意

实现Controller代码如下

/**
     * 图片过滤检测
     * @param file 要校验的图片
     * @param access_token 接口调用凭证
     * @return
     */
    @RequestMapping(value = "/imgcheck/general", method = {RequestMethod.POST})
    @ResponseBody
    public AccessTokenWX checkPicgeneral(@RequestParam(value = "file") MultipartFile file, String access_token,HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        logger.info("获取access_token======" + access_token + "访问的ip" + httpServletRequest.getRemoteAddr());
        AccessTokenWX accessTokenWX = new AccessTokenWX();
        try {
            String url = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=" + access_token;
            String result = uploadFile(url, file);
            accessTokenWX = JSON.parseObject(result, AccessTokenWX.class);
            System.out.println("图片检测结果 = " + result);
            return accessTokenWX;
        } catch (Exception e) {
            System.out.println("----------------调用腾讯内容过滤系统出错------------------" + e.getMessage());
            accessTokenWX.setErrcode("500");
            accessTokenWX.setErrmsg("system错误");
            return accessTokenWX;
        }
    }
最后一次编辑于  09-29  
点赞 1
收藏
评论

2 个评论

  • 小帅丶
    小帅丶
    09-29
    AccessTokenWX对象
    import com.fasterxml.jackson.annotation.JsonInclude;
      
    /**
     * @Description AccessTokenWX
     * @author 小帅丶
     * @className AccessTokenWX
     * @Date 2019/9/29-10:22
     **/
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class AccessTokenWX {
        private String access_token;
        private Integer expires_in;
        private String errcode;
        private String errmsg;
       //set/get省略
    }


    09-29
    赞同 1
    回复
  • 大饼
    大饼
    09-29

    Java后端的,推荐引入com.github.liyiorg:weixin-popular:2.8.26这个包,很多接口都已经封装好了。

    09-29
    赞同
    回复 1
    • 小帅丶
      小帅丶
      09-29
      哦哦。知道了。
      09-29
      1
      回复