所需资源下载链接(资源免费,重在分享)
Tesseract:http://download.csdn.net/detail/chenyangqi/9190667
jai_imageio-1.1-alpha,swingx-1.0:http://download.csdn.net/detail/chenyangqi/9190683
HttpWatchPRofessional:http://download.csdn.net/detail/chenyangqi/9208339
项目简介:
我们学校使用的是校园锐捷客户端上网,本人因长时间不用密码,早已忘记密码,只记得是六位纯数字,又不想去服务中心换密码,就想用Http模拟一下锐捷网页版实现登陆,遍历一下000000-999999的密码。也顺便学习一下。废话不说了,直接进入主题,登陆页面如下中规中矩,用户名密码验证码:
要实现模拟登陆难点有两个,一个是Http请求中Cookie的管理,一个是验证码识别,改篇文章讲解如何识别验证码,至于模拟登陆请看本人后期的博文(博文连接:http://www.cnblogs.com/chenyangqi/p/4906376.html)
1:下载安装Tesseract
本人已提供下载链接(文章开头处提供下载链接),下载好安装即可,压缩包内还提供了汉语语言包的,Tesseract是一款支持汉语识别的OCR,这也是我选择他的原因,至于安装和验证安装是否成功,可自行百度,我就不废话了。
我安装的位置为:D:\Program Files (x86)\Tesseract-OCR,该目录下的结构如下(其中tessdata就是存放语言包的位置)
二:验证码获取
下载HttpWatch(文章开头处提供下载链接),安装,并在IE中使用,对登陆页面进行抓包,找到验证码的URL,如下图(HttpWatch安装使用方法,自行百度);
获得URL后键验证码图片下载到本地。比如:D://verifycode.jpg
下载图片到本地代码如下:
privatestaticvoidgetImage(String name_get, String passWord_get) {
GetMethod get=newGetMethod("你的验证码URL");try{
client.executeMethod(get);
File storeFile=newFile("D:/verifycode.jpg"); //保存在本地的路径
FileOutputStream output=newFileOutputStream(storeFile);
InputStream is=get.getResponseBodyAsStream();
FileOutputStream fos=newFileOutputStream(storeFile);byte[] b =newbyte[1024];while((is.read(b)) != -1) {
fos.write(b);
}
is.close();
fos.close();}catch(IOException e) {
e.printStackTrace();
}
}
三:java实现验证码识别
代码如下,eclipse新建一个java项目,引入jai_imageio-1.1-alpha.jar,swingx-1.0.jar这两个包(文章开头处提供下载链接),导入到项目中。OK,准备写代码吧,共两个类ORC.class ImageIOhelper.class(只需修改一下你安装Tesseract的路径,可直接引入你的项目使用)。
OCR.class代码如下:recognizeText(File imageFile, String imageFormat)方法的参数,就是上一步下载的验证码图片在本地的位置。D://verifycode.jpg
packagecom.cyq.request;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStreamReader;importjava.util.ArrayList;importjava.util.List;importorg.jdesktop.swingx.util.OS;publicclassOCR {privatefinalString LANG_OPTION = "-l";//英文字母小写l,并非数字1privatefinalString EOL = System.getProperty("line.separator");privateString tessPath = "D://Program Files (x86)//Tesseract-OCR";//Tesseract安装路径publicString recognizeText(File imageFile, String imageFormat)throwsException {
File tempImage=ImageIOHelper.createImage(imageFile, imageFormat);
File outputFile=newFile(imageFile.getParentFile(), "output");
StringBuffer strB=newStringBuffer();
List<String> cmd =newArrayList<String>();if(OS.isWindowsXP()) {
cmd.add(tessPath+ "//tesseract");
}elseif(OS.islinux()) {
cmd.add("tesseract");
}else{
cmd.add(tessPath+ "//tesseract");
}
cmd.add("");
cmd.add(outputFile.getName());
ProcessBuilder pb=newProcessBuilder();
pb.directory(imageFile.getParentFile());
cmd.set(1, tempImage.getName());
pb.command(cmd);
pb.redirectErrorStream(true);
Process process=pb.start();intw =process.waitFor();//删除临时正在工作文件tempImage.delete();if(w == 0) {
BufferedReader in=newBufferedReader(newInputStreamReader(newFileInputStream(outputFile.getAbsolutePath() + ".txt"),"UTF-8"));
String str;while((str = in.readLine()) !=null) {
strB.append(str).append(EOL);
}
in.close();
}else{
String msg;switch(w) {case1:
msg= "Errorsaccessing files.There may be spaces in your image's filename.";
break;case29:
msg= "Cannot recongnize the image or its selected region.";
break;case31:
msg= "Unsupported image format.";
break;default:
msg= "Errors occurred.";
}
tempImage.delete();
}newFile(outputFile.getAbsolutePath() + ".txt").delete();returnstrB.toString();
}
}
ImageIOhelper.class代码如下:
packagecom.cyq.request;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;importjava.util.Iterator;importjava.util.Locale;importjavax.imageio.IIOImage;importjavax.imageio.ImageIO;importjavax.imageio.ImageReader;importjavax.imageio.ImageWriteParam;importjavax.imageio.ImageWriter;importjavax.imageio.metadata.IIOMetadata;importjavax.imageio.stream.ImageInputStream;importjavax.imageio.stream.ImageOutputStream;importcom.sun.media.imageio.plugins.tiff.TIFFImageWriteParam;publicclassImageIOHelper {/*** 图片文件转换为tif格式
*
*@paramimageFile
* 文件路径
*@paramimageFormat
* 文件扩展名
*@return*/publicstaticFile createImage(File imageFile, String imageFormat) {
File tempFile=null;try{
Iterator<ImageReader> readers =ImageIO
.getImageReadersByFormatName(imageFormat);
ImageReader reader=readers.next();
ImageInputStream iis=ImageIO.createImageInputStream(imageFile);
reader.setInput(iis);
IIOMetadata streamMetadata=reader.getStreamMetadata();
TIFFImageWriteParam tiffWriteParam=newTIFFImageWriteParam(
Locale.CHINESE);
tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);
Iterator<ImageWriter> writers =ImageIO
.getImageWritersByFormatName("tiff");
ImageWriter writer=writers.next();
BufferedImage bi= reader.read(0);
IIOImage image=newIIOImage(bi,null, reader.getImageMetadata(0));
tempFile=tempImageFile(imageFile);
ImageOutputStream ios=ImageIO.createImageOutputStream(tempFile);
writer.setOutput(ios);
writer.write(streamMetadata, image, tiffWriteParam);
ios.close();
writer.dispose();
reader.dispose();
}catch(IOException e) {
e.printStackTrace();
}returntempFile;
}privatestaticFile tempImageFile(File imageFile) {
String path=imageFile.getPath();
StringBuffer strB=newStringBuffer(path);
strB.insert(path.lastIndexOf('.'), 0);returnnewFile(strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif"));
}
}
Main方法中调用就OK了:
privatestaticString getCode() {
String valCode=null;
String path= "d://verifycode.jpg";try{
valCode=newOCR().recognizeText(newFile(path), "jpg");
System.out.println("验证码为:"+valCode)
}catch(IOException e) {
e.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}returnvalCode;
}
好啦,验证码识别over,至于整个Http登陆的请看我后一篇博文(http://www.cnblogs.com/chenyangqi/p/4906376.html)。
声明:该博文为博主原创,转载请注明出处
本程序模拟仅用于学习,请勿使用该内容从事违法活动和暴力破解活动