///先去下载个Asprise-OCR压缩包(那三个.dll文件是要破解版的,正版的.bat文件测试是没问题)
//解压,把那三个.dll文件放到JDK\bin目录下,别整到jre下了
//本地验证码识别测试
File file = new File("D:/imgcode.jpg");
BufferedImage image = ImageIO.read(file);
String s = new OCR().recognizeEverything(image);
System.out.println("\n---- 验证码是: ------- \n" + s);
//网络动态验证码测试,无会话(session)无状态测试
String url_ = "http://127.0.0.1:8080/checkcode/image.jpg?aa="+System.currentTimeMillis();
URL url = new URL(url_);
BufferedImage image =ImageIO.read(url.openStream());
File f = new File("D:/a.jpg");//由于效果不佳才先缓存到硬盘上,也可以直接读取数据流
ImageIO.write(image, "jpg", f);
OCR ocr = new OCR();
String s = ocr.recognizeCharacters(ImageIO.read(f));
System.out.println("\n---- 结果: ------- \n" + s);
/*
先解释一下,无状态会话是识别不了验证码的,因为这不是在浏览器环境下,
主要是没有session、cookie等维持客户端与服务器端的连接状态,所以这里要
用到apache下的一个开源项目httpclient,这个是用来模拟浏览器的,
那么先到apache官网上去下载这个东西,那么就可以进行网络环境识别了,
比如说识别注册时候的验证码
*/
public void register() {
HttpClient client = new HttpClient();//相当于客户端浏览器
client.getHostConfiguration().setHost("某个网站的host", 80);//比如www.oschina.net 80是端口
try {
PostMethod post = new PostMethod("/imgcode.jpg");// 验证码的相对路径
int statusCode = client.executeMethod(post);
post.releaseConnection();//释放连接
if(HttpStatus.SC_OK==statusCode){//状态码200表示请求成功,先发送去请求验证码
InputStream is = post.getResponseBodyAsStream();
BufferedImage image = ImageIO.read(is);
String imgcode = new OCR().recognizeEverything(image);
System.out.println("\n---- 验证码是: ------- \n" + imgcode);
PostMethod post1 = new PostMethod("/register.do?username=sa&password=sa&imgcode="+imgcode);//登陆或注册的提交路径
statusCode = client.executeMethod(post1);
post1.releaseConnection();//释放连接
if(HttpStatus.SC_OK==statusCode){//状态码200表示请求成功,先发送去请求验证码
System.out.println(post1.getResponseBodyAsString());//简单查看一下打印信息有没有成功的信息
}
}
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
开源中国社区的验证码有底纹有可能识别不了(主要是本人没测试),但是像百度、qq那种是可以识别的,99%的论坛是可以识别的(本人已测试过),另外从这方面也可以看出国外的软件是多么强大,做研究的人多,但是国内的人有时候连运用都运用不好,像验证码这种智能识别技术,在美国是有很多社区的,成果很丰富,当然这个东西也可以识别条形码
本文仅供学习交流参考,请读者不要扰乱网络秩序,谢谢合作
楼主吹个什么牛皮啊