1. 程式人生 > >C# 利用 HttpWebRequest 和 HttpWebResponse 模擬登入有驗證碼的網站

C# 利用 HttpWebRequest 和 HttpWebResponse 模擬登入有驗證碼的網站

我們經常會碰到需要程式模擬登入一個網站,那如果網站需要填寫驗證碼的要怎樣模擬登入呢?
這篇文章利用了 HttpWebRequest 和 HttpWebResponse 模擬登入了有驗證碼的網站。

程式設計的介面很簡單,三個TextBox分別輸入使用者名稱、密碼和驗證碼,一個Image控制元件顯示從網站請求到的驗證碼圖片,還有兩個按鈕,一個換驗證碼,一個登入。

寫程式前,先用瀏覽器的開發者工具觀察下登入頁面有什麼請求,我這裡用的是 FireBug,下面兩個圖是在 FireBug 的網路面板中截的。

可以看到開啟登入頁面時有個 GET 請求驗證碼的,在 FireBug 中可以看到:

上面的圖上可以看到這一句: Set-Cookie GUID=c89eabb62d9d4f35b491a8afd371b4ad; path=/

這裡請求的驗證碼頁面儲存了一個Cookie。

然後我們輸入驗證碼,點選“登入”的時候有個 POST 請求,在 FireBug 可以看到:

這裡的重點是這句:CodeStatus=&bkurl=&companyid=&username=test&password=test&Validate=yyxe

從這裡我們可以看到使用者名稱、密碼還有驗證碼提交的方式。

下面大概說下程式的步驟:

1. 請求驗證碼,顯示在程式介面上,並且儲存Cookie。

2. 提交姓名、密碼和驗證碼資料,獲得響應。

我這裡是WPF程式,如果是Winform也類似。

完整程式碼如下:

複製程式碼
        CookieContainer cookies = null;
        string strCookies = string.Empty;

        private void btnChangeValidate_Click(object sender, RoutedEventArgs e)
        {
            GetValidateImage();
        }

        
/// <summary> /// 獲取驗證碼和Cookie /// </summary> private void GetValidateImage() { cookies = new CookieContainer(); string url = "http://******/picturetimestamp.asp"; //驗證碼頁面 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Accept = "*/*"; request.Method = "GET"; request.UserAgent = "Mozilla/5.0"; request.CookieContainer = new CookieContainer(); //暫存到新例項 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); MemoryStream ms = null; using (var stream = response.GetResponseStream()) { Byte[] buffer = new Byte[response.ContentLength]; int offset = 0, actuallyRead = 0; do { actuallyRead = stream.Read(buffer, offset, buffer.Length - offset); offset += actuallyRead; } while (actuallyRead > 0); ms = new MemoryStream(buffer); } response.Close(); cookies = request.CookieContainer; //儲存cookies strCookies = request.CookieContainer.GetCookieHeader(request.RequestUri); //把cookies轉換成字串 BitmapImage bi = new BitmapImage(); bi.BeginInit(); bi.StreamSource = (Stream)ms; bi.EndInit(); imgValidate.Source = bi; } private void btnLogin_Click(object sender, RoutedEventArgs e) { Login(); } /// <summary> /// 登入 /// </summary> /// <returns></returns> private string Login() { HttpWebRequest request = null; string url = "http://******/loginproc.asp"; //登入頁面 request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.Accept = "*/*;"; request.UserAgent = "Mozilla/5.0"; request.ContentType = "application/x-www-form-urlencoded"; request.AllowAutoRedirect = true; request.CookieContainer = cookies; request.KeepAlive = true; string postData = string.Format("username={0}&password={1}&Validate={2}&isautologin=1&Submit=", txtUserName.Text, txtPassword.Text, txtValidate.Text); //這裡按照前面FireBug中查到的POST字串做相應修改。 byte[] postdatabyte = Encoding.UTF8.GetBytes(postData); request.ContentLength = postdatabyte.Length; using (Stream stream = request.GetRequestStream()) { stream.Write(postdatabyte, 0, postdatabyte.Length); } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string strWebData = string.Empty; using (StreamReader reader = new StreamReader(response.GetResponseStream())) { strWebData = reader.ReadToEnd(); } return strWebData; }
複製程式碼

希望可以幫到有需要的人。

原文地址:http://www.cnblogs.com/mib23/p/3913016.html