java识别验证码

所需资源下载链接(资源免费,重在分享)

Tesseract:http://download.csdn.net/detail/chenyangqi/9190667

jai_imageio-1.1-alpha,swingx-1.0:http://download.csdn.net/detail/chenyangqi/9190683

HttpWatch Professional: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

下载图片到本地代码如下:

private static void getImage(String name_get, String password_get) {
        GetMethod get = new GetMethod(
                "你的验证码URL");
        try {
            client.executeMethod(get);
            File storeFile = new File("D:/verifycode.jpg");  //保存在本地的路径
            FileOutputStream output = new FileOutputStream(storeFile);
            InputStream is = get.getResponseBodyAsStream();
            FileOutputStream fos = new FileOutputStream(storeFile);
            byte[] b = new byte[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

package com.cyq.request;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.jdesktop.swingx.util.OS;

public class OCR {
    private final String LANG_OPTION = "-l"; // 英文字母小写l,并非数字1
    private final String EOL = System.getProperty("line.separator");
    private String tessPath = "D://Program Files (x86)//Tesseract-OCR";//Tesseract安装路径

    public String recognizeText(File imageFile, String imageFormat)
            throws Exception {
        File tempImage = ImageIOHelper.createImage(imageFile, imageFormat);
        File outputFile = new File(imageFile.getParentFile(), "output");
        StringBuffer strB = new StringBuffer();
        List<String> cmd = new ArrayList<String>();
        if (OS.isWindowsXP()) {
            cmd.add(tessPath + "//tesseract");
        } else if (OS.isLinux()) {
            cmd.add("tesseract");
        } else {
            cmd.add(tessPath + "//tesseract");
        }
        cmd.add("");
        cmd.add(outputFile.getName());

        ProcessBuilder pb = new ProcessBuilder();
        pb.directory(imageFile.getParentFile());

        cmd.set(1, tempImage.getName());
        pb.command(cmd);
        pb.redirectErrorStream(true);

        Process process = pb.start();
        int w = process.waitFor();

        // 删除临时正在工作文件
        tempImage.delete();

        if (w == 0) {
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    new FileInputStream(outputFile.getAbsolutePath() + ".txt"),
                    "UTF-8"));

            String str;
            while ((str = in.readLine()) != null) {
                strB.append(str).append(EOL);
            }
            in.close();
        } else {
            String msg;
            switch (w) {
            case 1:
                msg = "Errors accessing files.There may be spaces in your image‘s filename.";
                break;
            case 29:
                msg = "Cannot recongnize the image or its selected region.";
                break;
            case 31:
                msg = "Unsupported image format.";
                break;
            default:
                msg = "Errors occurred.";
            }
            tempImage.delete();
        }
        new File(outputFile.getAbsolutePath() + ".txt").delete();
        return strB.toString();
    }
}

ImageIOhelper.class代码如下:

package com.cyq.request;

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格式
     *
     * @param imageFile
     *            文件路径
     * @param imageFormat
     *            文件扩展名
     * @return
     */
    public static File 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 = new TIFFImageWriteParam(
                    Locale.CHINESE);
            tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);

            Iterator<ImageWriter> writers = ImageIO
                    .getImageWritersByFormatName("tiff");
            ImageWriter writer = writers.next();

            BufferedImage bi = reader.read(0);
            IIOImage image = new IIOImage(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();
        }
        return tempFile;
    }

    private static File tempImageFile(File imageFile) {
        String path = imageFile.getPath();
        StringBuffer strB = new StringBuffer(path);
        strB.insert(path.lastIndexOf(‘.‘), 0);
        return new File(strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif"));
    }

}

Main方法中调用就OK了:

  

