C#利用HttpWebRequest和HttpWebResponse模拟登录有验证码的网站

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

我们经常会碰到需要程序模拟登录一个网站,那如果网站需要填写验证码的要怎样模拟登录呢?

这篇文章利用了 HttpWebRequest 和 HttpWebResponse 模拟登录了有验证码的网站。

程序设计的界面很简单,三个TextBox分别输入用户名、密码和验证码,一个Image控件显示从网站请求到的验证码图片,还有两个按钮,一个换验证码,一个登录。

写程序前,先用浏览器的开发者工具观察下登录页面有什么请求,我这里用的是 FireBug,下面两个图是在 FireBug 的网络面板中截的。

可以看到打开登录页面时有个 GET 请求验证码的,在 FireBug 中可以看到:

上面的图上可以看到这一句: Set-CookieGUID=c89eabb62d9d4f35b491a8afd371b4ad; path=/

这里请求的验证码页面保存了一个Cookie。

然后我们输入验证码,点击“登录”的时候有个 POST 请求,在 FireBug 可以看到:

这里的重点是这句:CodeStatus=&bkurl=&companyid=&username=test&passWord=test&Validate=yyxe

从这里我们可以看到用户名、密码还有验证码提交的方式。

下面大概说下程序的步骤:

1. 请求验证码,显示在程序界面上,并且保存Cookie。

2. 提交姓名、密码和验证码数据,获得响应。

我这里是WPF程序,如果是Winform也类似。

完整代码如下:

CookieContainer cookies =null;stringstrCookies =string.Empty;PRivatevoidbtnChangeValidate_Click(objectsender, RoutedEventArgs e)

{

GetValidateImage();

}///<summary>///获取验证码和Cookie///</summary>privatevoidGetValidateImage()

{

cookies=newCookieContainer();stringurl ="http://******/picturetimestamp.asp";//验证码页面HttpWebRequest request =(HttpWebRequest)WebRequest.Create(url);

request.Accept="*/*";

request.Method="GET";

request.UserAgent="Mozilla/5.0";

request.CookieContainer=newCookieContainer();//暂存到新实例HttpWebResponse response =(HttpWebResponse)request.GetResponse();

MemoryStream ms=null;using(varstream =response.GetResponseStream())

{

Byte[] buffer=newByte[response.ContentLength];intoffset =0, actuallyRead =0;do{

actuallyRead= stream.Read(buffer, offset, buffer.Length -offset);

offset+=actuallyRead;

}while(actuallyRead >0);

ms=newMemoryStream(buffer);

}

response.Close();

cookies= request.CookieContainer;//保存cookiesstrCookies = request.CookieContainer.GetCookieHeader(request.RequestUri);//把cookies转换成字符串BitmapImage bi=newBitmapImage();

bi.BeginInit();

bi.StreamSource=(Stream)ms;

bi.EndInit();

imgValidate.Source=bi;

}privatevoidbtnLogin_Click(objectsender, RoutedEventArgs e)

{

Login();

}///<summary>///登录///</summary>///<returns></returns>privatestringLogin()

{

HttpWebRequest request=null;stringurl ="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;stringpostData =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();stringstrWebData =string.Empty;using(StreamReader reader =newStreamReader(response.GetResponseStream()))

{

strWebData=reader.ReadToEnd();

}returnstrWebData;

}

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

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航