java模擬有驗證碼的Http登陸


所需資源下載鏈接(資源免費,重在分享)

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,。

聲明:該博文為博主原創,轉載請注明出處

   本程序模擬僅用於學習,請勿使用該內容從事違法活動和暴力破解活動

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM