原文: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

最新文章

  1. ASP.NET MVC搭建项目后台UI框架—4、tab多页签支持
  2. Ignite 配置更新Oracle JDBC Drive
  3. 内置函数dict
  4. Python自动化之rabbitmq rpc client端代码分析(原创)
  5. 点击checkbox,触发事件
  6. CVE-2014-6271 Bash漏洞利用工具
  7. 20151224001 GridView 多按钮的各种使用方法
  8. HTML5学习总结——HTML5新增属性与表单元素
  9. GitHub进一步了解
  10. 庖丁解牛FPPopover
  11. 使用gulp编译sass
  12. wpf 画刷的分类
  13. 【编程基础】C语言常见宏定义
  14. 201671010142 &lt;java程序设计&gt;初次学习心得与感悟
  15. 批处理关闭防火墙.bat
  16. openssl命令行工具简介 - 指令x509
  17. java基础-day15
  18. 圆点博士 陀螺仪和加速度计MPU6050的单位换算方法
  19. django 的ajax 请求,使用form的验证机制。
  20. HTTP性能测试工具wrk安装及使用

热门文章

  1. C——联合体(共同体)总结
  2. AndroidManifest:VersionCode和VersionName
  3. atitit.无损传输二进制数据串传输网络
  4. NSIS脚本:更改壁纸
  5. (大数据工程师学习路径)第二步 Vim编辑器----高级功能入门
  6. dede织梦背景经常使用标签
  7. POJ 1743 Musical Theme Hash+二分法
  8. ABP应用层——应用服务(Application services)
  9. 使用 CodeIgniter 框架快速开发 PHP 应用(三)
  10. Android手游《》斗地主完整的源代码(支持单机和网络对战)