終于有點時間寫這樣一些文字,來介紹我前些時間寫的搜狐陽光牧場外掛。
其實這樣的一個外掛沒有什么高深的技術,只需要使用2個輔助工具和1門你熟悉的編程語言就OK了。
廢話不多說,我就開門見山直接介紹了。
你需要準備2個工具:HttpWatch(或HttpAnalyzer),以及JSONViewer(http://www.codeplex.com/JsonViewer)
HttpWatch(或HttpAnalyzer)是收費軟件,JSONViewer是free的。另外你也可以安裝Firefox的JSONView插件,也可以不用JSONViewer。
編寫任何一個WEB應用外掛,第一步肯定都是登錄。只有正確登錄了,才能繼續后面的操作。
我們先拿HttpWatch來分析一下搜狐白社會的登錄過程。
第一部分:登錄1、打開http://bai.sohu.com,如果你以前已經登錄了,先退出來到要求你輸入email和密碼的頁面
2、按下HttpWatch的Record按鈕,然后在頁面上輸入Email和密碼,點登錄。然后你會進入白社會首頁。這個時候看一下HttpWatch記錄的軌跡,如下:

上面的圖中我添加了filter,把圖片什么的過濾掉了。
3、通過上面HttpWatch記錄的軌跡,我們很容易看到,登錄的真實URL是:
http://passport.sohu.com/sso/login.jsp?userid=你的E-MAIL賬號&password=密碼串&appid=1062&persistentcookie=1&s=1248665199215&b=2&w=1440&pwdtype=1
上面地址中,userid是你登錄時輸入的email地址,password是經過md5加密的字符串,s是時間(1970-1-1到現在的秒數,應該是這個賬號注冊的時間。在C語言中可以用time()函數來產生),w應該是計算機屏幕X方向的分辨率,persistentcookie表示保存cookie,b和pwdtype是一個常量,不知道具體含義(我們也不需要關心)。
OK,通過上面我們看到的URL,就可以完成賬號登錄了。
第二部分:進入陽光牧場1、打開HttpWatch的Record,點擊首頁左側的“陽光牧場”,HttpWatch會將每個頁面動作都記錄下來。我們可以看到,陽光牧場的真實地址是http://bai.sohu.com/app/farm/。在HttpWatch中選中http://bai.sohu.com/app/farm/這條記錄,在下方的Content頁簽中,可以看到這個頁面的source code:

2、你可以把這個頁面的source code復制出來,到dreamweaver或其他編輯器中查看,你會發現,這個網頁其實包含了幾個iframe。其中有一個iframe,才是真正的、中間那個陽光牧場的大flash的地址:
<iframe src="http://sh_farm.rekoo.com/embed_swf/?so_sig_uid=6位數字&so_sig_session_key=UXdkRmZMaUxFQjg9&so_sig_sig=049fa15390e4c9acffbecac8870e83c1" frameborder="0" width="796" height="590" scrolling="no"></iframe>在上面的地址中,so_sig_uid就是你在搜狐白社會網站的用戶ID,這個ID對一般用戶來說沒什么用,是每個用戶在數據庫中的標識。但是對我們編寫外掛來說,就很有用了,所以在這個地方,你需要將這個ID保存下來,以后要用到。
3、在瀏覽器中輸入http://sh_farm.rekoo.com/embed_swf
/?so_sig_uid=6位數字&so_sig_session_key=UXdkRmZMaUxFQjg9&so_sig_sig=049fa15390e4c9acffbecac8870e83c1,你會發現瀏覽器中只留下剛才我們看到的中間的那個大flash了,其他的通通都沒有了。事實證明我們找到的這個iframe是正確的。(注:執行此步驟時,別忘了打開HttpWatch的Record)
4、在HttpWatch中選中上面的地址,觀察一下返回的Content:

5、在上面我選中的高亮部分中,你能看到session_name、session_value、uid等一些信息。其中對我們非常重要的一個值就是session_value。有過web開發經驗的朋友都知道,登錄后,在站點中是有一個session在client端維護著用戶的一些信息,并且這個session是每次登錄都會產生的隨機字符串,并且有一定的有效期(由管理權配置)。所以,我們要模擬web的動作,就需要拿到正確的session字符串,也就是上面我們看到的那個session_value。
其實到目前為止,我們的分析工作已經進行了一大半了。簡單總結一下:
我們上面做了那么多事情,最重要達到兩個目的:
(1)如何模擬用戶登錄
(2)獲得正確的UID和sessionid
另外,關于sessionid的獲取還有其他方法,例如,如果你使用的是Java,可以從cookie中讀取到sessionid。
第三部分、分析陽光牧場各種操作有了上面的基礎,下面的分析簡直是易如反掌了。
1、打開HttpWatch的Record,將上面的http://sh_farm.rekoo.com/embed_swf
/?so_sig_uid=6位數字&so_sig_session_key=UXdkRmZMaUxFQjg9&so_sig_sig=049fa15390e4c9acffbecac8870e83c1
重新刷新一下。
2、在HttpWatch中,你會看到很多這樣的地址:http://sh_farm.rekoo.com/get_api/,這個地址那可是相當的重要啊,幾乎所有的命令請求都是往這個地方發。
3、選中http://sh_farm.rekoo.com/get_api/
,在下面的POST Data中可以看到:

原來這是一個標準的http post請求,完整的URL就是:
http://sh_farm.rekoo.com/get_api/?method=user.get_friends&rekoo_killer=你的6位UID&sessionid=剛才我們從頁面上獲取到的session_value
然后我們點擊旁邊的Content頁簽,看到服務器返回的內容如下:

上面是典型的JSON數據,接下來怎么做不用我說了吧。你可以把上面的內容復制到JSONViewer中,它提供了樹形結構供你方便的展開每個節點,以分析父子關系、每個節點的類型等信息:

4、上面我們看到的是獲取好友列表的請求,其他的諸如獲取商店信息、殺蟲澆水、播種、收割……請求地址都是http://sh_farm.rekoo.com/get_api/,只不過post的參數不同而已。將正確的參數post給服務器,服務器就會返回相應操作的JSON數據給你,有了這些數據,你就可以進行后期的分析處理了。
OK,通過上面文字的介紹,相信各位已經明白了,這樣的一個外掛是怎么工作的了。