注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Hao的博客

I'm on my way……

 
 
 

日志

 
 
 
 

C#网页交互基础之模拟登陆  

2010-07-08 13:11:52|  分类: 编程杂记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

      当我们通过浏览器进行登陆操作时,浏览器就会将我们的登陆请求以及用户名和密码等信息以数据包的形式发给目标服务器。目标服务器在验证数据包中的信息后就会返回相应页面的html代码(当然也是以数据包的形式返回的),并通过我们的浏览器显示出来。上述的整个过程大多数情况下都是通过http协议来完成的,浏览器发送http请求包,目标服务器发送http响应包,每种数据包都有自己的组织形式(详见HTTP Headers【转】)。所以我们在进行模拟登陆操作之前,首先要通过抓包工具捕获到相应的数据包,分析出http请求数据包是以何种方法发送的(GET或是POST),然后再通过.net中自带的类模拟浏览器发送请求,最后接收服务器的响应数据包并进行下一步操作。


第一步 分析数据包

下面以WireShark这款软件捕获的一个数据包为例。

C网页交互基础之模拟登陆 - chhaj5236 - chhaj5236的博客
1. 最上面蓝色标记的一行显示了这个数据包时通过POST的方式发送的。
2. 标记为3的一行显示了目标服务器的主机名,标记为1的一行显示了文件目录,将3和1组合起来即得到了完整的url: http://passport.blogcn.com/passport/login.action
3. 最下面蓝色标记的一行显示了随数据包发送的附加信息,可以看到最后面有一个username和password,显然这一行就包含了我们输入的一些数据包括认证信息。当以GET方式发送时,这些信息一般是直接加在URL的后面,也就是说在标记为1的一行就可以看得到。
4. 标记为2的一行显示了一些额外的信息,这些信息的含义基本都在HTTP Headers【转】一文中有详细的解释。

 第二步 创建http请求

.net中创建http请求是通过HttpRequest类来实现的。

1. 如果是GET方法,附加信息就会直接添加到url的末尾,实现代码如下:

//用url实例化HttpWebRequest类
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);

//填充数据包的信息,填充的值都是在数据包查找对应的信息得到的
request.CookieContainer = cookieContainer;
request.Referer = url;
request.ContentType = contentType;
request.Accept = accept;
request.UserAgent = userAgent;
request.Method = "GET";

2. 如果是POST方法,就要给请求添加必要的附加信息,实现代码如下:

//postData中存储了附加信息,转化为默认编码方式
byte[] byteRequest = Encoding.Default.GetBytes(postData);
  

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.CookieContainer = cookieContainer;
request.Referer = url;
request.ContentType = contentType ;
request.ContentLength = byteRequest.Length;  //附加信息长度
request.Accept = accept;
request.UserAgent = userAgent;
request.Method = POST";

//将附加信息写到http请求中
Stream stream = request.GetRequestStream();
stream.Write(byteRequest, 0, byteRequest.Length);
stream.Close();

到这里为止,GET方法和POST方法的区别应该是很清晰的了 。


第三步 发送http请求并接收响应

HttpWebRequest中有一个方法GetResponse(),当调用这个方式时就会发送上面定义的http请求,并返回服务器端的结果,代码如下:

HttpWebResponse response = (HttpWebResponse)request.GetResponse();


第四步 获得返回页面的html代码

Stream stream = response.GetResponseStream();  //转换为数据流
StreamReader reader = new StreamReader(stream);

string html=reader.ReadToEnd();   //通过StreamReader类读取流
reader.Close();
stream.Close();


      在通过上面的代码实现登陆之后,可以将html变量的值输出到TextBox之类的控件上,与通过浏览器登陆后得到的网页代码进行比较,如果完全相同就说明登陆成功了。有些网站在发送用户密码等验证信息前会先将信息进行加密处理,这就需要密码学方面的知识了。登陆成功之后还会有很多操作,比如获取用户的信息、模拟网页操作等,都是比较复杂的操作。这里就不讨论了,因为我也不懂~。等以后再写吧~~

  评论这张
 
阅读(4660)| 评论(4)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017