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 = , actuallyRead = ;
do
{
actuallyRead = stream.Read(buffer, offset, buffer.Length - offset);
offset += actuallyRead;
}
while (actuallyRead > );
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, , 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
C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站的更多相关文章
- php使用curl模拟登录带验证码的网站[开发篇]
需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...
- php使用curl模拟登录带验证码的网站
需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...
- [PHP自动化-进阶]002.CURL模拟登录带有验证码的网站
引言:继前文<模拟登录并采集数据>,大家似乎看不过瘾,这会再出一发,模拟实现带验证码网站的登录. 这篇文章主要介绍了PHP使用CURL实现对带有验证码的网站进行模拟登录的方法,可以帮助读者 ...
- 利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录
利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录 tring cookie = response.Headers.Get("Set-Cookie ...
- Java模拟登录带验证码的教务系统(原理详解)
一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...
- 使用C#登录带验证码的网站
我在上一篇文章中已经讲解了一般网站的登录原来和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲验证码的原理和对应的登录方法.验证码的由来几年前,大部分网站.论坛之类的是没有验证码 ...
- C#使用HttpWebRequest与HttpWebResponse模拟用户登录
模拟艺龙旅游网登录 想模拟登录,首先整理一下流程 1.通过360浏览器(IE,火狐等等)F12开发人员工具抓到相关数据 2.获取验证码(拿到cookie),登录时也需要使用 3.登录 -------- ...
- 利用HttpWebRequest和HttpWebResponse获取Cookie
之前看过某个同学的一篇有关与使用JSoup解析学校图书馆的文章,仔细一看,发现竟然是同校!!既然对方用的是java,那么我也就来个C#好了,虽然我的入门语言是java. C#没有JSoup这样方便的东 ...
- python爬虫实战(四)--------豆瓣网的模拟登录(模拟登录和验证码的处理----scrapy)
在利用scrapy框架爬各种网站时,一定会碰到某些网站是需要登录才能获取信息. 这两天也在学习怎么去模拟登录,通过自己码的代码和借鉴别人的项目,调试成功豆瓣的模拟登录,顺便处理了怎么自动化的处理验证码 ...
随机推荐
- Java 新特性(3) - JDK7 新特性
http://www.ibm.com/developerworks/cn/java/j-lo-jdk7-1/ JSR292:支持动态类型语言(InvokeDynamic) 近 年来越来越多的基于 JV ...
- metaq spring
spring metaq spring bean 配置 <bean id="sessionFactory" class="com.taobao.metamorpho ...
- Gradle增量学习建筑
请在本系列下面的文章下载Github演示示例代码: git clone https://github.com/davenkin/gradle-learning.git 假设我们Gradle ...
- SharePoint 2013 配置开发环境,需安装VS2012插件
原文:SharePoint 2013 配置开发环境,需安装VS2012插件 SharePoint 2013已经安装好了,接下来就是配置开发环境,安装VS2012,但是,装好了以后,发现没有ShareP ...
- 半平面交总结and模板
博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40859973 这两天刷了POJ上几道半平面交,对半平面交有了初步的体会,感觉半 ...
- hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)
还是畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- 5、VS2010+ASP.NET MVC4+EF4+JqueryEasyUI+Oracle该项目的开发——使用datagrid做报表
来点需要:我使用的数据库访问EF框架,但是,因为使用一个动态表来的统计报告中.单独是每天产生基于数据表,它是很难使用EF加盟前.所以我包装在两组数据库存取层的框内,一个是EF,一种是传统的ADO.NE ...
- js地址下拉列表中全职工作
/******************************************************************* *输出全国各省辖市下拉列表项writeCitys() *输出企 ...
- newlisp获得bash该命令的退出状态
newlisp exec你可以运行bash命令.但如何返回状态来运行它? 特别是,我需要监控hdfs dfs -test 结果返回.经过一番摸索,我发现了一个简单的答案: #!/usr/bin/new ...
- POJ 1743 Musical Theme Hash+二分法
标题效果:有一个美丽的旋律,它们是由一些不大于88音调.如果计为五个音调的量度,问:是否有相同的节奏的多个部分(相同的差,以及两者之间的相同的节奏不能重叠),并寻求最长长度. 思考:这个问题是八人中的 ...