Springboot集成selemium+tess4j+opencv 實現驗證碼識別,去幹擾線,模擬用戶登陸 ( 一 )

最近新入職了一家公司,果真一進去就給了一個很大的坑。模擬用戶登陸XX網站 。這是要玩圖像識別的節奏啊。。。嚇尿了 趕忙度娘一波。html

Selemium

1 :引入 maven

`java

<dependency>
        <groupId>org.sele~~~~niumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.141.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-server</artifactId>
        <version>3.141.0</version>
    </dependency>
    <dependency>~~~~
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-chrome-driver</artifactId>
        <version>2.41.0</version>
    </dependency>`

2 :引入chrome插件 chromedriver.exe

其中chromedriver.exe能夠在網址http://chromedriver.storage.g... 注意版本問題, 查看本地chrom版本並下載對應的chromedriver.exe, 版本對應可在版本明細中的notes.txt頁面查看web

3 :封裝SelemiumUtil工具類

public class SeleniumUtil {

    private static final ChromeOptions chromeOptions = new ChromeOptions();

    static {
        System.setProperty("webdriver.chrome.driver", "src\\main\\resources\\chromedriver.exe");
        Map<String, Object> chromePrefs = CollUtil.newHashMap();
        //禁止彈窗
        chromePrefs.put("profile.default_content_settings.popups", 0);
        //下載地址
//        chromePrefs.put("download.default_directory", "C://xx//");
        //禁止圖片加載
//        chromePrefs.put("profile.managed_default_content_settings.images", 2);
        //userAgent=ie11
        String userAgentIE11="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36";
        chromePrefs.put("profile.general_useragent_override", userAgentIE11);

        HashMap<String, Object> mobileEmulation = new HashMap<String, Object>();
        //用iPhone X 屏幕啓動
//        mobileEmulation.put("deviceName","iPhone X");

        chromeOptions.setExperimentalOption("prefs",chromePrefs);
        chromeOptions.setExperimentalOption("mobileEmulation",mobileEmulation);
        /***********************************如下設置啓動參數******************************************/
        //消除安全校驗
        chromeOptions.addArguments("--allow-running-insecure-content");
        //啓動最大化,防止失去焦點
        chromeOptions.addArguments("--start-maximized");
        //關閉gpu圖片渲染
        chromeOptions.addArguments("--disable-gpu");
    }

    /**
     * 獲取瀏覽器對象直接操做
     * @return
     */
    public static WebDriver build(ChromeOptions chromeOptions) {
        WebDriver dr =  new ChromeDriver(chromeOptions);
        dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        return dr;
    }

    /**
     * 獲取瀏覽器對象直接操做
     * @return
     */
    public static WebDriver build() {
        return SeleniumUtil.build(chromeOptions);
    }

    public static final String SOCIAL_INSURANCE_URL = "自定義須要模擬的網址";

    /**
     * 查詢頁面元素並設置值
     * @param driver
     * @param szsbEnum
     * @param var1
     */
    public static void findAndSave(WebDriver driver,SzsbEnum szsbEnum,CharSequence... var1){
        WebElement element ;
        if ((element = findElement(driver,szsbEnum))!= null) element.sendKeys(var1);
    }

    /**
     * 搜索頁面元素而且點擊
     * @param driver
     * @param szsbEnum
     */
    public static void findAndClick(WebDriver driver,SzsbEnum szsbEnum){
        findElement(driver,szsbEnum).click();
    }

    /**
     * 搜索頁面元素而且點擊
     * @param driver
     * @param szsbEnum
     */
    public static void findAndClick(WebDriver driver,SzsbEnum szsbEnum,ThreadLocal<Map<SeleniumUtil.SzsbEnum,Integer>> threadLocal){
        Integer integer = threadLocal.get().get(szsbEnum);
        if (integer == null){
            findElement(driver,szsbEnum).click();
        }else {
            findElement(driver,szsbEnum,integer).click();
        }
    }

    /**
     * 搜索頁面元素而且點擊
     * @param driver
     * @param szsbEnum
     */
    public static void findAndClick(WebDriver driver,SzsbEnum szsbEnum,int wait){
        findElement(driver,szsbEnum,wait).click();
    }

