【java+selenium3】Tesseract-OCR识别图片验证码 (十六)
阅读原文时间:2023年07月09日阅读:2

【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识别图片验证码成功率太低,正在寻找更好的方法!

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章