实现此功能首先需要借助一些抓包工具,对相应的网站登陆过程进行分析,此过程根据网站的不同,可能复杂,也可能很简单。常用的抓包工具FF下FireBug和IE下的HttpWatch.这两个工具很强大,以此工具获取的信息足以应对C#模拟网站登陆过程所需要的信息。抓包工具的使用教程网上很多,例如FireBug教程,在此就不做过多介绍。当然网上C# C/S结构模拟网站登陆信息也很多,但基本都是代码片段或是逻辑很复杂。所以把我实践的过程写下来与大家分享。此实验过程是基于模拟登陆校内而完成的。

首先使用FireBug 获取登陆相关信息,在点登陆之前先把FireBug中信息清除,这样获取的信息就从点击登陆按钮后开始,以便后续分析,如下图:

每次请求与下一次请求之间的联系就是每次请求后返回的Cookies数据,前一次的返回Cookie数据需要同下一次请求一同发送到服务器,这也是C#模拟网站登陆的关键。详见以下逻辑代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Windows.Forms;
  9.  
  10. namespace WebHelp
  11. {
  12. public class WebAutoLogin
  13. {
  14. #region 属性
  15. /// <summary>
  16. /// 登陆后返回的Html
  17. /// </summary>
  18. public static string ResultHtml
  19. {
  20. get;
  21. set;
  22. }
  23. /// <summary>
  24. /// 下一次请求的Url
  25. /// </summary>
  26. public static string NextRequestUrl
  27. {
  28. get;
  29. set;
  30. }
  31. /// <summary>
  32. /// 若要从远程调用中获取COOKIE一定要为request设定一个CookieContainer用来装载返回的cookies
  33. /// </summary>
  34. public static CookieContainer CookieContainer
  35. {
  36. get;
  37. set;
  38. }
  39. /// <summary>
  40. /// Cookies 字符创
  41. /// </summary>
  42. public static string CookiesString
  43. {
  44. get;
  45. set;
  46. }
  47. #endregion
  48.  
  49. #region 方法
  50. /// <summary>
  51. /// 用户登陆指定的网站
  52. /// </summary>
  53. /// <param name="loginUrl"></param>
  54. /// <param name="account"></param>
  55. /// <param name="password"></param>
  56. public static void PostLogin(string loginUrl, string account, string password)
  57. {
  58. HttpWebRequest request = null;
  59. HttpWebResponse response = null;
  60. try
  61. {
  62. string postdata = "email=" + account + "&password="+password+"&origURL=" + "http://www.renren.com/home" + "&domain=renren.com";//模拟请求数据,数据样式可以用FireBug插件得到。
  63. // string LoginUrl = "http://www.renren.com/PLogin.do";
  64. request = (HttpWebRequest)WebRequest.Create(loginUrl);//实例化web访问类
  65. request.Credentials = CredentialCache.DefaultCredentials;
  66. request.Method = "POST";//数据提交方式为POST
  67. request.ContentType = "application/x-www-form-urlencoded"; //模拟头
  68. request.AllowAutoRedirect = false; // 不用需自动跳转
  69. //必须设置CookieContainer存储请求返回的Cookies
  70. if (CookieContainer != null)
  71. {
  72. request.CookieContainer = CookieContainer;
  73. }
  74. else
  75. {
  76. request.CookieContainer = new CookieContainer();
  77. CookieContainer = request.CookieContainer;
  78. }
  79. request.KeepAlive = true;
  80. //提交请求
  81. byte[] postdatabytes = Encoding.UTF8.GetBytes(postdata);
  82. request.ContentLength = postdatabytes.Length;
  83. Stream stream;
  84. stream = request.GetRequestStream();
  85. //设置POST 数据
  86. stream.Write(postdatabytes, , postdatabytes.Length);
  87. stream.Close();
  88. //接收响应
  89. response = (HttpWebResponse)request.GetResponse();
  90. //保存返回cookie
  91. response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
  92. CookieCollection cook = response.Cookies;
  93. string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);
  94. CookiesString = strcrook;
  95. //取下一次GET跳转地址
  96. StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  97. string content = sr.ReadToEnd();
  98. sr.Close();
  99. request.Abort();
  100. response.Close();
  101. //依据登陆成功后返回的Page信息,求出下次请求的url
  102. //每个网站登陆后加载的Url和顺序不尽相同,以下两步需根据实际情况做特殊处理,从而得到下次请求的URL
  103. string[] substr = content.Split(new char[] { '"' });
  104. NextRequestUrl = substr[];
  105. }
  106. catch (WebException ex)
  107. {
  108. MessageBox.Show(string.Format("登陆时出错,详细信息:{0}", ex.Message));
  109. }
  110. }
  111. /// <summary>
  112. /// 获取用户登陆后下一次请求返回的内容
  113. /// </summary>
  114. public static void GetPage()
  115. {
  116. HttpWebRequest request = null;
  117. HttpWebResponse response = null;
  118. try
  119. {
  120. request = (HttpWebRequest)WebRequest.Create(NextRequestUrl);
  121. request.Credentials = CredentialCache.DefaultCredentials;
  122. request.Method = "GET";
  123. request.KeepAlive = true;
  124. request.Headers.Add("Cookie:" + CookiesString);
  125. request.CookieContainer = CookieContainer;
  126. request.AllowAutoRedirect = false;
  127. response = (HttpWebResponse)request.GetResponse();
  128. //设置cookie
  129. CookiesString = request.CookieContainer.GetCookieHeader(request.RequestUri);
  130. //取再次跳转链接
  131. StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  132. string ss = sr.ReadToEnd();
  133. sr.Close();
  134. request.Abort();
  135. response.Close();
  136. //依据登陆成功后返回的Page信息,求出下次请求的url
  137. //每个网站登陆后加载的Url和顺序不尽相同,以下两步需根据实际情况做特殊处理,从而得到下次请求的URL
  138. string[] substr = ss.Split(new char[] { '"' });
  139. NextRequestUrl = substr[];
  140. ResultHtml = ss;
  141. }
  142. catch (WebException ex)
  143. {
  144. MessageBox.Show(string.Format("获取页面HTML信息出错,详细信息:{0}",ex.Message));
  145. }
  146. }
  147. #endregion
  148.  
  149. }
  150. }

