所需資源下載鏈接(資源免費,重在分享)
Tesseract:http://download.csdn.net/detail/chenyangqi/9190667
jai_imageio-1.1-alpha,swingx-1.0:http://download.csdn.net/detail/chenyangqi/9190683
HttpWatch Professional:http://download.csdn.net/detail/chenyangqi/9208339
HttpClient.jar codec.jar logging.jar:http://download.csdn.net/detail/chenyangqi/9208315
簡介:
模擬如下登陸頁面,需要大家自行掌握HttpWatch使用方法
OCR-Tesseract如何識別驗證碼可參考我的另一篇博客http://www.cnblogs.com/chenyangqi/p/4906282.html
一:
使用eclipse建一個項目,引入OCR-Tesseract 和HttpClient所要使用的幾個jar包(jar包在文章開頭已提供了下載鏈接)
項目思路:
1:第一次Http請求驗證碼URL(一般是get請求)下載驗證碼到本地,通過OCR-Tesseract識別,返回驗證碼,並保存Cookie
一下是HttpWatch中驗證碼URL的請求抓包,只需要使用get方式和URL地址。
2:第二次Http請求登陸URL(一般是post請求)發送HttpWatch中的Postdata一欄中的數據。同步Cookie,並返回Inputstream數據
3:請求成功,匹配返回的InputStream數據,若有匹配則登陸成功。
這就是返回的數據和預期的是否一樣了,返回的數據在HttpWatch里面的Content可看到,對比一下請求成功和失敗的不同,可以使用SubString看有沒有匹配的,或者是正則表達式
二:難點解決
要實現登陸最重要的就是驗證碼識別和Cookie同步的問題了,驗證碼識別在我的另一篇博客已解決http://www.cnblogs.com/chenyangqi/p/4906282.html
所以只剩下Cookie的問題了,之前使用的是HttpConnection老是Cookie不同步,后面換了HttpClient(使用HttpClient需應用HttpClient.jar codec.jar logging.jar三個jar包,可在文章開頭處下載),HttpClient對象可以很好的管理
Cookie和請求頭。所以Cookie的讀取和同步,我們不需要操作,只要保證是同一個HttpClient對象就ok了,所以定義HttpClient為全局變量比較好,也注意避免多線程造成HttpClient對象變化,應為HttpClient對象一變化Cookie也就變了
無法同步Cookie造成登陸失敗。
三:代碼實現:
package com.cyq.request; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Scanner; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; public class RequestMain {static HttpClient client = new HttpClient(); public static void main(String[] args) { Init(); } private static void Init() { getImage("用戶名","密碼"); } private static void getImage(String name_get, String password_get) { GetMethod get = new GetMethod( "驗證碼URL地址"); try { client.executeMethod(get); File storeFile = new File("D:/verifycode.jpg");//驗證碼暫存本地位置 FileOutputStream output = new FileOutputStream(storeFile); InputStream is = get.getResponseBodyAsStream(); FileOutputStream fos = new FileOutputStream(storeFile); byte[] b = new byte[1024]; while ((is.read(b)) != -1) { fos.write(b); } is.close(); fos.close(); String codeVal = getCode(); try { String code = codeVal.substring(0, codeVal.indexOf("\n") - 1); postRequest(name_get, password_get, code); } catch (Exception e) { System.out.println("e" + name_get + "驗證碼錯誤"); } } catch (IOException e) { e.printStackTrace(); } } private static void postRequest(String name_data, String password_data, String code) { PostMethod postMethod = new PostMethod( "登陸時的post請求URL地址"); NameValuePair[] data = { new NameValuePair("act", "add"), new NameValuePair("name", name_data), new NameValuePair("password", password_data), new NameValuePair("verify", code) }; postMethod.setRequestBody(data); try { client.executeMethod(postMethod); String text = postMethod.getResponseBodyAsString(); // 匹配結果集中是否有匹配的字符串 if (text.indexOf("self.location='../../../module/webcontent/web/index_self.jsf") >= 0) { RESULT_DATA.add("用戶名:"+name_data+" 密碼:"+password_data); WriteResultToFile("用戶名:"+name_data+" 密碼:"+password_data); System.out.println("用戶名" + name_data + "成功"); } else { System.out.println("用戶名" + name_data + "失敗"); } } catch (IOException e) { e.printStackTrace(); } } private static String getCode() { String valCode = null; String path = "d://verifycode.jpg"; try { valCode = new OCR().recognizeText(new File(path), "jpg"); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return valCode; } }
好啦,over,。
聲明:該博文為博主原創,轉載請注明出處
本程序模擬僅用於學習,請勿使用該內容從事違法活動和暴力破解活動