private static String getCode() {
        String valCode = null;
        String path = "d://verifycode.jpg";
        try {
            valCode = new OCR().recognizeText(new File(path), "jpg");       System.out.println("验证码为:"+valCode)
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return valCode;
    }

好啦,验证码识别over,至于整个Http登陆的请看我后一篇博文(http://www.cnblogs.com/chenyangqi/p/4906376.html)。

声明:该博文为博主原创,转载请注明出处

   本程序模拟仅用于学习,请勿使用该内容从事违法活动和暴力破解活动

时间: 2024-10-03 14:46:51

java识别验证码的相关文章

java识别简单的验证码

1.老规矩,先上图 要破解类似这样的验证码: 拆分后结果: 然后去匹配,得到结果. 2.拆分图片 拿到图片后,首先把图片中我们需要的部分截取出来. 具体的做法是,创建一个的和图片像素相同的一个代表权重的二维数组,遍历图片的每个像素点,如果接近白色,就标记为1,否则标记为0: 然后遍历这个二维数据,如果一个竖排都1,说明是空白列,直到第一次遇到不全为1一列,记住列的下标作为起始值,再次遇到全为1的,记住下标作为结束值,然后从起始列到结束列截取图片,依次类推. 1 //分割图片 2 private

Java 如何使用 OCR 技术识别验证码实现自动化登陆

如论实施敏捷的团队,或者实施 DevOps 的团队,通过自动化测试提高测试效率和软件质量都是其共同的选择.UI 自动化测试是自动化化测试当中的重要环节,在 UI 自动化测试中验证码识别一直是令自动化测试人员头疼的问题.今年来随着 OCR 技术.人工智能计算机视觉(AI Computer Vision)技术的成熟与使用大大提高了验证码的识别成功率.从而使得自动识别验证码自动化登陆目标系统成为可能. 本 Chat 主要内容包括: OCR 技术与人工智能计算机视觉(AI Computer Vision

C#识别验证码技术-Tesseract

相信大家在开发一些程序会有识别图片上文字(即所谓的OCR)的需求,比如识别车牌.识别图片格式的商品价格.识别图片格式的邮箱地址等等,当然需求最多的还是识别验证码.如果要完成这些OCR的工作,需要你掌握图像处理.图像识别的知识,需要用到图形形态学.傅里叶变换.矩阵变换.贝叶斯决策等很多复杂的理论,这让绝大部分人都会望而却步. Tesseract这个开源项目的出现让我们普通人也可以涉足OCR的开发.Tesseract可以从图片中识别出文字内容,但不要以为Tesseract可以智能的识别出各种奇形怪状

JAVA代码生成验证码

验证码的作用: 因为你的WEB站有时会碰到客户机恶意攻击,其中一种很常见的攻击手段就是身份欺骗_它通过在客户端脚本写入一些代码,然后利用其,客户机在网站,论坛反复登陆,或者攻击者创建一个HTML窗体,其窗体如果包含了你注册窗体或发帖窗体等相同的字段,然后利用"http-post"传输数据到服务器,服务器会执行相应的创建帐户,提交垃圾数据等操作,如果服务器本身不能有效验证并拒绝此非法操作,它会很严重耗费其系统资源,降低网站性能甚至使程序崩溃.而现在流行的判断访问WEB程序是合法用户还是恶

Java编写验证码

Java后台代码(CheckCodeServlet.java) package web; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.

java登录验证码

一.创建web项目 使用简单servlet来演示java验证码图片生成,servlet简单使用参考http://www.cnblogs.com/ywlaker/p/6038676.html 二.生成验证码 创建VcodeObject.java,存储验证码与图片 package com.demo.vcode; import java.io.InputStream; public class VcodeObject { private String code; private InputStream

在VS2010下编译和使用tesseract_ocr识别验证码

对于自动识别验证码,使用trsseract是个不错的选择,有兴趣的的朋友可以试试. 编译tesseract 官网提供了vs2008的编译说明和工程,但在vs2010下的编译时基本相同的,因此我使用的方法就是把vs2008工程转换为vs2010工程, 同时把编译过程中遇到的问题以及解决方法和大家分享一下,希望对正准备使用trsseract库的朋友有所帮助. 下载代码 google code下载一下源代码,并建立build目录. tesseract-ocr-3.02.02.tar.gz   tess

java生成验证码

一:需求分析 使用java生成验证码: 1:生成画布,画好背景图 2:画随机数 3:画干扰线 4:将内存中的图片保存到硬盘上 二:代码如下 1 /** 2 * 3 */ 4 package com.hlcui.io; 5 6 import java.awt.Color; 7 import java.awt.Font; 8 import java.awt.Graphics; 9 import java.awt.image.BufferedImage; 10 import java.io.File;

工作笔记5.JAVA图片验证码

本文主要内容为:利用JAVA图片制作验证码. 设计思路: 1.拷贝AuthImageServlet.class图片验证码 2.配置web.xml 3.JSP中,调用封装好的AuthImageServlet,实现载入验证码的功能. 4.取出存放在Session中的验证码.在Action中推断验证码的正确性 相比較上一篇博客<工作笔记5.JAVA文本框验证码>而言,图片验证码添加了安全性. 在Action中,通过取出Session中的验证码与输入的验证码是否匹配进行推断. 步骤: 1.拷贝Auth