【java+selenium3】Tesseract-OCR识别图片验证码 (十六)
【java+selenium+Tesseract-OCR(图片识别)+AutoIt(windows窗口识别)】完成自动化图片验证码识别!
一、AutoIt(windows窗口识别)参考:https://www.cnblogs.com/xiaozhaoboke/p/11138548.html
二、Tesseract-OCR(图片识别)
1. 官网下载 tesseract:http://sourceforge.net/projects/tesseract-ocr/
历史版本下载:https://digi.bib.uni-mannheim.de/tesseract/
2.安装tesseract,安装成功需要配置环境变量
PATH:安装目录(C:\Program Files (x86)\Tesseract-OCR)
TESSDATA_PREFIX:C:\Program Files (x86)\Tesseract-OCR\tessdata

3.语言库地址为:https://github.com/tesseract-ocr/tessdata
将所需要的语言库下载下来,放在F:\Program Files (x86)\Tesseract-OCR\tessdata目录下
4.将tesseract.exe命令保存为bat文件,bat内容为
@echo off
tesseract.exe D:\yzm\yan.png D:\yzm\result -l
exit
或者
@echo off
tesseract.exe D:\yzm\yan.png D:\yzm\result -psm 6
exit
//注解:
//图片路径D:\yzm\yan.png 生成txt文件存放路径及文件名result
tesseract.exe D:\yzm\yan.png D:\yzm\result -l
tesseract.exe D:\yzm\yan.png D:\yzm\result -psm 6
5.java调用该bat文件
public static void main(String[] args) {
     String cmd = "cmd /k start D:/yzm/tesseract.bat";
      try {
        Runtime.getRuntime().exec(cmd);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
//知识扩展
cmd命令执行窗口开闭指令 cmd /c dir 是执行完dir命令后关闭命令窗口。 cmd /k dir 是执行完dir命令后不关闭命令窗口。 cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。 cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。
运行成功后,会生成一个result.txt文件,该文件保存了验证码的文本内容
6.java代码执行tesseract.bat文件后读取txt文件返回验证码字符串代码实现,TXT读写详细参考:https://www.cnblogs.com/xiaozhaoboke/p/11177168.html
package cn.xiaobing.util; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader; public class ReadYZM {
/**
* 使用Tesseract-OCR识别图片验证码
*/
public static String read_yzm() {
String cmd = "cmd /c start D:/yzm/tesseract.bat";
try {
Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
e.printStackTrace();
}
try {
//线程阻塞3秒等待tesseract.bat执行完成
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//执行tesseract.bat识别图片后生成result.txt文件中保存识别后验证码
//读取result.txt文件获取验证码
// ReadTxt
String yzmTxt = readTxt("D:/yzm/result.txt");
return yzmTxt;
}
/**传入txt路径读取txt文件
* @param txtPath
* @return 返回读取到的内容
*/
public static String readTxt(String txtPath) {
File file = new File(txtPath);
if(file.isFile() && file.exists()){
try {
FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuffer sb = new StringBuffer();
String text = null;
while((text = bufferedReader.readLine()) != null){
sb.append(text);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
}
7.web自动化实战演示
package cn.xiaobing.cases; import java.io.File;
import java.io.IOException; import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test; import cn.xiaobing.util.CreateElementScreenshot;
import cn.xiaobing.util.ReadYZM; public class TestCase01 extends BaseCase {
@Test
public void test() throws InterruptedException {
driver.get("http://sh.ipyy.com:8888/logins.html");
WebElement element = driver.findElement(By.id("yzmimg"));
File img = CreateElementScreenshot.captureElement(element);
try {
//调用FileUtils工具类,复制img图片,new File保存至新的路径下
FileUtils.copyFile(img, new File("D:/yzm/yzm.png"));
Thread.sleep(3000);
//使用Tesseract-OCR识别图片验证码
String str = ReadYZM.read_yzm();
driver.findElement(By.id("code")).sendKeys(str);
Thread.sleep(3000);
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码执行验证码自动输入展示:

8.总结:使用Tesseract-OCR识别图片验证码成功率太低,正在寻找更好的方法!
【java+selenium3】Tesseract-OCR识别图片验证码 (十六)的更多相关文章
- 【转】Python OCR识别图片验证码
		
转载自:博客 对于某些网站登录的时候,往往需要输入验证码才能实现登录.如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据.以下介绍一种比较折中的方法,也是比较可行的方法: 实现思想: 1.通过截 ...
 - python 识别图片验证码报IOError
		
说一下困扰了我一周的问题:识别图片验证码 本来我按照安装步骤(http://www.cnblogs.com/yeayee/p/4955506.html?utm_source=tuicool&u ...
 - Atitit java 二维码识别 图片识别
		
Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...
 - [Java] 识别图片验证码
		
现在大多数网站都采用了验证码来防止暴力破解或恶意提交.但验证码真的就很安全吗?真的就不能被机器识别?? 我先讲讲我是怎么实现站外提交留言到一个网站的程序. 这个网站的留言版大致如下: 我一看这种简单的 ...
 - python下以api形式调用tesseract识别图片验证码
		
一.背景 之前在博文中介绍在python中如何调用tesseract ocr引擎,当时主要介绍了shell模式,shell模式需要安装tesseract程序,并且效率相对略低. 今天介绍api形式的调 ...
 - python爬虫20 | 小帅b教你如何使用python识别图片验证码
		
当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 ...
 - 使用burp插件captcha-killer识别图片验证码
		
0x01 开发背景 说起对存在验证码的登录表单进行爆破,大部分人都会想到PKav HTTP Fuzzer,这款工具在前些年确实给我们带来了不少便利.反观burp一直没有一个高度自定义通杀大部分图片验证 ...
 - Onenote实现OCR识别图片
		
OCR识别推荐两个软件: 1. Tesseract:一个开源的,由谷歌维护的OCR软件. 2. Onenote:微软Office附带或者可以自己独立安装. 3. O ...
 - 使用Tesseract OCR识别验证码
		
1.下载Tessrac OCR,默认安装 2.把验证码code.jpg图片放在D盘 3.打开cmd,进入D盘,输入:tesseract code.jpg result 4.进入D盘,生成了resul ...
 
随机推荐
- Jmeter系列(6)- 分析源码,创建登录、浏览商品接口请求
			
前言简介 接口的压力测试有个二八原则:线上80%的用户量在一天24小时20%(即4.8个小时)的时间里可以平稳运行,这个接口就算是通过压力测试了 源码分析 登录 浏览商品 创建请求 登录 浏览菜单 C ...
 - JMeter多个线程组的使用说明
			
Run Thread Groups consecutively (i.e one at a time),即独立运行每个线程组(例如在一个组运行结束后启动下一个) https://help.aliyun ...
 - mysql where in 数组解决小tips
			
由于sql语法要求,不可在in后面直接连数组,若数组形式下,则需要转换成逗号隔开的字符串 <?php$arr = array(1,2,3,4,5);$arr_string= join(',', ...
 - 羽夏逆向破解日记簿——RunAsDate的实现原理分析
			
前言 RunAsDate是一个小工具,允许您在指定的日期和时间运行程序,不过有人用它来破解有时间限制了.此实用程序不会更改计算机的当前系统日期和时间,但只会将指定的日期/时间注入所需的应用程序.该 ...
 - YbtOJ#893-带权的图【高斯消元,结论】
			
正题 题目链接:https://www.ybtoj.com.cn/problem/893 题目大意 给出一张\(n\)个点\(m\)条边的无向联通图,每条边正反向各有\(A,B,C\)三种边权. 保证 ...
 - p3c 插件,是怎么检查出你那屎山的代码?
			
作者:小傅哥 博客:https://bugstack.cn 原文:https://mp.weixin.qq.com/s/RwzprbY2AhdgslY8tbVL-A 一.前言 你会对你用到都技术,好奇 ...
 - 设置 SSH 命令行空闲保持会话
			
楔子 使用 Mac 或 Linux 原生的命令行 ssh user@ip 方式连接 Linux 闲时会自动断开终端卡死. 为解决这个问题,查了到篇博客翻译下关键步骤记录下来.解决方式可以分服务端设置和 ...
 - VS运行时 /MD、/MDd 和 /MT、/MTd之间的区别
			
程序运行时出现问题,选择的是Release,win64位的模式,并且已经看到了宏定义NDEBUG,但是程序依然进入上面的部分 解决方案是将属性->C/C++->代码生成器->运行库里 ...
 - CSS常见的5种垂直水平居中(面试够用)
			
方法一 (flex) <div id='box'> <div class='child'></div> </div> #box{ width:200px ...
 - Go语言核心36讲(Go语言基础知识六)--学习笔记
			
06 | 程序实体的那些事儿 (下) 在上一篇文章,我们一直都在围绕着可重名变量,也就是不同代码块中的重名变量,进行了讨论.还记得吗? 最后我强调,如果可重名变量的类型不同,那么就需要引起我们的特别关 ...