我們在寫灌水機器人、抓資源機器人和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記 錄,以免對抓包分析造成影響,然後開啟抓包程序。
2.在IE中輸入 http://zh.sdo.com/web1.0/home/fastlogin.asp 這個快速登錄地址,我們將看到已經抓到 了很多請求和響應的包。
3.輸入用戶名和密碼,點擊登錄,IE中正常登錄,停止抓包 ,我們要的所有信息都被抓取好了。如圖:
4.盛大的 登錄機制還是屬於比較復雜的,中間涉及到好幾個服務器,經過分析得知(這個就是一個比 較漫長的過程了,具體網站具體分析,這個分析過程我就不寫了)縱橫天下的登錄機制為:
1)IE請求https://cas.sdo.com:80/cas/login? service=http://zh.sdo.com/web1.0/home/index.asp頁面,該頁面給IE一個SessionID,比 如Set-Cookie: ASP.NET_SessionId=avcbse55l5e03suqi4dx3555; path=/
2)IE同時 在該HTTP的正文中得到一個ticket,這個ticket將在登錄中有用,當然其他網站肯定不是這樣 做的,這裡分析的是縱橫天下的。location.href = http://www.sdo.com/login2.asp?lt=sd-1420e593-d2cf-4c9c-b249-07fe27932a21-2008-05 -06_01%3a25%3a41.484&service=http%3a%2f%2fzh.sdo.com%2fweb1.0%2fhome% 2ffastlogin.asp%3ftest%3d1; 這裡lt參數就是我說的ticket了。
3)將獲得的lt、 用戶名、密碼還有一些其他的無關緊要的參數都Post到 https://cas.sdo.com:80/cas/Login.PostTarget.aspx? service=http://zh.sdo.com/web1.0/home/fastlogin_after.asp 中,具體抓到的Post的數 據如: warn=false&_eventId=submit&idtype=0&gamearea=0&gametype=0&cha llenge=3623<=sd-1420e593-d2cf-4c9c-b249-07fe27932a21-2008-05-06_01%3A25% 3A41.484&username=studyzy&password=1234&ekey=&challenge=3623,這 裡我們就只關心lt,username,password這三個參數。
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();
代碼我就不都貼出了,我做了 一個Demo在附件中,大家有興趣研究的可以看一下。
代碼中實現了盛大賬號的登錄, 其實縱橫天下的登錄還沒有完成,接下來還有選擇具體服務器,將ticket轉到具體服務器上 再進行驗證,原理也是一樣的,我這裡就不再累述了。
成功登錄後,接下來我們只需 要每次發送請求是跟上該Cookie,服務器就認為是登錄的用戶在操作了,接下來就可以隨便 灌水、Download資源了,具體要做什麼就大家自己弄了,只需要在IE中操作一篇,抓包分析 出來,用C#實現同樣的發包就OK!
http://www.cnblogs.com/studyzy/archive/2008/05/06/1184341.html
本文配套源碼