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框架爬各种网站时,一定会碰到某些网站是需要登录才能获取信息. 这两天也在学习怎么去模拟登录,通过自己码的代码和借鉴别人的项目,调试成功豆瓣的模拟登录,顺便处理了怎么自动化的处理验证码 ...
随机推荐
- Canvas 生成base64的PNG图片快照,So Amazing!!!
function canvasSupport(){ return Modernizr.canvas;}function callCanvasApps(){ var canvasOne=doc ...
- Android中部署自己的su
本人博客原文 首先把你的自己的su的放到Android应用程序project的assets文件夹,为了和系统的su区分,我自己的su文件叫做sur. 另外我这里没有考虑x86架构的cpu的手机. 废话 ...
- SQLite外键
数据库工具:SQLite Manager(V0.7.7) SQLite版本号:V3.6.19+ SQLite Manager 默认是不开启外键的. 那么怎样,使用它创建一个带有外键的表呢? 一.开启外 ...
- 深入Java虚拟机——类型装载、连接(转)
来自http://hi.baidu.com/holder/item/c38abf02de14c7d31ff046e0 Java虚拟机通过装载.连接和初始化一个Java类型,使该类型可以被正在运行的Ja ...
- 图片 Base64码 转换
import sun.misc.BASE64Decoder; private String getBase64Picture(String imgBase64Str) { FileOutputStre ...
- oracle rac常用的命令
oracle rac常用的命令 节点层:olsnodes 网络层: oifcfg 集群层:crsctl,ocrcheck,ocrdump,ocrconfig 应用层:srvctl,onsctl,crs ...
- Node.js v0.10.31API手工-DNS
原版的API品种,这是从以前的翻译和翻译风格不同 Node.js v0.10.31API手冊-文件夹 DNS 使用 require('dns') 引入此模块. dns 模块中的全部方法都使用了 C-A ...
- JavaScript中的try...catch和异常处理
在JavaScript可以使用try...catch来进行异常处理.例如: try { foo.bar();} catch (e) { alert(e.name + ": " + ...
- oracle_自动备份用户数据,删除N天前的旧数据(非rman,bat+vbs)
有时数据没有实时备份恢复那么高的安全性需求,但每天 ,或者定期备份表结构 和数据依旧是很有必要的,介绍一种方法 在归档和非归档模式均可使用的自动备份方法. 预期效果是备份用户下的数据含表结构,备份文件 ...
- android 应用程序框架
携带Android软件开发时间,由开发商开发Android应用程序是通过应用程序框架和Android底层交互,因此,发展以达到最大的部分是应用程序框架. 应用集成框架 那里4一个重要组成部分,以下. ...