我們在寫灌水機器人、抓資源機器人和Web網游輔助工具的時候第一步要實現的就是用戶登錄。那麼怎麼用C#來模擬一個用戶的登錄拉要實現用戶的登錄,那麼首先就必須要了解一般網站中是怎麼判斷用戶是否登錄的。
HTTP協議是一個無連接的協議,也就是說這次對話的內容和狀態與上次的無關,為了實現和用戶的持久交互,網站與浏覽器之前在剛建立會話時將在服務 器內存中建立一個Session,該Session標識了該用戶(浏覽器),每一個Session都有一個唯一的ID,第一次建立會話時服務器將生成的這 個ID傳給浏覽器,浏覽器在接下來的浏覽中每一個發向服務器的請求中都將包含該SessionID,從而標識了自己的身份。
服務器上是使用內存來保存Session中的信息,那麼浏覽器又使用什麼來保存服務器分配的這個SessionID了對,是Cookie。在剛建立 會話時浏覽器向服務器的請求中將不包含SessionID在Cookie中,服務器就認為是一個全新的會話,從而在服務器上分配一段內存給該 Session用,同時將該Session的ID在Http Header中使用Set-Cookie發送給浏覽器。
現在原理已經搞清楚了,那麼我們就來實現一個網站的登錄嘛。下面以某某大學的管理信息系統來進行檢驗(注意:這裡的缺陷就在於沒有驗證碼的識別和多個服務器的跳轉)難度相對來說要小很多。
首先先用httpAnaly或者是httpwatch等專用的抓包工具,來獲取網頁提交時候的數據信息和頭信息。以下代碼包含了登陸和在登陸後獲取另一個頁面數據信息。
1 private void Form1_Load(object sender, EventArgs e)
2 {
3
4 string username = "xxxx";//用戶名
5 string password = "xxxx";//密碼
6 //新建一個用於保存cookies的容器
7 CookieContainer container = new CookieContainer();
8 //拼接post數據
9 string postData = ("username=" + username);
10 postData += ("&passwd=" + password);
11 postData += ("&login=%B5%C7%A1%A1%C2%BC");
12 ASCIIEncoding encoding = new ASCIIEncoding();
13 byte[] data = encoding.GetBytes(postData);
14 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://xxxx/xxxx/login.asp");
15 request.Method = "Post";
16 request.ContentType = "application/x-www-form-urlencoded";
17 request.ContentLength = data.Length;
18 request.KeepAlive = true;
19 request.CookieContainer = container; //返回的cookie會附加在這個容器裡面
20 //發送數據
21 Stream newStream = request.GetRequestStream();
22 newStream.Write(data, 0, data.Length);
23 newStream.Close();
24 //以下倆句不可缺少
25 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
26 response.Cookies = container.GetCookies(request.RequestUri);
27
28 HttpWebRequest requestScore = (HttpWebRequest)WebRequest.Create("http://xxxx/xxxx/Score.asp");
29 postData = "term=&TermList=%C7%EB%D1%A1%D4%F1&ckind=&lwPageSize=100&lwBtnquery=%B2%E9%D1%AF";
30 data = encoding.GetBytes(postData);
31 requestScore.Method = "Post";
32 requestScore.ContentType = "application/x-www-form-urlencoded";
33 requestScore.ContentLength = data.Length;
34 requestScore.KeepAlive = true;
35
36 //使用登陸的cookies通過接下來的驗證
37 requestScore.CookieContainer = container;
38 Stream stream = requestScore.GetRequestStream();
39 stream.Write(data, 0, data.Length);
40 stream.Close();
41 HttpWebResponse responseSorce = (HttpWebResponse)requestScore.GetResponse();
42 StreamReader reader = new StreamReader(responseSorce.GetResponseStream(), Encoding.Default);
43 string content = reader.ReadToEnd();
44 textBox1.Text = content;
45
46 }