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

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

我们经常会碰到需要程序模拟登录一个网站,那如果网站需要填写验证码的要怎样模拟登录呢?
这篇文章利用了 HttpWebRequest 和 HttpWebResponse 模拟登录了有验证码的网站。

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

写程序前,先用浏览器的开发者工具观察下登录页面有什么请求,我这里用的是 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也类似。

完整代码如下:

        CookieContainer cookies = null;
        string strCookies = string.Empty;

        private void btnChangeValidate_Click(object sender, RoutedEventArgs e)
        {
            GetValidateImage();
        }

        /// <summary>
        /// 获取验证码和Cookie
        /// </summary>
        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
            strCookies = request.CookieContainer.GetCookieHeader(request.RequestUri); //把cookies转换成字符串

            BitmapImage bi = new BitmapImage();
            bi.BeginInit();
            bi.StreamSource = (Stream)ms;
            bi.EndInit();
            imgValidate.Source = bi;
        }

        private void btnLogin_Click(object sender, RoutedEventArgs e)
        {
            Login();
        }

        /// <summary>
        /// 登录
        /// </summary>
        /// <returns></returns>
        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 = 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();

            string strWebData = string.Empty;
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                strWebData = reader.ReadToEnd();
            }
            return strWebData;
        }

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

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

时间: 2024-08-06 14:30:30

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

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

需要用程序模拟登录一个网站,登录的时候需要填写验证码. 设计的界面很简单: 写程序前,先用浏览器的开发者工具观察下登录页面有什么请求,我这里用的是 FireBug,下面两个图是在 FireBug 的网络面板中截的. 可以看到打开登录页面时有个 GET 请求验证码的,在 FireBug 中可以看到: 上面的图上可以看到这一句: Set-Cookie GUID=c89eabb62d9d4f35b491a8afd371b4ad; path=/ 这里请求的验证码页面保存了一个Cookie. 然后我们输入

php使用curl模拟登录带验证码的网站

需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\Controller; use Think\Controller; class LoginController extends Controller { protected $cookieName = array('cookie_verify', 'cookie_verify'); protected $

利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录

之前看过某个同学的一篇有关与使用JSoup解析学校图书馆的文章,仔细一看,发现竟然是同校!!既然对方用的是java,那么我也就来个C#好了,虽然我的入门语言是java. C#没有JSoup这样方便的东西,我也没有仔细去找,因为只要利用正则表达式,同样可以很好的解析网页内容而不需要其他帮助.现在做前端的程序员,如果正则表达式不熟悉,反而去依赖第三方的话,感觉很可惜! 这是我们学校图书馆的登录界面的body: <body onload="bodyload()"> <for

C#使用HttpWebRequest与HttpWebResponse模拟用户登录

模拟艺龙旅游网登录 想模拟登录,首先整理一下流程 1.通过360浏览器(IE,火狐等等)F12开发人员工具抓到相关数据 2.获取验证码(拿到cookie),登录时也需要使用 3.登录 ------------------------------- F12调出开发人员工具,输入用户名,密码登录,看我们抓到了什么信息. Request URL:这个就是登录请求的url https://secure.elong.com/passport/ajax/elongLogin 方式POST Form Data

利用HttpWebRequest和HttpWebResponse获取Cookie

之前看过某个同学的一篇有关与使用JSoup解析学校图书馆的文章,仔细一看,发现竟然是同校!!既然对方用的是java,那么我也就来个C#好了,虽然我的入门语言是java. C#没有JSoup这样方便的东西,我也没有仔细去找,因为只要利用正则表达式,同样可以很好的解析网页内容而不需要其他帮助.现在做前端的程序员,如果正则表达式不熟悉,反而去依赖第三方的话,感觉很可惜! 这是我们学校图书馆的登录界面的body: <body onload="bodyload()"> <for

Python模拟登录后爬取网站内容(小说)

最近有个好友让我帮忙爬取个小说,这个小说是前三十章直接可读,后面章节需要充值VIP可见.所以就需要利用VIP账户登录后,构造Cookie,再用Python的获取每章节的url,得到内容后再使用 PyQuery 解析内容. 注意:构造Cookie的过程中,需要你在 Chrome/Firefox 登录,然后自己在控制台查看 cookie,然后手动加入. 第一步:手动构造cookie,绕过登录 [我这里不是破解账户,想破解请出门左拐] 1 #version 2.7 2 3 #!/usr/bin/pyt

Python爬虫模拟登录带验证码网站

问题分析: 1.爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 2.首先得明白cookie的作用,cookie是某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据.因此我们需要用Cookielib模块来保持网站的cookie. 3.这个是要登陆的地址 http://202.115.80.153/ 和验证码地址 http://202.115.80.15

python模拟登录http basic authentication网站

当访问需要认证的网站时会提示输入正确的用户和密码 如果密码错误会返回401的状态码 401 Authorization Required 通过python脚本模拟登录 #!/usr/bin/python #-*-coding:utf-8-*- import urllib2 #登录的用户名和密码 username = "root" password = "redhat" url="http://192.168.209.200/" def Func(

php_curl模拟登录有验证码实例

<?php /** * @author 追逐__something * @version $id */ define('SCRIPT_ROOT',dirname(__FILE__).'/'); $act = trim($_REQUEST['act']); switch($act) { case 'login': // 获取验证码 $code = trim($_REQUEST['code']); // $loginParams为curl模拟登录时post的参数 $loginParams['act'