c# 使用 HttpWebRequest模拟登陆(附带验证码)在C#中,可以使用HttpWebRequest进行相关的模拟登陆,登陆后进行相关的操作,比如抓取数据,页面分析,制作相关登陆助手等等。
先说下流程
1.使用httpwebrequest先进入你要登录的网站,获取cookie
2.使用第一步获取的cookie到验证码的网页将验证码下载下来。
3.使用Post数据 发送至网站。如果有cookie则继续保存。
4.使用第三步的cookie登陆相关网页操作。
获取相关数据可以使用抓包工具进行抓取,如httpwatch。(网上下载的好多都有病毒,下载的时候注意点)
1。
[c-sharp]view plaincopy///<summary>///通过get方式请求页面,传递一个实例化的cookieContainer///</summary>///<paramname="postUrl"></param>///<paramname="cookie"></param>///<returns></returns>publicstaticArrayListGetHtmlData(stringpostUrl,CookieContainercookie){HttpWebRequestrequest;HttpWebResponseresponse;ArrayListlist=newArrayList();request=WebRequest.Create(postUrl)asHttpWebRequest;request.Method="GET";request.UserAgent="Mozilla/4.0";request.CookieContainer=cookie;request.KeepAlive=true;request.CookieContainer=cookie;try{//获取服务器返回的资源using(response=(HttpWebResponse)request.GetResponse()){using(StreamReaderreader=newStreamReader(response.GetResponseStream(),Encoding.Default)){cookie.Add(response.Cookies);//保存Cookieslist.Add(cookie);list.Add(reader.ReadToEnd());list.Add(Guid.NewGuid().ToString());//图片名}}}catch(WebExceptionex){list.Clear();list.Add("发生异常/n/r");WebResponsewr=ex.Response;using(Streamst=wr.GetResponseStream()){using(StreamReadersr=newStreamReader(st,System.Text.Encoding.Default)){list.Add(sr.ReadToEnd());}}}catch(Exceptionex){list.Clear();list.Add("5");list.Add("发生异常:"+ex.Message);}returnlist;}
2.下载验证码,保存在本地。
[c-sharp]view plaincopy///<summary>///下载验证码图片并保存到本地///</summary>///<paramname="Url">验证码URL</param>///<paramname="cookCon">Cookies值</param>///<paramname="savePath">保存位置/文件名</param>publicstaticboolDowloadCheckImg(stringUrl,CookieContainercookCon,stringsavePath){boolbol=true;HttpWebRequestwebRequest=(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;MSIE6.0;WindowsNT5.1;SV1;Maxthon;.NETCLR1.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(HttpWebResponsewebResponse=(HttpWebResponse)webRequest.GetResponse()){using(Streamsream=webResponse.GetResponseStream()){List<byte>list=newList<byte>();while(true){intdata=sream.ReadByte();if(data==-1)
break;list.Add((byte)data);}File.WriteAllBytes(savePath,list.ToArray());}}}catch(WebExceptionex){bol=false;}catch(Exceptionex){bol=false;}returnbol;}
3。发送post数据
[c-sharp]view plaincopy///<summary>///发送相关数据至页面///进行登录操作///并保存cookie///</summary>///<paramname="postData"></param>///<paramname="postUrl"></param>///<paramname="cookie"></param>///<returns></returns>publicstaticArrayListPostData(stringpostData,stringpostUrl,CookieContainercookie){ArrayListlist=newArrayList();HttpWebRequestrequest;HttpWebResponseresponse;ASCIIEncodingencoding=newASCIIEncoding();request=WebRequest.Create(postUrl)asHttpWebRequest;byte[]b=encoding.GetBytes(postData);request.UserAgent="Mozilla/4.0";request.Method="POST";request.CookieContainer=cookie;request.ContentLength=b.Length;using(Streamstream=request.GetRequestStream()){stream.Write(b,0,b.Length);}try{//获取服务器返回的资源using(response=request.GetResponse()asHttpWebResponse){using(StreamReaderreader=newStreamReader(response.GetResponseStream(),Encoding.UTF8)){if(response.Cookies.Count>0)cookie.Add(response.Cookies);list.Add(cookie);list.Add(reader.ReadToEnd());}}}catch(WebExceptionwex){WebResponsewr=wex.Response;using(Streamst=wr.GetResponseStream()){using(StreamReadersr=newStreamReader(st,System.Text.Encoding.Default)){list.Add(sr.ReadToEnd());}}}catch(Exceptionex){list.Add("发生异常/n/r"+ex.Message);}returnlist;}
4。就是第三步请求的链接地址换一个就行了
好了
以上核心代码已经贴出了
具体实现需要靠你们按照你们自己的逻辑
还有一些header能不写就不写,因为我2天前一直在获取返回response这地方报500错误。
找了N多代码,看了N多资料都不可以。最后将一些header注释掉就可以了,真郁闷。