近来发现这个挺有用,从网上搜集过来一系列,参考参考。
c# 使用 HttpWebRequest模拟登陆(附带验证码)
在C#中,可以使用HttpWebRequest进行相关的模拟登陆,登陆后进行相关的操作,比如抓取数据,页面分析,制作相关登陆助手等等。
先说下流程
1.使用httpwebrequest先进入你要登录的网站,获取cookie
2.使用第一步获取的cookie到验证码的网页将验证码下载下来。
3.使用Post数据 发送至网站。如果有cookie则继续保存。
4.使用第三步的cookie登陆相关网页操作。
获取相关数据可以使用抓包工具进行抓取,如httpwatch。(网上下载的好多都有病毒,下载的时候注意点)
1。
- ///<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);
- //保存Cookies
- list.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.下载验证码,保存在本地。
- ///<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数据
- ///<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注释掉就可以了,真郁闷。
我马上试验,等有做出成熟的例子,再写新文章提供给大家!
在C#中,可以使用HttpWebRequest进行相关的模拟登陆,登陆后进行相关的操作,比如抓取数据,页面分析,制作相关登陆助手等等。
先说下流程
1.使用httpwebrequest先进入你要登录的网站,获取cookie
2.使用第一步获取的cookie到验证码的网页将验证码下载下来。
3.使用Post数据 发送至网站。如果有cookie则继续保存。
4.使用第三步的cookie登陆相关网页操作。
获取相关数据可以使用抓包工具进行抓取,如httpwatch。(网上下载的好多都有病毒,下载的时候注意点)
1。
- ///<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);
- //保存Cookies
- list.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.下载验证码,保存在本地。
- ///<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数据
- ///<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注释掉就可以了,真郁闷。
我马上试验,等有做出成熟的例子,再写新文章提供给大家!