咱們在寫灌水機器人、抓資源機器人和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
發佈編程
取消瀏覽器