C# 模拟网站登陆
实现此功能首先需要借助一些抓包工具,对相应的网站登陆过程进行分析,此过程根据网站的不同,可能复杂,也可能很简单。常用的抓包工具FF下FireBug和IE下的HttpWatch.这两个工具很强大,以此工具获取的信息足以应对C#模拟网站登陆过程所需要的信息。抓包工具的使用教程网上很多,例如FireBug教程,在此就不做过多介绍。当然网上C# C/S结构模拟网站登陆信息也很多,但基本都是代码片段或是逻辑很复杂。所以把我实践的过程写下来与大家分享。此实验过程是基于模拟登陆校内而完成的。
首先使用FireBug 获取登陆相关信息,在点登陆之前先把FireBug中信息清除,这样获取的信息就从点击登陆按钮后开始,以便后续分析,如下图:
每次请求与下一次请求之间的联系就是每次请求后返回的Cookies数据,前一次的返回Cookie数据需要同下一次请求一同发送到服务器,这也是C#模拟网站登陆的关键。详见以下逻辑代码:
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace WebHelp
- {
- public class WebAutoLogin
- {
- #region 属性
- /// <summary>
- /// 登陆后返回的Html
- /// </summary>
- public static string ResultHtml
- {
- get;
- set;
- }
- /// <summary>
- /// 下一次请求的Url
- /// </summary>
- public static string NextRequestUrl
- {
- get;
- set;
- }
- /// <summary>
- /// 若要从远程调用中获取COOKIE一定要为request设定一个CookieContainer用来装载返回的cookies
- /// </summary>
- public static CookieContainer CookieContainer
- {
- get;
- set;
- }
- /// <summary>
- /// Cookies 字符创
- /// </summary>
- public static string CookiesString
- {
- get;
- set;
- }
- #endregion
- #region 方法
- /// <summary>
- /// 用户登陆指定的网站
- /// </summary>
- /// <param name="loginUrl"></param>
- /// <param name="account"></param>
- /// <param name="password"></param>
- public static void PostLogin(string loginUrl, string account, string password)
- {
- HttpWebRequest request = null;
- HttpWebResponse response = null;
- try
- {
- string postdata = "email=" + account + "&password="+password+"&origURL=" + "http://www.renren.com/home" + "&domain=renren.com";//模拟请求数据,数据样式可以用FireBug插件得到。
- // string LoginUrl = "http://www.renren.com/PLogin.do";
- request = (HttpWebRequest)WebRequest.Create(loginUrl);//实例化web访问类
- request.Credentials = CredentialCache.DefaultCredentials;
- request.Method = "POST";//数据提交方式为POST
- request.ContentType = "application/x-www-form-urlencoded"; //模拟头
- request.AllowAutoRedirect = false; // 不用需自动跳转
- //必须设置CookieContainer存储请求返回的Cookies
- if (CookieContainer != null)
- {
- request.CookieContainer = CookieContainer;
- }
- else
- {
- request.CookieContainer = new CookieContainer();
- CookieContainer = request.CookieContainer;
- }
- request.KeepAlive = true;
- //提交请求
- byte[] postdatabytes = Encoding.UTF8.GetBytes(postdata);
- request.ContentLength = postdatabytes.Length;
- Stream stream;
- stream = request.GetRequestStream();
- //设置POST 数据
- stream.Write(postdatabytes, , postdatabytes.Length);
- stream.Close();
- //接收响应
- response = (HttpWebResponse)request.GetResponse();
- //保存返回cookie
- response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
- CookieCollection cook = response.Cookies;
- string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);
- CookiesString = strcrook;
- //取下一次GET跳转地址
- StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
- string content = sr.ReadToEnd();
- sr.Close();
- request.Abort();
- response.Close();
- //依据登陆成功后返回的Page信息,求出下次请求的url
- //每个网站登陆后加载的Url和顺序不尽相同,以下两步需根据实际情况做特殊处理,从而得到下次请求的URL
- string[] substr = content.Split(new char[] { '"' });
- NextRequestUrl = substr[];
- }
- catch (WebException ex)
- {
- MessageBox.Show(string.Format("登陆时出错,详细信息:{0}", ex.Message));
- }
- }
- /// <summary>
- /// 获取用户登陆后下一次请求返回的内容
- /// </summary>
- public static void GetPage()
- {
- HttpWebRequest request = null;
- HttpWebResponse response = null;
- try
- {
- request = (HttpWebRequest)WebRequest.Create(NextRequestUrl);
- request.Credentials = CredentialCache.DefaultCredentials;
- request.Method = "GET";
- request.KeepAlive = true;
- request.Headers.Add("Cookie:" + CookiesString);
- request.CookieContainer = CookieContainer;
- request.AllowAutoRedirect = false;
- response = (HttpWebResponse)request.GetResponse();
- //设置cookie
- CookiesString = request.CookieContainer.GetCookieHeader(request.RequestUri);
- //取再次跳转链接
- StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
- string ss = sr.ReadToEnd();
- sr.Close();
- request.Abort();
- response.Close();
- //依据登陆成功后返回的Page信息,求出下次请求的url
- //每个网站登陆后加载的Url和顺序不尽相同,以下两步需根据实际情况做特殊处理,从而得到下次请求的URL
- string[] substr = ss.Split(new char[] { '"' });
- NextRequestUrl = substr[];
- ResultHtml = ss;
- }
- catch (WebException ex)
- {
- MessageBox.Show(string.Format("获取页面HTML信息出错,详细信息:{0}",ex.Message));
- }
- }
- #endregion
- }
- }
以下是测试代码,POST请求一次,GET请求三次。最后得到登陆后加载的首页的HTML代码。当然,登陆后就可以依据当前的Cookie数据获取网站的其他子页面HTML。以下是登陆后加载的首页的HTML代码的逻辑。
- private void Form1_Load(object sender, EventArgs e)
- {
- WebAutoLogin.PostLogin("http://www.renren.com/PLogin.do", "niuwenwen668@sina.com", "xxxxxxx");
- WebAutoLogin.GetPage();
- WebAutoLogin.GetPage();
- WebAutoLogin.GetPage();
- webBrowser1.DocumentText = WebAutoLogin.ResultHtml;
- }
第一次POST数据的URL为登陆提交数据的页面,此地址不一定能在抓包工具中得到,这就需要分析,方法很多(网上很多),例如查看登陆页面源码等。
POST提交的数据可以在抓包工具中得到,以下是FireBug中得到的信息:
把代码Copy执行以下,自动登录成功了吧!!
好了,就这些了,此过程中就是每次请求都延续应用前一次请求返回的Cookie数据,只要这步原理理解,此过程也就没有什么难度了。
C# 模拟网站登陆的更多相关文章
- python urllib2 模拟网站登陆
python urllib2 模拟网站登陆 1. 可用浏览器先登陆,然后查看网页源码,分析登录表单 2. 使用python urllib2,cookielib 模拟网页登录 import urllib ...
- python模拟网站登陆-滑动验证码
普通滑动验证 以http://admin.emaotai.cn/login.aspx为例这类验证码只需要我们将滑块拖动指定位置,处理起来比较简单.拖动之前需要先将滚动条滚动到指定元素位置. impor ...
- C# 模拟网站登陆并截图
1.在窗体上加一个按钮,为按钮添加点击事件 private void button1_Click(object sender, EventArgs e) { Bitmap m_Bitmap = Web ...
- 模拟Post登陆带验证码的网站
前言: 作者在一个项目需求 模拟用户登陆,获取该用户的订单记录. 该系统需要用户名,密码,验证码 (验证码为正楷的数字4位),于是参考网络一些文章,并进行了很多测试,总结步骤如下: 步骤1 : 通过h ...
- cookielib和urllib2模块相结合模拟网站登录
1.cookielib模块 cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源.例如可以利用 本模块的CookieJar类的对 ...
- curl模拟自动登陆&采集网页数据
<!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...
- HttpClient4的使用,模拟浏览器登陆新浪微博,发表微博和文字+图片微博
HttpClient4,最原始的需求就是使用其来模拟浏览器想服务器发起http请求,当然,他的功能不止于此,但是我需要的就是这个功能而已,jdk也有其自带的类似的api:UrlConnection,效 ...
- Java模拟新浪微博登陆抓取数据
前言: 兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先: 要想登陆新浪微博需要 ...
- jQuery数字滚动(模拟网站人气、访问量递增)原创
插件描述:实现数字上下滚动,模拟网站人气.访问量递增的动画效果,兼容性如下: 使用方法 $(el).runNum(val,params); 参数详解 val:数值型(默认70225800): pa ...
随机推荐
- HBase(三)HBase架构与工作原理
一.系统架构 注意:应该是每一个 RegionServer 就只有一个 HLog,而不是一个 Region 有一个 HLog. 从HBase的架构图上可以看出,HBase中的组件包括Client.Zo ...
- 【PAT】1016 部分A+B(15 分)
1016 部分A+B(15 分) 正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA 组成的新整数 PA.例如:给定 A=3862767,DA=6,则 A ...
- Rookey.Frame企业级快速开发框架开源了
Rookey.Frame是一套基于.NET MVC + easyui的企业级极速开发框架,支持简单逻辑模块零代码编程.支持工作流(BPM).支持二次开发,具有高扩展性.高复用性.高伸缩性:应广大网友要 ...
- LoadRunner中的IP欺骗的设置以及误区
LoadRunner中的IP欺骗的设置以及误区 最近在忙着部署web性能测试的环境后,对IP欺骗进行设置,特地做个笔记,给自己的学习历程留下点足迹. 一. 什么是IP欺骗? 做什么事首先要问个为什么, ...
- Codeforces Round #213 (Div. 1) B - Free Market 思维+背包 好题
B - Free Market 思路:这个题怎么说呢,迷惑性很大,题目里说了交换了两个集合的时候如果有相同元素不能交换,感觉如果没 这句话能很快写出来, 其实当交换的两个集合有重复元素的时候只要交换那 ...
- Centos 7.2 安装 Python 3.5(适用于Python 3所有版本安装)
提示:我们必须不能破坏系统的环境.因为几个关键的应用程序依赖于Python 2.7.5(centos 7默认版本).如果替换了系统的Python环境就会发生很多难以预见的错误,甚至要重装系统. 安装前 ...
- 问题:SpringBoot访问不到Controller
SpringBoot正常启动,其它配置都正常,以下是控制台打印: 解决方法: 将controller与application配置文件同层,是访问时无法扫描到相应的controller,故无法映射到相应 ...
- eschop购物实现立即购买和加入购物车
后台=>平台=>商店设置=>购物流程 是否一步购物设置为否 2:修改代码 .js/common.js function addToCartShowDivResponse(result ...
- .NET之类型转换
说起类型转换大家很容易的就会联想到将int类型转换成float类型或者是将double类型转转成int类型之类的转换.当然这可能是大多数人最先接触到的转换方式,也是最简单的转换方式.所谓转换就是从现有 ...
- Am335x SPI 驱动测试
内核版本:3.14.65 CPU:Am335x 1.编译内核: make menuconfig Device Drivers -> <*>SPI support -> < ...