我們在寫灌水機器人、抓資源機器人和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這三個參數。