【二十一】插件开发——用于验证码识别的 JMeter 插件(上)
目录
一、eclipse开发插件项目
二、lib目录jar包准备
三、src目录代码准备
四、导出为jar包
一、eclipse开发插件项目
(1)eclipse开发插件项目全部目录:
(2)完成插件直接在eclipse运行测试:
二、lib目录jar包准备
点击查看我的另一篇博文:【jmeter】实现验证码登录
三、src目录代码准备
(1)ImageIOHelper类:
主要包含两大部分,一部分就是降噪逻辑,通过创建降噪规则对背景图片像素点进行逐个扫描过滤,加大识别成功率;
另一部分是将图片格式转换为tiff格式以更好地进行识别,代码参考如下:
- package com.test.gss;
- import java.awt.Color;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.IOException;
- import java.util.Iterator;
- import java.util.Locale;
- import javax.imageio.IIOImage;
- import javax.imageio.ImageIO;
- import javax.imageio.ImageReader;
- import javax.imageio.ImageWriteParam;
- import javax.imageio.ImageWriter;
- import javax.imageio.metadata.IIOMetadata;
- import javax.imageio.stream.ImageInputStream;
- import javax.imageio.stream.ImageOutputStream;
- import com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam;
- public class ImageIOHelper{
- //将图片格式转换为tif格式以更好地进行识别
- public static File createImage(File imageFile, String imageFormat) {
- File tempFile = null;
- ImageInputStream iis = null;
- ImageOutputStream ios = null;
- ImageReader reader = null;
- ImageWriter writer = null;
- try {
- Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(imageFormat);
- reader = readers.next();
- iis = ImageIO.createImageInputStream(imageFile);
- reader.setInput(iis);
- IIOMetadata streamMetadata = reader.getStreamMetadata();
- TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.CHINESE);
- tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);
- Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff");
- writer = writers.next();
- BufferedImage bi = removeBackgroud(reader.read(0));
- IIOImage image = new IIOImage(bi,null,reader.getImageMetadata(0));
- tempFile = tempImageFile(imageFile);
- ios = ImageIO.createImageOutputStream(tempFile);
- writer.setOutput(ios);
- writer.write(streamMetadata, image, tiffWriteParam);
- } catch (IOException e) {
- e.printStackTrace();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- if(iis != null){
- try {
- iis.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- if(ios != null){
- try {
- ios.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- if(writer != null){
- writer.dispose();
- }
- if(reader != null){
- reader.dispose();
- }
- }
- return tempFile;
- }
- private static File tempImageFile(File imageFile) {
- String path = imageFile.getPath();
- StringBuffer strB = new StringBuffer(path);
- return new File(strB.toString().replaceFirst("jpg", "tif"));
- }
- //给图片降噪,建立如下降噪规则和方法,提高识别度
- public static int isFilter(int colorInt) {
- Color color = new Color(colorInt);
- if ((color.getRed() > 85 && color.getRed() < 255)
- && (color.getGreen() > 85 && color.getGreen() < 255)
- && (color.getBlue() > 85 && color.getBlue() < 255)) {
- return 1;
- }
- return 0;
- }
- public static BufferedImage removeBackgroud(BufferedImage img)
- throws Exception {
- int width = img.getWidth();
- int height = img.getHeight();
- for (int x = 0; x < width; ++x) {
- for (int y = 0; y < height; ++y) {
- if (isFilter(img.getRGB(x, y)) == 1) {
- img.setRGB(x, y, Color.WHITE.getRGB());
- }
- }
- }
- return img;
- }
- }
(2)OCR类:
通过Process调用已经安装的Tesseract程序,调用命令基本形式为tesseract xxx.tif 1 -l eng,参考如下代码:
- package com.test.gss;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.util.ArrayList;
- import java.util.List;
- public class OCR {
- private final String LANG_OPTION = "-l";
- private final String EOL = System.getProperty("line.separator");
- //第三方图形图像识别工具tesseract-OCR的安装目录
- private String tessPath = "G://Tesseract-ocr//tesserract//Tesseract-ORC//Tesseract-OCR";
- public String recognizeText(File imageFile,String imageFormat) {
- File tempImage = ImageIOHelper.createImage(imageFile,imageFormat);
- File outputFile = new File(imageFile.getParentFile(),"output" + imageFile.getName());
- StringBuffer sb = new StringBuffer();
- List<String> cmd = new ArrayList<String>();
- cmd.add(tessPath+"//tesseract");
- cmd.add("");
- cmd.add(outputFile.getName());
- cmd.add(LANG_OPTION);
- cmd.add("eng");
- ProcessBuilder pb = new ProcessBuilder();
- pb.directory(imageFile.getParentFile());
- cmd.set(1, tempImage.getName());
- pb.command(cmd);
- pb.redirectErrorStream(true);
- Process process = null;
- BufferedReader in = null;
- int wait;
- try {
- process = pb.start();
- //通过Process调用已经安装的Tesseract程序,调用命令基本形式为:tesseract xxx.tif 1 -l eng
- wait = process.waitFor();
- if(wait == 0){
- in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile.getAbsolutePath()+".txt"),"UTF-8"));
- String str;
- while((str = in.readLine())!=null){
- sb.append(str).append(EOL);
- }
- in.close();
- }else{
- tempImage.delete();
- }
- new File(outputFile.getAbsolutePath()+".txt").delete();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- if(in != null){
- try {
- in.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- tempImage.delete();
- return sb.toString();
- }
- }
(3)VcodeExtractor类:
继承AbstractScopedTestElement抽象类,实现PostProcessor接口的process方法,来处理利用OCR读取验证码信息的逻辑控制,参考代码如下:
- package com.test.gss;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.Serializable;
- import org.apache.jmeter.processor.PostProcessor;
- import org.apache.jmeter.samplers.SampleResult;
- import org.apache.jmeter.testelement.AbstractScopedTestElement;
- import org.apache.jmeter.threads.JMeterContext;
- import org.apache.jmeter.threads.JMeterVariables;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class VcodeExtractor extends AbstractScopedTestElement implements PostProcessor, Serializable{
- private static final long serialVersionUID = 1L;
- private static final Logger log = LoggerFactory.getLogger(VcodeExtractor.class);
- @Override
- public void process() {
- // TODO Auto-generated method stub
- JMeterContext context = getThreadContext();
- SampleResult previousResult = context.getPreviousResult();
- if (previousResult == null) {
- return;
- }
- log.debug("VcodeExtractor processing result");
- String status = previousResult.getResponseCode();
- int id = context.getThreadNum();
- //String imageName = id + ".jpg";
- String path = "E://" + id + ".jpg";
- if(status.equals("200")){
- byte[] buffer = previousResult.getResponseData();
- FileOutputStream out = null;
- File file = null;
- try {
- file = new File(path);
- out = new FileOutputStream(file);
- out.write(buffer);
- out.flush();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- if(out != null){
- try {
- out.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- try {
- String vcode = new OCR().recognizeText(file, "jpeg");
- vcode = vcode.replace(" ", "").trim();
- JMeterVariables var = context.getVariables();
- var.put("vcode", vcode);
- var.put("vuser", String.valueOf(id));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
(4)VcodeExtractorGUI类:
单纯实现一个可视化的界面用于在测试计划Tree中进行操作,参照代码如下:
- package com.test.gss;
- import org.apache.jmeter.processor.gui.AbstractPostProcessorGui;
- import org.apache.jmeter.testelement.TestElement;
- public class VcodeExtractorGUI extends AbstractPostProcessorGui{
- private static final long serialVersionUID = 1L;
- @Override
- public TestElement createTestElement() {
- // TODO Auto-generated method stub
- VcodeExtractor extractor = new VcodeExtractor();
- modifyTestElement(extractor);
- return extractor;
- }
- @Override
- public String getLabelResource() {
- // TODO Auto-generated method stub
- return this.getClass().getName();
- }
- @Override
- public String getStaticLabel() {
- //设置显示名称
- // TODO Auto-generated method stub
- return "VcodeExtractor";
- }
- @Override
- public void modifyTestElement(TestElement extractor) {
- // TODO Auto-generated method stub
- super.configureTestElement(extractor);
- }
- }
(5)TestOCR类:
方便设置main程序启动入口:
- package com.test.gss;
- import java.io.File;
- public class TestOCR {
- public static void main(String[] args) {
- String path = "E://100.jpg";
- System.out.println("ORC Test Begin......");
- try {
- String valCode = new OCR().recognizeText(new File(path), "jpeg");
- System.out.println(valCode);
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println("ORC Test End......");
- }
- }
四、导出为jar包
五、插件下载
目前我开发好的插件,主要封装以上代码,但是目前不能直接使用,后期我会再研究优化,如需上面封装的代码,可到我的资源下载:点击前往下载
【二十一】插件开发——用于验证码识别的 JMeter 插件(上)相关推荐
- tensorflow精进之路(二十一)——使用slim模型对图像识别与检测(上)(Inception_ResNet_v2模型)
1.概述 上一讲,我们使用了slim训练了自己的数据,主要用于分类任务.这一讲,我们还是继续学习slim库,用它来对图像进行识别和检测. 2.下载Inception_ResNet_v2模型 第十六讲中 ...
- 中介者模式 调停者 Mediator 行为型 设计模式(二十一)
中介者模式(Mediator) 调度.调停 意图 用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散 而且可以独立地改变它们之间的交互. 中介者模式又 ...
- 运动控制器编程_快速入门 | 篇二十一:运动控制器ZHMI组态编程简介一
点击上方"正运动小助手",随时关注新动态! 运动控制器ZHMI组态编程简介一 今天我们来学习一下,运动控制器的ZHMI组态编程简介.本文主要从产品概述.控制器连接触摸屏使用.HM ...
- SQL Server数据库开发的二十一条军规
如果你正在负责一个基于SQL Server的项目,或者你刚刚接触SQL Server,你都有可能要面临一些数据库性能的问题,这篇文章会为你提供一些有用的指导(其中大多数也可以用于其它的DBMS). 在 ...
- 线程本地存储器——Windows核心编程学习手札之二十一
线程本地存储器 --Windows核心编程学习手札之二十一 C/C++运行期库使用线程本地存储器,运行期库是在多线程应用程序出现前设计的,因此运行期库里的大多数函数是用于单线程应用程序的.函数strt ...
- OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十
OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...
- python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0. zfill()方法语法: ...
- JavaScript 编程精解 中文第三版 二十一、项目:技能分享网站
二十一.项目:技能分享网站 原文:Project: Skill-Sharing Website 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了<JavaScri ...
- python数据挖掘课程】二十一.朴素贝叶斯分类器详解及中文文本舆情分析
#2018-04-06 13:52:30 April Friday the 14 week, the 096 day SZ SSMR python数据挖掘课程]二十一.朴素贝叶斯分类器详解及中文文本舆 ...
最新文章
- 《防患未然:实施情报先导的信息安全方法与实践》——3.3 攻击剖析
- 【HDU】1305 Immediate Decodability(字典树:结构体数组,二维数组,链表/指针)
- 对C#面向对象三大特性的一点总结
- 打印多项式的那些坑(洛谷P1067题题解,Java语言描述)
- 01-windows下 Rserve安装
- Cookie Theft and Session Hijacking
- numpy 矩阵拼接_Numpy学习笔记(下篇)
- MySQL图书借阅系统项目数据库建库表语句(组合主键、外键设置)
- 伺服驱动器--增益调整
- Euraka的搭建和使用
- excel中的数据怎么导入matlab中,将excel中的数据导入matlab教程的方法步骤
- Sketch使用教程(四)
- Mac 输入法小技巧
- 微信大数据挑战赛方案总结
- python中for循环缩进_跟小白学Python数据分析——For循环
- c语言转fpga原理,要想玩转FPGA,就必须理解FPGA内部的工作原理-可编程逻辑-与非网...
- 什么是MES生产管理和生产制造执行系统?有哪些系统模块组成?
- 标准正态分布函数表的程序实现
- 维基解密:CIA早就可以轻易入侵苹果手机和电脑
- CF533A——题解