1. 程式人生 > >網頁外掛技術淺談(入門篇)

網頁外掛技術淺談(入門篇)

其實網頁外掛所用的技術很簡單,只不過這是一個技術上的禁區,極少有書籍和資料介紹而已。
在繼續往下看之前,你至少需要了解:
1.http協議的基本含義
2.socket通訊基礎
3.一門常規開發語言及軟體開發基礎
4.動態網頁技術基礎

網頁遊戲採用的通訊協議多種多樣,常見的有:
1.純http。如:商業大亨、36計、天問等。
2.AMF協議。AMF協議是一種擴充套件的http協議,採用該協議的頁遊一定是flash的,如:熱血三國、絕地戰爭等。
3.socket協議。此類頁遊更接近傳統的客戶端網遊,採用加密的資料包進行通訊,製作外掛難度遠遠超過上述2種。
4.其他。

協議分析
想要製作一個頁遊的外掛,我們首先要知道它是採用什麼協議進行通訊的,我們需要用網路監聽軟體進行協議分析。
推薦:
1.HTTPAnalyzerFullV5。強大的http通訊監聽軟體,可以分析純http和AMF通訊。
各大下載站點均有下載,能下載到註冊機。
2.科來網路分析系統 2010 技術交流版。目前最好用的全方面網路分析軟體,用於分析socket通訊最方便。
這是國產品牌,可到官方網站下載,然後用email申請一個免費序列號即可。

作為初學者,我們從純http的頁遊入手。
執行HTTPAnalyzerFullV5,然後開啟網頁,進入遊戲。點選HTTPAnalyzerFullV5上的"start"開始監聽,然後在遊戲中隨便進行點操作,這個時候HTTPAnalyzerFullV5中應該會有資料展現了。在資料表格的Type一欄,我們可以看到資料的型別。
如果每進行一個遊戲操作,HTTPAnalyzerFullV5中都增加一條Type為text/html的通訊記錄,那麼無疑這個頁遊是採用純http協議的。
如果每進行一個遊戲操作,HTTPAnalyzerFullV5中都增加一條Type為application/x-amf的通訊記錄,那麼這個頁遊一定是採用AMF協議的。

下課了,實踐一下協議分析吧。

繼續...如果我們發現手上的這款遊戲是純http協議的遊戲,比如36計、天策、天問之類的,該如何入手呢。
先看下HTTPAnalyzerFullV5抓到的資料吧。
從HTTPAnalyzerFullV5的介面可以看到,HTTPAnalyzerFullV5分為上下兩欄,上面是資料列表,下面是選中的一條通訊的具體資料。
在下面一欄中,我們主要關心的是3項資料:
1.Header。這是http通訊的包頭,從這兒我們可以看到host、cookies、referer之類的資料。
2.Response Content。這是伺服器方的響應資料,也就是這次通訊從伺服器端得到的內容,是遊戲裡面的相關資料。格式可能五花八門,但一般說來是可以理解的字串。比如:"{兵種:步兵;數量10000;速度:5}"或者"{恭喜你,升級成功。}"之類的資料,當然一般說來是英文表達的,你必須得讀懂它。
3.Post Data。這是客戶端的傳送資料,也就是指你在遊戲中進行了什麼操作。對於純http協議的頁游來說,這一項經常為空,因為每條遊戲指令的引數可能是直接寫在url中。
以36計為例,我們進入遊戲,開啟監聽,點一下英雄府升級,此時HTTPAnalyzerFullV5中獲得一條新的通訊資料。如果我們能用軟體模擬這次通訊,那麼就相當於在軟體中進行英雄府升級了。
對於純http通訊的模擬,我推薦使用XMLHTTPRequest方法。
XMLHTTPRequest是存在於msxml2.dll中的一個函式,msxml2.dll在任何一臺windows中都有。而且這是一個AxtiveX的DLL,能被任何開發語言呼叫,甚至是被網頁呼叫。
XMLHTTPRequest的作用是:對指定的伺服器發起一個http請求,並獲取返回的資料。
XMLHTTPRequest在各種語言下都能找到大量的例程,只需要上網搜尋一下即可。

下面,瞭解一下XMLHTTPRequest並寫個簡單的程式來獲取baidu首頁的內容吧,這是網頁外掛最基礎也是最核心的技術。
XMLHTTPRequest的VB簡單示例:
set xhttp = createObject("msxml2.XMLHTTP")  
xhttp.open "POST", "http://www.baidu.com", False  ‘False表示不採用非同步方式
xhttp.send
ret = xhttp.responseText  'ret即返回內容,此處為百度首頁的內容
這是使用XMLHTTPRequest同步呼叫方法,缺點是當內容沒有返回時,軟體會一直處於等待狀態,不能幹其他任何事,所以我們一般採用非同步方式呼叫。
非同步方式與此大同小異,上網搜尋一下吧。

在36計中,假如升級英雄府的referer是"http://36ji.com/updatehouse.php?houseid=1",那麼我們在軟體中用XMLHTTPRequest模擬一次這個url的請求,就會在返回內容中看到諸如"{英雄府已經成功升級}"之類的文字。同時你會發現,遊戲中的英雄府真的升級了!

當然在這之前,還有個很重要的工作就是登入。
要實現在客戶端登入有2種方案:
1.在客戶端嵌入IE元件,使用者在IE元件中開啟遊戲網頁登入,那麼這個IE元件就獲得了登入憑證,這個憑證在動態網頁技術中通稱:Session。
2.分析登入過程,自己用程式碼實現登入過程,然後儲存登入憑證Session備用。

考慮到網頁遊戲一般都由多個運營商聯運,所以如果自己寫離線的登入比較麻煩,要針對每個不同的運營商的登入介面寫登入過程,所以一般推薦用嵌入IE登入。
嵌入IE登入很簡單,在你的程式中放入一個IE元件,使用者在這個IE元件中開啟遊戲網頁,完成登入。
這裡要提到XMLHTTPRequest的一個重要特性。
XMLHTTPRequest本身是不能為其設定Session的(深入瞭解動態網頁技術的朋友可能瞭解,設定Session其實就是設定Cookies,雖然二者並不一樣。)。但是XMLHTTPRequest會自動獲得應用程式本身獲得的Session,也就是說,在你自己的程式中嵌入了IE,如果使用者在這個IE中完成了登入,那麼這個程式中的XMLHTTPRequest將自動獲得IE中的所有Session。
這個特性是把雙刃劍,一方面,它給開發帶來了便利,我們不再需要對XMLHTTPRequest設定登入憑證;另一方面,這意味著我們的程式執行一次只能開一個賬號,不能實現子窗體多開的效果。如果要實現子窗體多開的效果,我們則需要使用其他更為靈活的http訪問元件。
作為初學者,還是推薦使用XMLHTTPRequest,畢竟簡單易用。

如果你完全理解了上述內容,那麼你就應該有個大概的流程模型。
1。監聽遊戲過程,獲取http請求細節。
2。在程式中嵌入IE,通過IE登入獲取登入憑證。
3。使用XMLHTTPRequest模擬http請求。

入門篇介紹到這兒,接下來我們將進行初級實戰篇。我們以36計這個遊戲作為練手物件,因為這個遊戲的通訊既不太難,也不至於太簡單。