【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识别图片验证码 (十六)的更多相关文章

  1. 【转】Python OCR识别图片验证码

    转载自:博客 对于某些网站登录的时候,往往需要输入验证码才能实现登录.如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据.以下介绍一种比较折中的方法,也是比较可行的方法: 实现思想: 1.通过截 ...

  2. python 识别图片验证码报IOError

    说一下困扰了我一周的问题:识别图片验证码 本来我按照安装步骤(http://www.cnblogs.com/yeayee/p/4955506.html?utm_source=tuicool&u ...

  3. Atitit java 二维码识别 图片识别

    Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...

  4. [Java] 识别图片验证码

    现在大多数网站都采用了验证码来防止暴力破解或恶意提交.但验证码真的就很安全吗?真的就不能被机器识别?? 我先讲讲我是怎么实现站外提交留言到一个网站的程序. 这个网站的留言版大致如下: 我一看这种简单的 ...

  5. python下以api形式调用tesseract识别图片验证码

    一.背景 之前在博文中介绍在python中如何调用tesseract ocr引擎,当时主要介绍了shell模式,shell模式需要安装tesseract程序,并且效率相对略低. 今天介绍api形式的调 ...

  6. python爬虫20 | 小帅b教你如何使用python识别图片验证码

    当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 ...

  7. 使用burp插件captcha-killer识别图片验证码

    0x01 开发背景 说起对存在验证码的登录表单进行爆破,大部分人都会想到PKav HTTP Fuzzer,这款工具在前些年确实给我们带来了不少便利.反观burp一直没有一个高度自定义通杀大部分图片验证 ...

  8. Onenote实现OCR识别图片

    OCR识别推荐两个软件: 1.       Tesseract:一个开源的,由谷歌维护的OCR软件. 2.       Onenote:微软Office附带或者可以自己独立安装. 3.       O ...

  9. 使用Tesseract OCR识别验证码

    1.下载Tessrac OCR,默认安装 2.把验证码code.jpg图片放在D盘 3.打开cmd,进入D盘,输入:tesseract  code.jpg result 4.进入D盘,生成了resul ...

随机推荐

  1. js模块化开发 AMD CMD Commonjs

    在es6全面实行开来之前  js实现模块开发方案有: 1.AMD 异步模块开发定义  依赖前置,requireJs应用了这一规范 require([module], callback); 加载完后回调 ...

  2. 『Python』面向对象(一)

    类和对象 类(class)是用来描述具有相同属性(attribute)和方法(method)的对象的集合,对象(object)是类(class)的具体实例.比如学生都有名字和分数,他们有着共同的属性. ...

  3. CF235C-Cyclical Quest【SAM】

    正题 题目链接:https://www.luogu.com.cn/problem/CF235C 题目大意 一个文本串\(s\).询问\(n\)个匹配的本质不同的循环同构在文本串中出现了几次. 解题思路 ...

  4. 从零开始部署 Yapi(Windows+Nginx)

    一.环境准备及安装 本文中是以本地 Windows 作为安装环境,Nginx 做反向代理,亲测验证可用. Yapi 运行需要的环境: Nodejs,MongoDB 安装包都在文档末尾处 1.1 安装 ...

  5. 03 依赖注入--01控制反转、IoC模式

    控制反转Inversion of Control DI和IoC几乎都是成对出现的,我们在理解依赖注入之前首先要弄明白什么是IoC,也就是控制反转,体现的就是控制权的转移,即控制权原来在A中,现在需要B ...

  6. Maven----将手动下载的jar包以命令行的方式安装到本地MavenRepository中

    1.情景再现:准备实现SprintBoot的热部署功能,因没有对应jar时,在Eclipse中mvn install 会报错: 报错信息: [INFO] --- spring-boot-maven-p ...

  7. 看动画学算法之:doublyLinkedList

    目录 简介 doublyLinkedList的构建 doublyLinkedList的操作 头部插入 尾部插入 插入给定的位置 删除指定位置的节点 简介 今天我们来学习一下复杂一点的LinkedLis ...

  8. 一、Ansible基础之入门篇

    目录 1. Ansible基础 1.1 介绍 1.2 工作原理 1.3 如何安装 1.3.1 先决条件 1.3.2 安装Ansible 1.4 管理节点与被管理节点建立SSH信任关系 1.5 快速入门 ...

  9. ubuntu Nginx+tomcat 部署web项目

    最近学习了一下java web方面的知识,最后终于把项目部署到了阿里云服务器上,还是遇到了一些难点,记录总结一下 首先就是网上资料中,jdk都比较老了,最新的jdk14,没有了jre,这样导致了tom ...

  10. MySQL where子句的使用

    MySQL WHERE 子句 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据. 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中. 语法 以下是 ...