以下是测试代码,POST请求一次,GET请求三次。最后得到登陆后加载的首页的HTML代码。当然,登陆后就可以依据当前的Cookie数据获取网站的其他子页面HTML。以下是登陆后加载的首页的HTML代码的逻辑。

  1. private void Form1_Load(object sender, EventArgs e)
  2. {
  3. WebAutoLogin.PostLogin("http://www.renren.com/PLogin.do", "niuwenwen668@sina.com", "xxxxxxx");
  4. WebAutoLogin.GetPage();
  5. WebAutoLogin.GetPage();
  6. WebAutoLogin.GetPage();
  7. webBrowser1.DocumentText = WebAutoLogin.ResultHtml;
  8. }

第一次POST数据的URL为登陆提交数据的页面,此地址不一定能在抓包工具中得到,这就需要分析,方法很多(网上很多),例如查看登陆页面源码等。

POST提交的数据可以在抓包工具中得到,以下是FireBug中得到的信息:

把代码Copy执行以下,自动登录成功了吧!!

好了,就这些了,此过程中就是每次请求都延续应用前一次请求返回的Cookie数据,只要这步原理理解,此过程也就没有什么难度了。

 

C# 模拟网站登陆的更多相关文章

  1. python urllib2 模拟网站登陆

    python urllib2 模拟网站登陆 1. 可用浏览器先登陆,然后查看网页源码,分析登录表单 2. 使用python urllib2,cookielib 模拟网页登录 import urllib ...

  2. python模拟网站登陆-滑动验证码

    普通滑动验证 以http://admin.emaotai.cn/login.aspx为例这类验证码只需要我们将滑块拖动指定位置,处理起来比较简单.拖动之前需要先将滚动条滚动到指定元素位置. impor ...

  3. C# 模拟网站登陆并截图

    1.在窗体上加一个按钮,为按钮添加点击事件 private void button1_Click(object sender, EventArgs e) { Bitmap m_Bitmap = Web ...

  4. 模拟Post登陆带验证码的网站

    前言: 作者在一个项目需求 模拟用户登陆,获取该用户的订单记录. 该系统需要用户名,密码,验证码 (验证码为正楷的数字4位),于是参考网络一些文章,并进行了很多测试,总结步骤如下: 步骤1 : 通过h ...

  5. cookielib和urllib2模块相结合模拟网站登录

    1.cookielib模块 cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源.例如可以利用 本模块的CookieJar类的对 ...

  6. curl模拟自动登陆&采集网页数据

    <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...

  7. HttpClient4的使用,模拟浏览器登陆新浪微博,发表微博和文字+图片微博

    HttpClient4,最原始的需求就是使用其来模拟浏览器想服务器发起http请求,当然,他的功能不止于此,但是我需要的就是这个功能而已,jdk也有其自带的类似的api:UrlConnection,效 ...

  8. Java模拟新浪微博登陆抓取数据

    前言:  兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先:  要想登陆新浪微博需要 ...

  9. jQuery数字滚动(模拟网站人气、访问量递增)原创

    插件描述:实现数字上下滚动,模拟网站人气.访问量递增的动画效果,兼容性如下: 使用方法 $(el).runNum(val,params);   参数详解 val:数值型(默认70225800): pa ...

随机推荐

  1. HBase(三)HBase架构与工作原理

    一.系统架构 注意:应该是每一个 RegionServer 就只有一个 HLog,而不是一个 Region 有一个 HLog. 从HBase的架构图上可以看出,HBase中的组件包括Client.Zo ...

  2. 【PAT】1016 部分A+B(15 分)

    1016 部分A+B(15 分) 正整数 A 的“D​A​​(为 1 位整数)部分”定义为由 A 中所有 D​A​​ 组成的新整数 P​A​​.例如:给定 A=3862767,D​A​​=6,则 A  ...

  3. Rookey.Frame企业级快速开发框架开源了

    Rookey.Frame是一套基于.NET MVC + easyui的企业级极速开发框架,支持简单逻辑模块零代码编程.支持工作流(BPM).支持二次开发,具有高扩展性.高复用性.高伸缩性:应广大网友要 ...

  4. LoadRunner中的IP欺骗的设置以及误区

    LoadRunner中的IP欺骗的设置以及误区 最近在忙着部署web性能测试的环境后,对IP欺骗进行设置,特地做个笔记,给自己的学习历程留下点足迹. 一. 什么是IP欺骗? 做什么事首先要问个为什么, ...

  5. Codeforces Round #213 (Div. 1) B - Free Market 思维+背包 好题

    B - Free Market 思路:这个题怎么说呢,迷惑性很大,题目里说了交换了两个集合的时候如果有相同元素不能交换,感觉如果没 这句话能很快写出来, 其实当交换的两个集合有重复元素的时候只要交换那 ...

  6. Centos 7.2 安装 Python 3.5(适用于Python 3所有版本安装)

    提示:我们必须不能破坏系统的环境.因为几个关键的应用程序依赖于Python 2.7.5(centos 7默认版本).如果替换了系统的Python环境就会发生很多难以预见的错误,甚至要重装系统. 安装前 ...

  7. 问题:SpringBoot访问不到Controller

    SpringBoot正常启动,其它配置都正常,以下是控制台打印: 解决方法: 将controller与application配置文件同层,是访问时无法扫描到相应的controller,故无法映射到相应 ...

  8. eschop购物实现立即购买和加入购物车

    后台=>平台=>商店设置=>购物流程 是否一步购物设置为否 2:修改代码 .js/common.js function addToCartShowDivResponse(result ...

  9. .NET之类型转换

    说起类型转换大家很容易的就会联想到将int类型转换成float类型或者是将double类型转转成int类型之类的转换.当然这可能是大多数人最先接触到的转换方式,也是最简单的转换方式.所谓转换就是从现有 ...

  10. Am335x SPI 驱动测试

    内核版本:3.14.65 CPU:Am335x 1.编译内核: make menuconfig Device Drivers -> <*>SPI support -> < ...