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-02 18:16:29

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

C# .NET 模拟登录带有验证码的网站,并自动提交表单数据!

问题描述 1.模拟登录的网址:http://www.pceggs.com/nologin.aspx2.登陆后的页面网址:http://www.pceggs.com/play/pc28.aspx3.登陆后模拟表单提交的页面网址:http://www.pceggs.com/play/pg28Insert.aspx?LID=679556(注:此页面需要登录后才可以查看,并LID的值是最新一期需要投注的ID数字)[说明:1和2只是模拟登录网站,3是登录后模拟表单提交数据!]希望高手帮忙解决,基本随时在线

PHP curl模拟登录带验证码的网站_php实例

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

求高手帮忙解决 c# 模拟登录带验证码 总提示验证码错误

问题描述 c#模拟登录带验证码总提示验证码错误,这个网站以前没有加验证码的时候时可以正常模拟登录进去的.这是以前的代码:stringstr_ratk="";doubledttick=this.cConvertDateTimeInt(System.DateTime.Now);result=HttpHelper.GetHtml("http://www.plateno.com/p/nlogin.html?_="+dttick.ToString()+""

使用C#登录带验证码的网站

我在上一篇文章中已经讲解了一般网站的登录原来和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲验证码的原理和对应的登录方法. 验证码的由来 几年前,大部分网站.论坛之类的是没有验证码的,因为对于一般用户来说验证码只是增加了用户的操作,降低了用户的体验.但是后来各种灌水机器人.投票机器人.恶意注册机器人层出不穷,大大增加了网站的负担同时也给网站数据库带来了大量的垃圾数据.为了防止各种机器人程序的破坏,于是程序员想出了只有人眼能够识别的,程序不容易识别的验证码! 验证码是一个图

微信公众平台模拟登录之验证码获取

这个时候平台首页的登录逻辑就会经常出现无法登录的状态,前几天写了一个抓取验证码要求用户输入,这个么有做多少代码的调整,主要是 让前端写了一写js直接调用微信公众平台的验证码连接了,发现不行,两个方面: 1.imgcode这个表单名打错了 2.在抓包的时候突然发现获取验证码的连接有设置cookie的 发现问题后这些都不是什么大事了,码码代码松松解决: public function getImgCode($username){  $str = $this -> getcurl()-> get(&

ajax-php采集高手进:利用curl模拟登录抓取数据遇到json调用问题不成功,求助!

问题描述 php采集高手进:利用curl模拟登录抓取数据遇到json调用问题不成功,求助! 我在抓取一个页面的信息(假设a.php),这个页面只是一些基本的html框架,其他关键信息是通过ajax请求(b.php)回来的,返回的是json,然后在通过页面js将json解析,绘制到页面上.问题的关键是ajax请求的信息里有个手机号码需要登录后才显示完整,原网站利用ajax请求b.php获得json数据,如果直接访问b.php也是可以直接得到:{"name":"zhangsan&

java web 技术-求助!关于模拟登陆利用接收的cookie判断登录是否成功,遇到了问题,,求大神们相助!在下多谢!

问题描述 求助!关于模拟登陆利用接收的cookie判断登录是否成功,遇到了问题,,求大神们相助!在下多谢! 在下学生最近在做一个用java开发模拟登陆校内网的项目,可是学校使用struts2做的,url的尾缀是.action,登陆前和登陆后的url一致,无法用html来判断,,于是就想用cookie来判断登陆是否成功,可是面临一个问题就是请求标头的Cookie是JSESSIONID=3CDAB1BA4520BD1F53E62F9D5BCCCC49之类的,发送的jsessionid和接收的jses

Android利用爬虫实现模拟登录的实现实例

Android利用爬虫实现模拟登录的实现实例 为了用手机登录校网时不用一遍一遍的输入账号密码,于是决定用爬虫抓取学校登录界面,然后模拟填写本次保存的账号.密码,模拟点击登录按钮.实现过程折腾好几个. 一开始选择的是htmlunit解析登录界面html,在pc上测的能实现,结果在android上运行不起来,因为htmlunit利用了javax中的类实现的解析,android不支持javax,所以就跑不起来. 不过pc还是ok的 实例代码: package com.yasin; import jav

PHP利用Curl模拟登录并获取数据例子

PHP的curl()在抓取网页的效率方面是比较高的,而且支持多线程,而file_get_contents()效率就要稍低些,当然,使用curl时需要开启下curl扩展. 代码实战 先来看登录部分的代码:  代码如下 复制代码 //模拟登录 function login_post($url, $cookie, $post) {     $curl = curl_init();//初始化curl模块     curl_setopt($curl, CURLOPT_URL, $url);//登录提交的地