首页 > 代码库 > 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站

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

需要用程序模拟登录一个网站,登录的时候需要填写验证码。

设计的界面很简单:

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

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

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

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

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

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

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

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

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

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

 

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

点击“换个验证码”按钮的代码:

        private void GetValidateImage()        {            cookies = new CookieContainer();            string url = "http://******/picturetimestamp.asp";  //验证码页面            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);            request.Accept = "*/*";            request.Method = "GET";            request.UserAgent = "Mozilla/5.0";            request.CookieContainer = new CookieContainer(); //暂存到新实例            HttpWebResponse response = (HttpWebResponse)request.GetResponse();            MemoryStream ms = null;            using (var stream = response.GetResponseStream())            {                Byte[] buffer = new Byte[response.ContentLength];                int offset = 0, actuallyRead = 0;                do                {                    actuallyRead = stream.Read(buffer, offset, buffer.Length - offset);                    offset += actuallyRead;                }                while (actuallyRead > 0);                ms = new MemoryStream(buffer);            }            response.Close();            cookies = request.CookieContainer; //保存cookies            cookiesstr = request.CookieContainer.GetCookieHeader(request.RequestUri); //把cookies转换成字符串            BitmapImage bi = new BitmapImage();            bi.BeginInit();            bi.StreamSource = (Stream)ms;            bi.EndInit();            imgValidate.Source = bi;        }

点击“登录”按钮的代码:

        private string Login()        {            HttpWebRequest request = null;            string url = "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;            string postData = http://www.mamicode.com/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;            Stream stream = request.GetRequestStream();            stream.Write(postdatabyte, 0, postdatabyte.Length);            HttpWebResponse response = (HttpWebResponse)request.GetResponse();            StreamReader reader = new StreamReader(response.GetResponseStream());            string strWebData =http://www.mamicode.com/ reader.ReadToEnd();            return strWebData;        }