Java实现微信小程序校验图片是否含有违法违规内容
文章目录
- 1.Java实现微信小程序校验图片是否含有违法违规内容(security.imgSecCheck)
- 2.接口文档简述
- 3.Java实现对接接口
- 4.压缩图片(Thumbnails)
- 5.整合压缩图片和对接代码
- 6.ImageUtils工具类
- 7.结束语
1.Java实现微信小程序校验图片是否含有违法违规内容(security.imgSecCheck)
做毕设期间,第一次对微信小程序的开发接口进行对接,发现微信的接口文档写的及其简单,导致我找寻许久都没有找到合适的介绍,在此记录自己使用Java在后台对接security.imgSecCheck接口的过程。微信校验一张图片是否含有违法违规内容。
2.接口文档简述
应用场景举例:
1.图片智能鉴黄:涉及拍照的工具类应用(如美拍,识图类应用)用户拍照上传检测;电商类商品上架图片检测;媒体类用户文章里的图片检测等;
2.敏感人脸识别:用户头像;媒体类用户文章里的图片检测;社交类用户上传的图片检测等。频率限制:
单个 appId 调用上限为 2000 次/分钟,200,000 次/天*(图片大小限制:1M) *服务市场:**通过服务市场使用可以有更多的能力,文档详情。调用方式:
HTTPS 调用
云调用
增量调用(加强版)
本人使用的是https调用,请求地址如下:
POST https://api.weixin.qq.com/wxa/img_sec_check?access_token=ACCESS_TOKEN
请求参数如下:
可以看到想要对接微信开发接口,必须要有其提供的AccessToken,如何获取AccessToken在我上篇博客中以介绍,不再累赘。
该接口对校验的图片有要求,一是大小不能超过1M,二是图片尺寸不超过750px * 1334px。
3.Java实现对接接口
使用了httpclient,可通过这篇文章(HttpClient详细使用示例)了解其使用方法。
首先,导入maven依赖包。
<!--调用 http 请求--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.3</version></dependency>
在代码编写过程,自动导包有时候会有一些相同的包,但是却不知道用哪一个,有可能导入了其他的包,我在网上查找资料时经常遇到代码没有列出需要导的包的情况,在此添加部分需要的包,大概可知所需要的包。(因为代码是从模块中分离出来的,可能有所纰漏)。Java代码如下:
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;/*** 恶意图片过滤* MultipartFile multipartFile, String accessToken* @param multipartFile* @param accessToken* @return*/public void checkImg(MultipartFile multipartFile, String accessToken) throws Exception {//微信开放接口链接String url = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=" + accessToken;// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的HttpClient httpclient = HttpClients.createDefault();//创建一个post请求HttpPost request = new HttpPost(url);//设置响应头 ( application/octet-stream:二进制流,不知道下载文件类型)request.addHeader("Content-Type", "application/octet-stream");//输入流,获取输入图片的输入流InputStream inputStream = multipartFile.getInputStream();try {//创建一个byte数组,和输入的文件输入流大小一样byte[] byt = new byte[inputStream.available()];//从输入流中读取全部,并将其存储在缓冲区数组byt 中。inputStream.read(byt);//定制提交内容request.setEntity(new ByteArrayEntity(byt, ContentType.create("image/jpg"))); 由客户端执行(发送)请求,执行校验HttpResponse response = httpclient.execute(request);// 从响应模型中获取响应实体HttpEntity entity = response.getEntity();String result = EntityUtils.toString(entity, "UTF-8");// 转成string//打印校验结果System.out.println("result:" + result);} catch (IOException e) {e.printStackTrace();} finally {if(inputStream != null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
至此可以实现校验结果,检验成功与否对比上图。检验图片吗,嗯…,自行获取≖‿≖✧ o‿≖✧(๑•̀ㅂ•́)و✧
4.压缩图片(Thumbnails)
微信这个接口对图片的大小和尺寸有着严格要求,但是不能要求用户自行对图片进行操作符合我程序的要求,所以需要在对图片进行检验之前对其压缩以及达到图片尺寸。使用Thumbnails。
Thumbnails是谷歌的一个图片压缩处理开源库(虽然现在好像已经不再更新了),利用这个库可以容易的对图片进行一些处理,例如压缩图片、变换图片格式之类的。可参考这篇文章java处理图片类库 Thumbnails 学习
1.首先导入maven依赖
<!--压缩图片--><dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency>
2.压缩图片java代码
这里压缩图片是为了对上面的检测代码而编写的,所以选择返回一个输入流,这样可直接对接这两个功能。
在使用Thumbnails过程中发现,Thumbnails对不是jpg格式的图片进行压缩之后,获取其输入流会出现错误,所以在进行压缩之前,要先对图片进行转换,将其他格式的图片变成jpg格式。
经测试,7M左右的图片压缩之后100kb左右,不支持指定大小的压缩,支持指定尺寸大小。
import org.apache.commons.io.FileUtils;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import net.coobird.thumbnailator.Thumbnails;
/*** 压缩图片* @param multipartFile*/public inputStream compressImage(MultipartFile multipartFile){//*************对不是jpg格式的图片转换成jpg格式***************//获取文件名后缀,判断其格式int begin = multipartFile.getOriginalFilename().lastIndexOf(".");int last = multipartFile.getOriginalFilename().length();//获得文件后缀名String houzuiFileName = multipartFile.getOriginalFilename().substring(begin, last);//创建临时文件File tempFile = new File(multipartFile.getOriginalFilename());//写入临时File文件 tempFile,将multipartFile转换成Filetry {//import org.apache.commons.io.FileUtils;FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), tempFile);} catch (IOException e) {e.printStackTrace();}//如果文件不是jpg格式,转换其格式if (!"jpg".equalsIgnoreCase(houzuiFileName)){//ImageUtils是一个工具类,下面给出//将png格式转换成jpg,输出到tempFileImageUtils.convert(multipartFile.getOriginalFilename(), "jpg", tempFile.getAbsolutePath());//测试OK
//*************对不是jpg格式的图片转换成jpg格式***************}try {//压缩图片BufferedImage bufferedImage = Thumbnails.of(tempFile).size(740, 1330)//指定压缩之后的图片尺寸.outputQuality(0.8f)//图片压缩质量.asBufferedImage();ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(bufferedImage, "jpg", os);InputStream inputStream = new ByteArrayInputStream(os.toByteArray());
// System.out.println(inputStream);return inputStream;} catch (IOException e) {e.printStackTrace();}finally {// 会在本地产生临时文件,用完后需要删除if (tempFile.exists()) {tempFile.delete();}}return null;}
5.整合压缩图片和对接代码
/*** 恶意图片过滤* MultipartFile multipartFile, String accessToken* @param multipartFile* @param accessToken* @return*/@ApiOperation(value="校验图片是否含有违法违规内容", notes="校验一张图片是否含有违法违规内容")@PostMapping("checkImg")public void checkImg(MultipartFile multipartFile, String accessToken) throws Exception {//压缩图片InputStream inputStream = compressImage(multipartFile);String url = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=" + accessToken;// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的HttpClient httpclient = HttpClients.createDefault();//创建一个post请求HttpPost request = new HttpPost(url);//设置响应头 ( application/octet-stream:二进制流,不知道下载文件类型)request.addHeader("Content-Type", "application/octet-stream");try {//创建一个byte数组,和输入的文件的大小一样byte[] byt = new byte[inputStream.available()];//从输入流中读取全部,并将其存储在缓冲区数组byt 中。inputStream.read(byt);//定制提交内容request.setEntity(new ByteArrayEntity(byt, ContentType.create("image/jpg"))); 由客户端执行(发送)请求,执行校验HttpResponse response = httpclient.execute(request);// 从响应模型中获取响应实体HttpEntity entity = response.getEntity();String result = EntityUtils.toString(entity, "UTF-8");// 转成string//打印校验结果System.out.println("result:" + result);} catch (IOException e) {e.printStackTrace();} finally {if(inputStream != null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
6.ImageUtils工具类
ImageUtils工具类:
//import Java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.color.ColorSpace;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;import static jdk.nashorn.internal.runtime.regexp.joni.Syntax.Java;/*** 图片处理工具类:<br>* 功能:缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等* @author Administrator*/
public class ImageUtils {/*** 几种常见的图片格式*/public static String IMAGE_TYPE_GIF = "gif";// 图形交换格式public static String IMAGE_TYPE_JPG = "jpg";// 联合照片专家组public static String IMAGE_TYPE_JPEG = "jpeg";// 联合照片专家组public static String IMAGE_TYPE_BMP = "bmp";// 英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式public static String IMAGE_TYPE_PNG = "png";// 可移植网络图形public static String IMAGE_TYPE_PSD = "psd";// Photoshop的专用格式Photoshop/*** 程序入口:用于测试* @param args*/public static void main(String[] args) {// -图像类型转换:ImageUtils.convert("D:/IMG_20180811_222034.png", "jpg", "D:/test.jpg");//测试OK}/*** 图像类型转换:GIF->JPG、GIF->PNG、PNG->JPG、PNG->GIF(X)、BMP->PNG* @param srcImageFile 源图像地址* @param formatName 包含格式非正式名称的 String:如JPG、JPEG、GIF等* @param destImageFile 目标图像地址*/public final static void convert(String srcImageFile, String formatName, String destImageFile) {try {File f = new File(srcImageFile);f.canRead();f.canWrite();BufferedImage src = ImageIO.read(f);ImageIO.write(src, formatName, new File(destImageFile));} catch (Exception e) {e.printStackTrace();}}
}
7.结束语
以上代码都已经经过测试,可实现功能。如果出现的纰漏或者bug还希望各位多多提醒。欢迎━(`∀´)ノ亻!交流。
Java实现微信小程序校验图片是否含有违法违规内容相关推荐
- 最全的java对接微信小程序客服功能实现(包含自动回复文本消息、图片消息,进入人工客服)
java对接微信小程序客服功能实现(包含自动回复文本消息.图片消息,进入人工客服) 第一步:请求校验(确认请求来自微信服务器) 代码如下: @ApiOperation(value = " 微 ...
- java获取微信小程序二维码图片并保存到本地
java获取微信小程序二维码保存到本地并返回图片,下次如果检查到本地有图片,那么就返回本地的图片,不再发起请求,否则重新发起请求并保存到本地,直接看代码吧. 获取access_token的方法可以参考 ...
- 【微信小程序】图片违法违规内容鉴别
微信小程序通过云调用校验一张图片是否含有违法违规内容.官方参考文档 选择图片 wx.chooseImage({count: 6,sizeType: ['compressed'], // 可以指定是原图 ...
- java获取微信小程序二维码
java获取微信小程序二维码 近期正好遇到了,随手记录下 首先获取微信小程序二维码需要小程序的appid 以及secret 然后根据appid和secret去获取小程序的token 即 access_ ...
- 微信小程序实现图片是上传、预览功能
本文实例讲述了微信小程序实现图片上传.删除和预览功能的方法,分享给大家供大家参考,具体如下: 这里主要介绍一下微信小程序的图片上传图片删除和图片预览 1.可以调用相机也可以从本地相册选择 2.本地实现 ...
- 微信小程序中base64转换成图片;uni-app小程序base64转图片;微信小程序base64文件转图片;微信小程序base64图片转图片
将微信小程序的图片转成base64 点击此链接看另一篇 以下是将后端返回的base64转成图片: 方法1:使用微信小程序自带方法 //把base64转换成图片getBase64ImageUrl: (b ...
- php微信小程序多图上传,tp5实现微信小程序多图片上传到服务器功能
最近在做一个教育类的小商城的微信小程序,用到了上传多个图片文件到服务器端,这里做一个讲解,希望对大家有所帮助. 1,小程序端: 在wxml文件中: 删除 点击上传作业 在js文件中: Page({ / ...
- java与微信小程序通讯_java与微信小程序实现websocket长连接
本文实例为大家分享了java与微信小程序实现websocket长连接的具体代码,供大家参考,具体内容如下 背景: 需要在小程序实现地图固定坐标下实时查看消息 java环境 :tomcat7 jdk1. ...
- java后端微信小程序登录与注册
java后端微信小程序登录与注册&微信登录授权 分析: 微信小程序用户表 的字段来源于微信服务器 , 必须想办法去获取到对应的用户信息 找到微信开放平台: 微信开放平台 以下是微信开放平台给出 ...
最新文章
- 微信小程序开发-笔记
- 图画hadoop -- 生态圈
- 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子
- 为什么虚拟助手的前途一片光明
- 【剑指offer】面试题47:礼物的最大价值(Java)
- ireport怎么套打_方向盘套你选对了吗?老司机告诉你该这样做|酷斯特玩车
- 【英语学习】【Level 07】U04 Rest and Relaxation L6 Your home away from home
- 经商失败的人,最可怕的不是失去金钱,而是失去信心
- 将Numpy数组保存为图像
- JavaScript的单线程性质以及定时器的工作原理
- Collection与Arrays
- 使用Android Studio向SVN上传新项目
- php 根据身份证计算年龄
- html5 今日头条视频播放,今日头条app设置自动播放视频的方法
- C语言实现最大值、最小值、均值、标准差、峰值因子、方差和百分位数的计算
- 项目部署三---linux下Nginx安装
- 三星s2 硬刷Android 8,六年老机吃上奥利奥:第三方三星S2安卓8.0刷机包发布
- 3GPP TS 23501-g51 中英文对照 | 5.2.3 Identification and authentication
- [AGC018F] Two Trees
- 模块化多电平变换器(MMC),本模型为三相MMC整流器