zoukankan      html  css  js  c++  java
  • 【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 essdata

    3.语言库地址为:https://github.com/tesseract-ocr/tessdata

       将所需要的语言库下载下来,放在F:Program Files (x86)Tesseract-OCR essdata目录下

    4.将tesseract.exe命令保存为bat文件,bat内容为

    @echo off
    tesseract.exe D:yzmyan.png D:yzmresult -l
    exit

    或者

    @echo off
    tesseract.exe D:yzmyan.png D:yzmresult -psm 6
    exit
    //注解:
    //图片路径D:yzmyan.png 生成txt文件存放路径及文件名result
    tesseract.exe D:yzmyan.png D:yzm
    esult -l
    tesseract.exe D:yzmyan.png D:yzmresult -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识别图片验证码成功率太低,正在寻找更好的方法!

  • 相关阅读:
    python3使用django1.11不支持MYSQL-python的解决办法
    abp学习目录
    日常网站整理
    C#使用TransactionScope实现事务代码
    CSS禁止选择
    数据库三种事务
    设计模式总章
    几种排序方法的总结
    将图片压缩成大小格式小的图片
    常用的wsdl地址
  • 原文地址:https://www.cnblogs.com/xiaozhaoboke/p/11144422.html
Copyright © 2011-2022 走看看