咱们在写灌水机器人、抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登陆。那么怎么用C#来模拟一个用户的登陆拉?要实现用户的登陆,那么首先就必需要了解通常网站中是怎么判断用户是否登陆的。
HTTP协议是一个无链接的协议,也就是说此次对话的内容和状态与上次的无关,为了实现和用户的持久交互,网站与浏览器以前在刚创建会话时将在服务器内存中创建一个Session,该Session标识了该用户(浏览器),每个Session都有一个惟一的ID,第一次创建会话时服务器将生成的这个ID传给浏览器,浏览器在接下来的浏览中每个发向服务器的请求中都将包含该SessionID,从而标识了本身的身份。
服务器上是使用内存来保存Session中的信息,那么浏览器又使用什么来保存服务器分配的这个SessionID了?对,是Cookie。在刚创建会话时浏览器向服务器的请求中将不包含SessionID在Cookie中,服务器就认为是一个全新的会话,从而在服务器上分配一段内存给该Session用,同时将该Session的ID在Http Header中使用Set-Cookie发送给浏览器。
如今原理已经搞清楚了,那么咱们就来实现一个网站的登陆嘛,这里就以盛大纵横天下的登陆为例。
要写这种面向协议的网络程序,抓包工具是少不了的,咱们首先是要使用抓包工具分析在普通浏览器中登陆时发送和接收的内容才好进一步使用C#来模拟浏览器发包。抓包工具不少,看我的爱好吧,我主要用的是HTTP Analyzer,专门针对HTTP的,太强的抓包工具把什么协议的包都抓出来反而不利于咱们分析。
1.最好能清除IE的全部Cookie记录,以避免对抓包分析形成影响,而后开启抓包程序。
3.输入用户名和密码,点击登陆,IE中正常登陆,中止抓包,咱们要的全部信息都被抓取好了。如图:
4.盛大的登陆机制仍是属于比较复杂的,中间涉及到好几个服务器,通过分析得知(这个就是一个比较漫长的过程了,具体网站具体分析,这个分析过程我就不写了)纵横天下的登陆机制为:
4)获取一个只有登陆後才能访问的页面,测试是否登陆成功。
5.好,整个登陆机制咱们已经分析完了,接下来就是考虑代码的实现了。在面向HTTP协议上,C#中有WebRequest、WebResponse、HttpWebRequest和HttpWebResponse等类。咱们主要就基于这些类进行操做,固然彻底基于Socket编程也能够,可是这里就没有这个必要了。
在不设置Cookie、PostData的状况下要得到一个页面的HTML的方法很简单:
public
static
string GetHtml(
string URL)

{

WebRequest wrt;

wrt = WebRequest.Create(URL);

wrt.Credentials = CredentialCache.DefaultCredentials;

WebResponse wrp;

wrp = wrt.GetResponse();
return
new StreamReader(wrp.GetResponseStream(), Encoding.Default).ReadToEnd();

}
当须要得到服务器返回的Cookie的话,能够经过wrp.Headers.Get("Set-Cookie")方法来获取。
若是须要将Cookie加入到请求另外还Post数据的话其实也很简单,只须要将httpWebRequest对象中设置ContentLength 和Request的Stream就能够了。

httpWebRequest.ContentLength = byteRequest.Length;

Stream stream;

stream = httpWebRequest.GetRequestStream();

stream.Write(byteRequest, 0, byteRequest.Length);

stream.Close();
Ctrl+Enter 发布web
发布编程
取消浏览器