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

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

先说下流程

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

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

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

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

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

1。

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

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

[c-sharp] view plain copy print ?
  1. ///  
  2.         /// 下载验证码图片并保存到本地 
  3.         ///  
  4.         /// 验证码URL 
  5.         /// Cookies值 
  6.         /// 保存位置/文件名 
  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.         } 
/// /// 下载验证码图片并保存到本地 /// /// 验证码URL /// Cookies值 /// 保存位置/文件名 public static bool DowloadCheckImg(string Url, CookieContainer cookCon, string savePath) { bool bol = true; HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(Url); //属性配置 webRequest.AllowWriteStreamBuffering = true; webRequest.Credentials = System.Net.CredentialCache.DefaultCredentials; webRequest.MaximumResponseHeadersLength = -1; 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, */*"; webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)"; webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.Method = "GET"; webRequest.Headers.Add("Accept-Language", "zh-cn"); webRequest.Headers.Add("Accept-Encoding", "gzip,deflate"); webRequest.KeepAlive = true; webRequest.CookieContainer = cookCon; try { //获取服务器返回的资源 using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()) { using (Stream sream = webResponse.GetResponseStream()) { List list = new List(); while (true) { int data = sream.ReadByte(); if (data == -1) break; list.Add((byte)data); } File.WriteAllBytes(savePath, list.ToArray()); } } } catch (WebException ex) { bol = false; } catch (Exception ex) { bol = false; } return bol; }

3。发送post数据

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

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

好了

以上核心代码已经贴出了

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

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

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

 

 

http://blog.csdn.net/vip__888/article/details/5646260

你可能感兴趣的:(c#,post)