[ 转]c# 使用 HttpWebRequest模拟登陆(附带验证码)

本文转自:http://blog.csdn.net/vip__888/article/details/5646260

在C#中,可以使用HttpWebRequest进行相关的模拟登陆,登陆后进行相关的操作,比如抓取数据,页面分析,制作相关登陆助手等等。

先说下流程

1.使用httpwebrequest先进入你要登录的网站,获取cookie

2.使用第一步获取的cookie到验证码的网页将验证码下载下来。

3.使用Post数据 发送至网站。如果有cookie则继续保存。

4.使用第三步的cookie登陆相关网页操作。

 

获取相关数据可以使用抓包工具进行抓取,如httpwatch。(网上下载的好多都有病毒,下载的时候注意点)

1。

  1. /// <summary>   
  2. /// 通过get方式请求页面,传递一个实例化的cookieContainer   
  3. /// </summary>   
  4. /// <param name="postUrl"></param>   
  5. /// <param name="cookie"></param>   
  6. /// <returns></returns>   
  7. public static ArrayList GetHtmlData(string postUrl, CookieContainer cookie)  
  8. {  
  9.     HttpWebRequest request;  
  10.     HttpWebResponse response;  
  11.     ArrayList list = new ArrayList();  
  12.     request = WebRequest.Create(postUrl) as HttpWebRequest;  
  13.     request.Method = "GET";  
  14.     request.UserAgent = "Mozilla/4.0";  
  15.     request.CookieContainer = cookie;  
  16.     request.KeepAlive = true;  
  17.   
  18.     request.CookieContainer = cookie;  
  19.     try  
  20.     {  
  21.         //获取服务器返回的资源   
  22.         using (response = (HttpWebResponse)request.GetResponse())  
  23.         {  
  24.             using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default))  
  25.             {  
  26.                 cookie.Add(response.Cookies);  
  27.                 //保存Cookies   
  28.                 list.Add(cookie);  
  29.                 list.Add(reader.ReadToEnd());  
  30.                 list.Add(Guid.NewGuid().ToString());//图片名   
  31.             }  
  32.         }  
  33.     }  
  34.     catch (WebException ex)  
  35.     {  
  36.         list.Clear();  
  37.         list.Add("发生异常/n/r");  
  38.         WebResponse wr = ex.Response;  
  39.         using (Stream st = wr.GetResponseStream())  
  40.         {  
  41.             using (StreamReader sr = new StreamReader(st, System.Text.Encoding.Default))  
  42.             {   
  43.                 list.Add(sr.ReadToEnd());  
  44.             }  
  45.         }  
  46.     }  
  47.     catch (Exception ex)  
  48.     {  
  49.         list.Clear();  
  50.         list.Add("5");  
  51.         list.Add("发生异常:" + ex.Message);  
  52.     }  
  53.     return list;  
  54. }  

 

2.下载验证码,保存在本地。

  1. /// <summary>   
  2.         /// 下载验证码图片并保存到本地   
  3.         /// </summary>   
  4.         /// <param name="Url">验证码URL</param>   
  5.         /// <param name="cookCon">Cookies值</param>   
  6.         /// <param name="savePath">保存位置/文件名</param>   
  7.         public static bool DowloadCheckImg(string Url, CookieContainer cookCon, string savePath)  
  8.         {  
  9.             bool bol = true;  
  10.             HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(Url);  
  11.             //属性配置   
  12.             webRequest.AllowWriteStreamBuffering = true;  
  13.             webRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;  
  14.             webRequest.MaximumResponseHeadersLength = -1;  
  15.             webRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";  
  16.             webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)";  
  17.             webRequest.ContentType = "application/x-www-form-urlencoded";  
  18.             webRequest.Method = "GET";  
  19.             webRequest.Headers.Add("Accept-Language""zh-cn");  
  20.             webRequest.Headers.Add("Accept-Encoding""gzip,deflate");  
  21.             webRequest.KeepAlive = true;  
  22.             webRequest.CookieContainer = cookCon;  
  23.             try  
  24.             {  
  25.                 //获取服务器返回的资源   
  26.                 using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())  
  27.                 {  
  28.                     using (Stream sream = webResponse.GetResponseStream())  
  29.                     {  
  30.                         List<byte> list = new List<byte>();  
  31.                         while (true)  
  32.                         {  
  33.                             int data = sream.ReadByte();  
  34.                             if (data == -1)  
  35.                                 break;  
  36.                             list.Add((byte)data);  
  37.                         }  
  38.                         File.WriteAllBytes(savePath, list.ToArray());  
  39.                     }  
  40.                 }  
  41.             }  
  42.             catch (WebException ex)  
  43.             {  
  44.                 bol = false;  
  45.             }  
  46.             catch (Exception ex)  
  47.             {  
  48.                 bol = false;  
  49.             }  
  50.             return bol;  
  51.         }  

 

3。发送post数据

  1. /// <summary>   
  2. /// 发送相关数据至页面   
  3. /// 进行登录操作   
  4. /// 并保存cookie   
  5. /// </summary>   
  6. /// <param name="postData"></param>   
  7. /// <param name="postUrl"></param>   
  8. /// <param name="cookie"></param>   
  9. /// <returns></returns>   
  10. public static ArrayList PostData(string postData, string postUrl, CookieContainer cookie)  
  11. {  
  12.     ArrayList list = new ArrayList();  
  13.     HttpWebRequest request;  
  14.     HttpWebResponse response;  
  15.     ASCIIEncoding encoding = new ASCIIEncoding();  
  16.     request = WebRequest.Create(postUrl) as HttpWebRequest;  
  17.     byte[] b = encoding.GetBytes(postData);  
  18.     request.UserAgent = "Mozilla/4.0";  
  19.     request.Method = "POST";  
  20.     request.CookieContainer = cookie;  
  21.     request.ContentLength = b.Length;  
  22.     using (Stream stream = request.GetRequestStream())  
  23.     {  
  24.         stream.Write(b, 0, b.Length);  
  25.     }  
  26.   
  27.     try  
  28.     {  
  29.         //获取服务器返回的资源   
  30.         using (response = request.GetResponse() as HttpWebResponse)  
  31.         {  
  32.             using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))  
  33.             {  
  34.                 if (response.Cookies.Count > 0)  
  35.                     cookie.Add(response.Cookies);  
  36.                 list.Add(cookie);  
  37.                 list.Add(reader.ReadToEnd());  
  38.             }  
  39.         }  
  40.     }  
  41.     catch (WebException wex)  
  42.     {  
  43.         WebResponse wr = wex.Response;  
  44.         using (Stream st = wr.GetResponseStream())  
  45.         {  
  46.             using (StreamReader sr = new StreamReader(st, System.Text.Encoding.Default))  
  47.             {  
  48.                 list.Add(sr.ReadToEnd());  
  49.             }  
  50.         }  
  51.     }  
  52.     catch (Exception ex)  
  53.     {  
  54.         list.Add("发生异常/n/r"+ex.Message);  
  55.     }  
  56.     return list;  
  57. }  

 

4。就是第三步请求的链接地址换一个就行了

 

好了

以上核心代码已经贴出了

具体实现需要靠你们按照你们自己的逻辑

 

还有一些header能不写就不写,因为我2天前一直在获取返回response这地方报500错误。

找了N多代码,看了N多资料都不可以。最后将一些header注释掉就可以了,真郁闷。

 

 

posted on 2013-04-09 21:24  freeliver54  阅读(6906)  评论(3编辑  收藏  举报

导航