java + httpClient + WebDriver 实现验证码获取(爬虫自动登录)

接着上个博客进行的改进,上个博客也是实现自动登录,这个博客是本人做的第二种方式的尝试。

主要是获取访问cookie ,然后放入访问头里,将验证码图片下载本地,然后用tess4j工具进行验证码解析,最后模拟登陆操作就可以正常登陆了。

直接马上代码:

package com.zhaxd.web.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
public class VerificationUtil {

    public static void main(String[] args) throws IOException, TesseractException, InterruptedException {
        // TODO Auto-generated method stub
        System.getProperties().setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
        WebDriver chrome = new ChromeDriver();
        //全局的等待设置,每次执行diver,都会等待2秒
        chrome.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
        //进入项目登录页--登录页地址
        chrome.get("http://10.10.10.163:8080/unityplatform/loginController.do?login");
        
        //初始化httpclient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        // 获得 Cookie
        Set cookies = chrome.manage().getCookies();
        StringBuffer tmpcookies = new StringBuffer();
        for (Cookie c : cookies) {
            tmpcookies.append(c.toString() + ";");
        }
        //访问验证码图片
        HttpPost httpPost = new HttpPost("http://10.10.10.163:8080/unityplatform/randCodeImage?a=" + new Date().getTime());
        //携带cookie
        httpPost.setHeader("cookie",tmpcookies.toString());
        HttpResponse response =  httpClient.execute(httpPost);
        InputStream a = response.getEntity().getContent();
        File targetFile = new File("d:/selenium/tt.jpg");
        OutputStream outStream = new FileOutputStream(targetFile);
        byte[] buffer = new byte[8 * 1024];
        int bytesRead;
        //表示从InputStream中读取度一个数知组的数道据,如果返回-1 则表示数据读版取完成了
        while ((bytesRead = a.read(buffer)) != -1) {
                //生成文件
                outStream.write(buffer, 0, bytesRead);
        }
        outStream.close(); // 关闭输出流
        //tess4j解析验证码图片
        Tesseract tesseract = new Tesseract(); 
        tesseract.setDatapath("D:/Tess4J/tessdata"); 
        String text= tesseract.doOCR(new File("D:/selenium/tt.jpg")); 
        WebElement randCodeInput = chrome.findElement(By.id("randCode"));
        
        WebElement usernameInput = chrome.findElement(By.id("userNameFake"));
        usernameInput.sendKeys("admin");
        WebElement passwordInput = chrome.findElement(By.id("passwordFake"));
        passwordInput.sendKeys("admin");
        
        String replaceAll = text.replaceAll("\r", "").replaceAll("\n", "").replaceAll(" ", "");
        System.out.println("======"+replaceAll + "=====");
        randCodeInput.sendKeys(replaceAll);
        
        Thread.sleep(2000);
        WebElement loginButton = chrome.findElement(By.xpath("//*[@id=\"btnLogin\"]"));
        try {
            loginButton.click();
            Thread.sleep(5000);
            chrome.get("http://10.10.10.163:8080/unityplatform/mutiLangController.do?mutiLang");
            Thread.sleep(3000);
            bb(chrome);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
    }

}

感觉这个清晰度比截取的清晰度要好,可以更准确识别验证码。希望能给大家带来帮助。

 

你可能感兴趣的:(java + httpClient + WebDriver 实现验证码获取(爬虫自动登录))