zoukankan      html  css  js  c++  java
  • Java 微信小程序imgSecCheck接口示例-校验一张图片是否含有违法违规内容

    小程序上线后会接到这种警告 

    ImageUtil代码

    import lombok.extern.slf4j.Slf4j;
     
    import javax.imageio.ImageIO;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.geom.AffineTransform;
    import java.awt.image.AffineTransformOp;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.net.URL;
     
    /**
     * @author 小帅丶
     * @className ImageUtil
     * @Description 图片缩放
     * @Date 2020/9/29-9:58
     **/
    @Slf4j
    public class ImageUtil {
        /**
         * 缩放比例系数
         */
        private static double SCALING = 0.56;
        /**
         * 符合base64的宽
         */
        private static int MAX_WIDTH = 560;
        /**
         * 最大高
         */
        private static int MAX_HEIGHT = 1000;
     
        /**
         * @Author 小帅丶
         * @Description 根据图片公网地址转BufferedImage
         * @Date  2020/9/29 10:52
         * @param url 图片公网地址
         * @return java.awt.image.BufferedImage
         **/
        public static BufferedImage imgUrlConvertBufferedImage(String url) throws Exception {
            URL urls = new URL(url);
            Image image = Toolkit.getDefaultToolkit().getImage(urls);
            BufferedImage bufferedImage = toBufferedImage(image);
            return bufferedImage;
        }
        /**
         * @Author 小帅丶
         * @Description 根据BufferedImage处理图片并返回byte[]
         * @Date  2020/9/29 10:55
         * @param bufferedImage
         * @return byte[]
         **/
        public static byte[] zoomImageByte(BufferedImage bufferedImage) throws Exception {
            ByteArrayOutputStream outputStreamZoom = new ByteArrayOutputStream();
            ByteArrayOutputStream outputStreamSource = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "jpg", outputStreamSource);
            BufferedImage bufferedImageZoom = zoomImage(outputStreamSource.toByteArray());
            //写入缩减后的图片
            ImageIO.write(bufferedImageZoom, "jpg", outputStreamZoom);
            return outputStreamZoom.toByteArray();
        }
     
        /**
         * @Author 小帅丶
         * @Description 根据byte[]处理图片并返回byte[]
         * @Date  2020/9/29 10:55
         * @param src
         * @return byte[]
         **/
        public static byte[] zoomImageByte(byte[] src) throws Exception {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            BufferedImage bufferedImage = zoomImage(src);
            //写入缩减后的图片
            ImageIO.write(bufferedImage, "jpg", outputStream);
            return outputStream.toByteArray();
        }
     
        /**
         * 图片缩放 仅适用于微信内容图片安全检测使用
         *
         * @param src 为源文件byte
         */
        public static BufferedImage zoomImage(byte[] src) throws Exception {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ByteArrayInputStream in = new ByteArrayInputStream(src);
            double wr = 0, hr = 0;
            BufferedImage bufferedImage = null;
            //读取图片
            BufferedImage bufImg = ImageIO.read(in);
            int height = bufImg.getHeight();
            int width = bufImg.getWidth();
            int cHeight = height;
            int cWidth = width;
            double Scaling = width / height;
            if (Scaling < SCALING) {
                if (height > MAX_HEIGHT) {
                    cHeight = MAX_HEIGHT;
                    cWidth = (width * MAX_HEIGHT) / height;
                }
                //以宽为缩放比例
            } else {
                if (width > MAX_WIDTH) {
                    cWidth = MAX_WIDTH;
                    cHeight = (height * MAX_WIDTH) / width;
                }
            }
            //获取缩放后的宽高
            log.info("宽{},高{}", cWidth, cHeight);
            //设置缩放目标图片模板
            Image Itemp = bufImg.getScaledInstance(width, cHeight, BufferedImage.SCALE_SMOOTH);
            //获取缩放比例
            wr = cWidth * 1.0 / width;
            hr = cHeight * 1.0 / height;
            log.info("宽比例{},高比例{}", wr, hr);
            AffineTransformOp ato = new AffineTransformOp(AffineTransform.getScaleInstance(wr, hr), null);
            Itemp = ato.filter(bufImg, null);
            try {
                //写入缩减后的图片
                ImageIO.write((BufferedImage) Itemp, "jpg", outputStream);
                ByteArrayInputStream inNew = new ByteArrayInputStream(outputStream.toByteArray());
                bufferedImage = ImageIO.read(inNew);
            } catch (Exception ex) {
                log.info("缩放图片异常{}", ex.getMessage());
            } finally {
                if (null != outputStream) {
                    outputStream.close();
                }
                if (null != in) {
                    in.close();
                }
            }
            return bufferedImage;
        }
     
        /**
         * @Author 小帅丶
         * @Description Image转BufferedImage
         * @Date  2020/9/29 10:47
         * @param image 通过url获取的image对象
         * @return java.awt.image.BufferedImage
         **/
        public static BufferedImage toBufferedImage(Image image) {
            if (image instanceof BufferedImage) {
                return (BufferedImage) image;
            }
            // This code ensures that all the pixels in the image are loaded
            image = new ImageIcon(image).getImage();
            BufferedImage bimage = null;
            GraphicsEnvironment ge = GraphicsEnvironment
                    .getLocalGraphicsEnvironment();
            try {
                int transparency = Transparency.OPAQUE;
                GraphicsDevice gs = ge.getDefaultScreenDevice();
                GraphicsConfiguration gc = gs.getDefaultConfiguration();
                bimage = gc.createCompatibleImage(image.getWidth(null),
                        image.getHeight(null), transparency);
            } catch (HeadlessException e) {
                // The system does not have a screen
            }
            if (bimage == null) {
                // Create a buffered image using the default color model
                int type = BufferedImage.TYPE_INT_RGB;
                bimage = new BufferedImage(image.getWidth(null),
                        image.getHeight(null), type);
            }
            // Copy image to buffered image
            Graphics g = bimage.createGraphics();
            // Paint the image onto the buffered image
            g.drawImage(image, 0, 0, null);
            g.dispose();
            return bimage;
        }
    }

    WeiXinUtil代码

        private static Integer IMG_WIDTH = 750;
        private static Integer IMG_HEIGHT = 1334;
        /**
         * 图片检测接口
         */
        private static String IMG_SEC_URL = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=";
        
    
    /**
         * @Author 
         * @Description 图片安全检查
         * @Date  2021.07.02
         * @param imageUrl 图片公网地址 /适用oss url(referer限制也没事)/适用oss sts 生成url
         * @param access_token 微信的token
         * @return
         **/
        public  Boolean checkPic(String imageUrl,String access_token) throws Exception{
            BufferedImage bufferedImage = ImageUtil.imgUrlConvertBufferedImage(imageUrl);
            String url = IMG_SEC_URL + access_token;
            //750px * 1334px
            if (bufferedImage.getWidth() > IMG_WIDTH || bufferedImage.getHeight() > IMG_HEIGHT) {
                //缩放图片
                byte[] newImage = ImageUtil.zoomImageByte(bufferedImage);
            //适合oss链接直接传 不需要file对象 网络上好多都是file对象 占用带宽其次慢 String result
    = uploadFile(url,newImage); System.out.println(result); System.out.println("general缩放图片检测结果 = " + result); JSONObject jso = JSONObject.parseObject(result); String errcode = jso.getString("errcode"); System.out.println("打印errcode"+errcode); if(errcode.equals("87014")){//当content内含有敏感信息,则返回87014 return true; } return false; } else { ByteArrayOutputStream outputStreamSource = new ByteArrayOutputStream(); ImageIO.write(bufferedImage, "jpg", outputStreamSource); String result = uploadFile(url,outputStreamSource.toByteArray()); System.out.println(result); System.out.println("general图片检测结果 = " + result); JSONObject jso = JSONObject.parseObject(result); String errcode = jso.getString("errcode"); System.out.println("打印errcode"+errcode); if(errcode.equals("87014")){//当content内含有敏感信息,则返回87014 return true; } return false; } }




    wxutil 里面两个方法

     /**
         * 上传二进制文件
         * @param graphurl 这个地址为微信公众平台的
         * @param file 图片文件
         * @return
         */
        public static String uploadFile(String graphurl,MultipartFile file) {
            String line = null;//接口返回的结果
            try {
                // 换行符
                final String newLine = "
    ";
                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;
        }
     
        /**
         * 上传二进制文件
         * @param apiurl 公众平台接口地址
         * @param file 图片文件
         * @return
         */
        public static String uploadFile(String apiurl, byte[] file) {
            //接口返回的结果
            String line = null;
            try {
                // 换行符
                final String newLine = "
    ";
                final String boundaryPrefix = "--";
                // 定义数据分隔线
                String BOUNDARY = "========7d4a6d158c9";
                // 服务器的域名
                URL url = new URL(apiurl);
                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 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.15(0x17000f31) NetType/WIFI Language/zh_CN");
                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);
                // 最后添加换行
                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;
        }

    最后自己 在控制层 直接传入文本或图片 返回true代表有违规图片或者文字 给出自己业务提示语 例如:您的图片或文字包含敏感信息不合法

    nohup  java -jar xxx.jar >/dev/null 2>&1 &

    早年同窗始相知,三载瞬逝情却萌。年少不知愁滋味,犹读红豆生南国。别离方知相思苦,心田红豆根以生。
  • 相关阅读:
    SAMBA服务初学练习
    NFS与AutoNFS实例
    NTP服务简介
    DHCP服务简单搭建步骤
    HBase文档操作--练习篇
    Hadoop体系结构管理
    HBase表结构设计--练习篇
    HBase备份恢复练习
    MongoDB管理练习
    24_BlockingQueue接口
  • 原文地址:https://www.cnblogs.com/shanheyongmu/p/14963895.html
Copyright © 2011-2022 走看看