    /**
     * 查詢單個頁面元素
     * @param driver
     * @param szsbEnum
     * @param wait 等待因子
     * @return
     */
    public static WebElement findElement(WebDriver driver,SzsbEnum szsbEnum,int wait){
        WebElement element = null;
        int a = 0;
        By[] bys = szsbEnum.getBy();
        for (By by : bys) {
            if (a > bys.length*3) break;
            //判斷元素是否可用
            WebElement element1 = null;
            try {
                element1 = driver.findElement(by);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (element1!=null && element1.isDisplayed() && element1.isEnabled()){
                element = element1;
            }else {
                a++;
                try {
                    Thread.sleep(wait*1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        if (element == null) throw new SelemiumNotFoundException("Selenium cannot find element : " + szsbEnum.by,szsbEnum);
        return element;
    }

    /**
     * 查詢單個頁面元素
     * @param driver
     * @param szsbEnum
     * @return
     */
    public static WebElement findElement(WebDriver driver,SzsbEnum szsbEnum){
        return findElement(driver,szsbEnum,1);
    }

    /**
     * 查詢頁面多個頁面元素
     * @param driver
     * @param szsbEnum
     * @return
     */
    public static List<WebElement> findElements(WebDriver driver,SzsbEnum szsbEnum){
        return driver.findElements(szsbEnum.getBy()[0]);
    }

    public enum SzsbEnum{
        /* login */
        USER_NAME_INPUT_SELECT(By.id("userNameInput")),
        LOGIN_YZM_ID(By.id("yzm")),
        USER_PWD_INPUT_SELECT(By.id("userPwdInput")),
        INFO_ALERT(By.className("dw-res-wnd-header-closebtn-ext")),
//        INFO_ALERT(By.id("dw_button_f3e0d7a3_a373_4df1_b1ae_25ee3adad2d3")),
        LOGIN_BUTTON(By.xpath("//div[@id='f_cont']/div[1]/div[1]/div[1]/form/div[6]/div[1]")),


        INDEX_CBDJGL(By.id("returnYwsb('F02000')")),
        INDEX_RYPLCB(By.id("grcbdjgl-p2")),
        INDEX_RYPLTJ(By.id("grcbdjgl-p4")),

        INDEX_STOP_DRBPWJ(By.xpath("//div[contains(string(),'導入報盤文件')]")),
        INDEX_STOP_DRBPWJ_NEXT(By.name("btn_goNext")),

        INDEX_FILEUPLOAD(By.name("fileupload")),
//        INDEX_FORM(By.id("__dw_sform_form_1b997ea4_2600_4c95_bd35_59883bc7514a_form")),
        INDEX_FILEUPLOAD_BTN(By.name("btnUpload")),

        LOGIN_VALIDATA_INPUT(By.id("validatecode1"));
        private By[] by;
        SzsbEnum(By... by){
            this.by = by;
        }
        public By[] getBy(){
            return this.by;
        }
    }
}

Tess4j OCR圖像識別框架集成

1:引入maven

`chrome

<dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>5.1.0</version>
    </dependency>
    <dependency>
        <groupId>net.sourceforge.tess4j</groupId>
        <artifactId>tess4j</artifactId>
        <version>4.3.1</version>
        <exclusions>
            <exclusion>
                <groupId>com.sun.jna</groupId>
                <artifactId>jna</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

`api

2:導入訓練庫

訓練庫下載地址 : https://sourceforge.net/projects/tess4j/files/瀏覽器

下載完以後解壓 將 tessdata 複製到resource目錄下
image.png安全

3:初始化 tess4j

image.png

Opencv 集成

1:下載opencv

下載地址 :https://sourceforge.net/projects/opencvlibrary/files/4.1.1/opencv-4.1.1-vc14_vc15.exe/download
下載完是一個.exe 文件 直接安裝以後會生成一個目錄
image.png
將jar包引入項目
`框架

<dependency>
        <groupId>org.opencv</groupId>
        <artifactId>opencv</artifactId>
        <version>4.1.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/opencv-411.jar</systemPath>
    </dependency>`

還沒完 將剛纔目錄下的 x64 目錄下有個opencv_java411.dll文件 ,放到項目的resource目錄下,而後在項目初始化中引入
`maven

String opencvLib = System.getProperty("user.dir") + "\\src\\main\\resources\\opencv";
    addLibraryDir(opencvLib);
    System.load(opencvLib+"\\opencv_java411.dll");

`
addLibraryDir 代碼也貼一下ide

public void addLibraryDir(String libraryPath) throws IOException {
        try {
            Field field = ClassLoader.class.getDeclaredField("usr_paths");
            field.setAccessible(true);
            String[] paths = (String[]) field.get(null);
            for (int i = 0; i < paths.length; i++) {
                if (libraryPath.equals(paths[i])) {
                    return;
                }
            }

            String[] tmp = new String[paths.length + 1];
            System.arraycopy(paths, 0, tmp, 0, paths.length);
            tmp[paths.length] = libraryPath;
            field.set(null, tmp);
        } catch (IllegalAccessException e) {
            throw new IOException(
                    "Failedto get permissions to set library path");
        } catch (NoSuchFieldException e) {
            throw new IOException(
                    "Failedto get field handle to set library path");
        }
    }

好了,到這邊算是初始化完成。圖像識別的代碼下一章貼一下,否則一章東西太多寫不下。

相關文章
相關標籤/搜索