本帖最後由 bob 於 2013-6-28 09:38 編輯
在大家讀這篇教程前,最好先仔細閱讀qqmmcc版主的這篇教程,基礎知識及精華都在這裡面
[網絡] 【 POST/GET教程】登錄QQ空間發表日誌&POST上傳相冊圖片
我這篇教程只是對上面教程做一個擴展及對下面代碼做一個註釋說明
QQ自動登錄,自動收發信息
上面的代碼寫的確實簡潔漂亮,但對生手來說可能就比較晦澀難懂了,這也是我這篇教程的出發點,著重點講的是思路,相關工具使用和數據分析,能讓剛接觸這塊的快友能自己上手!
一、需求工具
一般網站數據分析所需工具:瀏覽器+網絡抓包工具
1)、IE瀏覽器,網絡抓包工具可用第三方的軟件,如HTTP Analyzer,HttpWatch,fiddler2等
2)、firefox瀏覽器,網絡抓包工具可安裝擴展工具firebug
3)、chrome瀏覽器(包括360極速,獵豹等雙核瀏覽器,指核心是chrome之類的瀏覽器),網絡抓包工具可使用自帶的開發者工具,按快捷鍵F12即可出來。
當然,firfox和chrome瀏覽器也可以如IE瀏覽器一樣使用第三方軟件做為抓包分析工具。
如本文要講的在手機上登陸的網站,即WML格式的網頁,除了上述要求外,還需能解析WML的工具
1)、 firefox瀏覽器開安裝擴展工具 wmlbrowser
2)、 chrome瀏覽器也可安裝擴展工具wmlbrowser,但這個擴展比較難尋找,我這提供遠程安裝地址:
https://github.com/izml/arc/raw/master/crx/wmlbrowser.crx
本文教程使用 chrome瀏覽器+wmlbrowser+系統自帶的抓包分析工具 來講解
二、初步測試及思考
1)、在chrome瀏覽器安裝好 wmlbrowser擴展後,我們就可以輸入手機QQ空間網址了 http://z.qq.com/
2)、如上圖所示,終於打開了登陸頁面,不知大家有沒有注意到地址欄,怎麼z.qq.com地址一下子就變得這麼長了,是跳轉了嗎?這個地址是登陸頁面的真實地址嗎?下次用這個地址登陸就行了嗎?
解決問題方式,就是多動手多測試,我們關掉剛才頁面,再打開z.qq.com這個地址,再對比下剛才出現的長網址。
3)、 ,怎麼對比結果發現每次登陸頁面的網址不一樣了,如兩圖紅圈處所示,我們該如何取得這個地址呢?這時候,我們就改出動抓包工具來查查底細了!
三、抓包工具的初應用
1)、按快捷鍵F12,發現瀏覽器下方多了一個窗口出來,我們再次輸入z.qq.com這個地址並訪問,打開登陸頁面後,我們在點擊抓包工具中的network,會發現一些數據出來
2)、我們選中抓包工具中剛發現的z.qq.com這個路徑地址,在右側你會發現有一串地址正好和地址欄中的是一樣的
1.jpg (108.76 KB, 下載次數: 1196)
下載附件
保存到相冊
2013-6-24 10:32 上傳
3)、從抓包數據中我們可以看到真實跳轉後的地址,也可能看到它是通過GET方式獲取的,下面我就轉到AAU代碼,將抓包分析結果轉為應用。
四、分析結果轉AAU代碼
1)、從第三步中,我們可以看到通過get模式訪問z.qq.com就能獲取真實的URL,現在我們用AAU代碼來模擬下這個過程
源代碼 [ aardio ]04 | var str=http.get( "http://z.qq.com" ); |
09 | execute ( "pause" ) //按任意鍵繼續 |
2)、從上面代碼運行的結果我們可以看到一串地址,稍微懂點HTML等語言的,就能看到這其實就是真實的跳轉地址來著
3)、我們需要就是這個登陸頁面的真實地址,因為下一步正式登陸時候就是從這個地址跳轉的,而不是之前的z.qq.com地址。從字符串中匹配出真實地址,這個相信大家比較熟練了,我們還是擴充下上面的代碼
源代碼 [ aardio ]04 | var str=http.get( "http://z.qq.com" ); |
05 | url = string.match(string.fromto(str), 'ontimer="(.*?)"' ) |
10 | execute ( "pause" ) //按任意鍵繼續 |
五、關鍵post登陸抓包分析
1)、獲得真實登陸頁面地址後,我們就開始本教程的重點了,POST登陸分析。一樣的在登陸界面,先開啟抓包工具,然後輸入QQ號和密碼點登陸,再查看抓包工具中的network下數據
2)、從上圖可看出,已登陸成功,進入了手機QQ空間。抓包工具下的path路徑有很多,選擇method屬性為post(為什麼用POST,我們後面會講到這點),也就發現上面畫圈處一條,選中這個地址,看右側從登陸窗口提交過來的表單數據
中途插播點POST和GET知識:
一般在瀏覽器中輸入網址訪問資源都是通過GET方式;在FORM表單提交中,可以通過Method指定提交方式為GET或者POST,默認為GET提交。
簡單可理解為,GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息。
GET提交,請求的數據會附在URL之後,以?分割URL和傳輸數據,多個參數用&連接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果數據是英文字母/數字,原樣發送,如果是空格,轉換為+,如果是中文/其他字符,則直接把字符串用百分號編碼(也就是URL編碼),得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進製表示的ASCII。
例如:用百度搜索aau.cn,即使用get查詢,查詢結果頁面地址為 http://www.baidu.com/s?wd=aau.cn ... mp;ch=&tn=baidu
POST提交方式和get類似,POST數據附在URL之後,POST數據如有多個參數則用&連接.
不同的是GET提交的數據會在地址欄中顯示出來,如果有用戶名和密碼等參數,都將以明文出現在URL上,而POST提交地址欄不會改變的,這也就是為什麼在用戶登陸等表單提交都需要用POST方法的原因
3)、從圖中紅框裡面數據所看到的,qq、pwd、login_url、go_url、sidtype、aid及後面的值,即為POST要傳遞的參數和參數值。點擊view source,即可看到連串起來的參數,這個也就是我們稍後要提交的POST數據,抓包工具直接展現出來是更直觀明了便於我們分析的數據。
下面我們用第三方的抓包工具也來演示下所抓到的數據
4)、從第3步中,我們已找到url(即path下的地址)和POST數據,是不是現在就可以開始寫代碼了?事實不然,我們多測試幾次多查看下抓包數據,會發現找的url地址在變,參數中的login_url地址也在變,現在我們就返回登陸頁面去找到這個變化的地址。
六、查用源代碼分析及寫AAU代碼測試
1)、我們還是借用抓包工具來進行元代面分析,在登陸界面,鼠標焦點選中QQ號碼輸入框,然後右鍵選擇審查元素,即可跳轉到此輸入框所對應源代碼處。
2)、箭頭向右的標籤都是包含內部標籤的,點擊箭頭可以展開標籤,我們將form表單內的標籤全部展開,顯示網頁源代碼如下
從上圖畫圈處可看到,action後的地址即是5-4中所要找的url地址,也就是稍後aau代碼要用到的post地址,method後面的屬性為post,也就順便解答了4-2中為什麼直接選中post所對應的path地址原因了。登陸界面輸入框中的數據即為要傳遞的POST參數,在代碼中input標籤對應的value值就是,這裡我也可以看到4-4中所要找的login_url地址。為什麼後面幾個參數沒有輸入框了,因為騰訊的代碼中把這幾個標籤給隱藏了,會html代碼的一看就明白。
3)、至於我們剛才從源代碼中所找到的url及login_url地址是否為我們所需的,其實我們可以自己對比測試一下。在登陸界面用剛才方式記下url和login_url地址,然後再登陸抓包,類似4-3中的操作方式,對比相應的url和login_url地址,如果相同則我們剛才所找到數據是正確的。
4)、剛才演示的是用抓包工具來進行源代碼分析,但我們最終是要轉移到代碼上去,我們再改寫下5-1中的代碼,來查看下登陸窗口頁面,用aau查看的源代碼是什麼樣的,post所需要的地址和參數數據是否也能找到
源代碼 [ aardio ]04 | var str=http.get( "http://z.qq.com" ); |
05 | url = string.match(string.fromto(str), 'ontimer="(.*?)"' ) |
07 | var str2=http.get(url); |
10 | io.print(string.fromto(str2)); //網頁為UTF-8,所以需要string.fromto來轉碼,不然中文會顯示亂碼 |
12 | execute ( "pause" ) //按任意鍵繼續 |
5)、我們從上一步代碼顯示結果中,仍然可以找到從源代碼分析出來的地址。可能部分人會問到http.get的結果和右鍵查源代碼結果為什麼有這麼大區別,原因是右鍵源代碼已把WML標籤轉成了HTML標籤,結果不同處體現在標籤不同上。
6)、我們使用類似4-3中的匹配原理,把url和login_url匹配出來
源代碼 [ aardio ]04 | var str=http.get( "http://z.qq.com" ); |
05 | url = string.match(string.fromto(str), 'ontimer="(.*?)"' ) |
07 | var str2=http.get(url); |
08 | posturl = string.match(string.fromto(str2), 'go href="(.*?)"' ) |
09 | login_url = string.match(string.fromto(str2), 'login_url.*?value="(.*?)"' ) |
12 | io.print(string.fromto(str2)); |
16 | execute ( "pause" ) //按任意鍵繼續 |
六、最終的POST登陸代碼
其實寫到上一步,這篇教程就已結束了,分析過程及需要的數據都已出來了,剩下的就是把數據搬到代碼上去就行了。不過,騰訊網站喜歡玩「仙人跳」,post後的頁面地址並非最終已登陸所顯示的頁面,中間還有跳轉兩次,這過程就留給大家去完成吧!另外,下面代碼中用了string.concat函數,是為了讓代碼更直觀些,實際上此處數據和5-3的第二圖箭頭所指數據一樣。
源代碼 [ aardio ]04 | var str=http.get( "http://z.qq.com" ); |
05 | url = string.match(string.fromto(str), 'ontimer="(.*?)"' ) |
07 | var str2=http.get(url); |
08 | posturl = string.match(string.fromto(str2), 'go href="(.*?)"' ) |
09 | login_url = string.match(string.fromto(str2), 'login_url.*?value="(.*?)"' ) |
11 | str3 = http.post(posturl, |
14 | "&pwd=" , "xxxxxxx" , //密碼 |
15 | "&login_url=" ,inet.url.encode(login_url , true ), |
16 | "&go_url=" ,inet.url.encode( "http://z.qq.com/index.jsp" , true ), |
23 | io.print(string.fromto(str3)); |
25 | execute ( "pause" ) //按任意鍵繼續 |
|