瀏覽器分析模擬登陸過程
原文地址:http://www.crifan.com/use_ie9_f12_to_analysis_the_internal_logical_process_of_login_baidu_main_page_website/
【前提】
想要實現使用某種語言,比如Python,C#等,去實現模擬登陸網站的話,首先要做的事情就是使用某種工具,去分析本身使用瀏覽器去登陸網頁的時候,其內部的執行過程,內部邏輯。
此登陸的邏輯過程,主要指的是,需要訪問哪些地址,提交哪些http請求,其中包含了有哪些查詢關鍵字,涉及到哪些post的資料,涉及到哪些cookie等等。
只有知道了內部邏輯過程,才能談及,使用某種語言去實現,模擬,此套登陸網站的過程。
關於分析工具,其實有很多種,此處選用,之前在
所介紹的IE9的F12。
在分析之前,雖然不需要你有太多的網路相關的基礎,但是,如果真正想要熟悉分析網站抓取,模擬網站登陸的話,還是需要了解相關的知識的。
其中,和cookie相關的內容,可參考:
【使用IE9的F12分析登陸百度首頁的內部邏輯過程】
1.準備好工具,配置好工具
開啟IE9,開啟百度首頁:
按F12,調出F12工具,再切換到Network介面:
然後點選“Start capturing”開始除錯:
下面就來利用F12來除錯,分析登陸的內部邏輯。
不過,在除錯之前,先去做一些配置上的準備工作:
(1)設定網頁跳轉時,已抓取的資料不被清除掉
即設定:
Tools -> Clear entries on navigate中的Console和Network,都取消掉:
這樣,在網頁分析過程中,由於從一個頁面跳轉到另外一個頁面,所抓取的到內容,就不會被清空掉了。
(2)清除舊的cookie和快取
為了後續的除錯,不被之前的已登陸的賬戶的(快取和cookie等)資訊所影響,所以去都清除掉:
其中,簡單解釋一下是:
A。2個和清除cookie有關的:
Cache->Clear session cookies:清除當前會話,即訪問當前這麼一堆網頁所涉及的cookie
Cache->Clear cookies for domain:清楚和當前網頁所屬的domain,此處為.baidu.com相關的cookie;
B。2個和快取cache有關的
另外,為了清除的更徹底,往往也順帶把cache,即快取的網頁,也順帶都清理了:
Cache->Clear browser cache
Cache->Clear browser cache for this domain
更多關於F12如何使用的事情,還是去參考之前所寫的:
接下來的所有操作,實際上就是,在IE9中,手動操作一遍,登陸百度首頁的過程而已。
2.模擬操作過程,利用工具抓取所需的整個過程
點選“登陸”:
可以看到,除了網頁中跳出你所熟悉的登陸對話方塊之外,F12除錯視窗中,就已經抓取到很多內容了。
然後輸入使用者名稱和密碼,正常登陸:
然後,就可以看到網頁調轉到了:
以及,對應的抓取到了很多內容:
好了,到此為止,我們的操作,基本就結束了。
剩下的,就是從我們所已經抓取到的資訊中,找到是如何登陸的。
3.分析網站登陸的內部邏輯過程
3.1找到登陸網站所涉及的最核心的地址
對於熟悉的人,可以直接從那一堆的url中,找到哪個是登陸的頁面。
而現在假定你不熟悉,教你如何找到真正的有價值的資訊。
對於此處,我們可以想到的一種辦法是,通過直接搜尋密碼,而搜到哪裡傳送了我們的密碼:
【小提示:顯示內容時,設定為 自動換行】
當抓取出來的Request Body,Response Body等部分的內容中,單行內容太長,一行顯示不下,不方便檢視時,可以點選右鍵,選擇Word wrap:
即可實現自動換行顯示的效果了,方便查看了:
此處,很容易看到,此處和我們密碼相關的url地址為:
即,以後如果想要寫程式碼的話,所要訪問的url地址,就是這個地址了。
3.2分析所提交的資料(post data)中的引數和值
而且,此處的Request Body,就是對應的http的POST請求中所要提交的資料,簡稱為post data。
此處Request Body中完整的資料為(注:以下資料,是另外一次分析出來的結果,對解釋分析過程無影響):
ppui_logintime=6852&charset=utf-8&codestring=&token=5ab690978812b0e7fbbe1bfc267b90b3&isPhone=false&index=0&u=&safeflg=0&staticpage=http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html&loginType=1&tpl=mn&callback=parent.bdPass.api.login._postCallback&username=crifan&password=xxxxxx&verifycode=&mem_pass=on |
然後處理一下就是:
ppui_logintime=6852& charset=utf-8& codestring=& token=5ab690978812b0e7fbbe1bfc267b90b3& isPhone=false& index=0& u=& safeflg=0& staticpage=http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html& loginType=1& tpl=mn& callback=parent.bdPass.api.login._postCallback& username=crifan& password=xxxxxx& verifycode=& mem_pass=on |
再去掉後面的那個&字元,變為:
ppui_logintime=6852 charset=utf-8 codestring= token=5ab690978812b0e7fbbe1bfc267b90b3 isPhone=false index=0 u= safeflg=0 staticpage=http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html loginType=1 tpl=mn callback=parent.bdPass.api.login._postCallback username=crifan password=xxxxxx verifycode= mem_pass=on |
很明顯,此處就是模擬網站登入的核心資料了,是在寫程式碼時,對於
提交POST請求時,所以要傳送的一些引數和值了。
此處,再重新簡要的介紹一下,模擬登陸網站的基本邏輯:
想要模擬網站登陸,就要知道,要向什麼url地址,傳送什麼樣的資料,GET請求還是POST請求。
-
GET請求只從伺服器請求資料,不需要所謂的post data,但是往往需要在url後面新增上對應的?para1=val1¶2=value2之類的形式,此部分叫做query parameter,其本質上,有點類似於post data;
-
POST請求,在傳送請求時,還需要提供對應的post data,此處即對應著IE9的F12中的Request Body。
-
而餘下的,傳送請求時的其他相關引數設定,主要就是設定很多基本的引數,包括user-agent等,此處對應著那個Request Headers
-
而提交請求後,網站的伺服器會給你反饋,返回資料和資訊給你。
此處對應的就是Response Headers和Response Body。
經常地,其中還涉及到cookie等資訊。在傳送之前,準備好,傳送給伺服器,伺服器返回的資訊中,往往也包含,更新後,cookie的值。
對應的這部分內容,是Cookies部分。
此處,把所有的內容,分別截圖如下:
Request Headers
Request Body:
Response Headers:
Response body:
Cookies:
接下來,就是分析,如何獲得所需的資訊。
先分析上述的post data中的值:
ppui_logintime=6852 charset=utf-8 codestring= token=5ab690978812b0e7fbbe1bfc267b90b3 isPhone=false index=0 u= safeflg=0 staticpage=http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html loginType=1 tpl=mn callback=parent.bdPass.api.login._postCallback username=crifan password=xxxxxx verifycode= mem_pass=on |
都是怎麼來的。
分析值是如何來的,以及順帶說說,寫程式碼時,如何設定這些值。
在此之前,先解釋一下,在程式碼中關於如何設定這些引數的值的規律和經驗:
(1)對於有引數,但是值為空的哪些引數,一般來說,都是可以省略的。
即寫程式碼時,是可以去掉,忽略掉,這些引數的;
當然,如果你抓取出來的引數是有值的,則需要考慮其值是怎麼得到的,是否有意義,否則隨便忽略掉某些引數,可能會導致模擬登陸失敗的。
(2)對於,看不太懂的引數的值的情況下,不妨先使用抓取出來的資料
尤其是一些引數,看不太懂,而且其值又明顯不是那種,很可能會變化的數字之類的值,則一般情況下,也都是固定的值,所以,即使對於引數和值本身不太瞭解,也無所謂,也都可以直接在程式碼中,直接使用抓取出來的資料即可。
即使會導致出錯,一般來說,也可以通過後續的多次抓取和分析,看出來該值真正的規律。
在上面那一堆引數和值中:
(1)一些很明顯,是固定的值,不需要考慮太多的值有:
charset=utf-8 -> 表示當前網頁的編碼是utf-8,我們寫程式碼照著寫即可,不需要改;
codestring= ->此處為空,所以也可以不理會;
isPhone=false -> 很明顯,此處是通過PC登陸百度的,不是通過手機類的移動裝置登陸的,所以是false。所以寫程式碼時,也設定為false即可;
細心的讀者,也很容易回想起,此處是對應著之前的登陸介面中的“手機登陸”:
如果是我們是通過“手機登陸”百度時,不出意外的話,肯定引數是isPhone=true
index=0 -> 未知,但是也沒看出來是什麼含義,所以也直接設定為0即可;
u=-> 空值,同樣設定空值即可;
safeflg=0 -> 未知,所以也可以暫且不管,同樣設定為0即可。
username=crifan -> 很明顯,是我們的賬號,不多解釋;
password=xxxxxx -> 同理,是對應的密碼;
verifycode= ->此處為空,所以也可以不管;
mem_pass=on -> 很明顯,是memory password的所寫,即記住密碼,對應的頁面是,我們已經勾選的"記住我的登陸狀態":
(2)另外一些就是不太容易一眼就看出來的值,需要簡單解釋一下的:
staticpage=http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html ->
此處,等有了一定的除錯經驗,和本身具有一定的url的encode,decode基礎的話,可以直接看出來,這個值
http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html
是原先某個url地址,編碼之後的值。
而對應的原始的值,可以在程式碼中去解碼而獲得;
此處先直接給出原始值:
關於如何通過此,被編碼的url地址中,獲得原始的url地址,詳細解釋在這裡:
loginType=1 -> 未知,但是一般不知道的值,都可以先按照原先的值去設定即可;
tpl=mn -> 未知,也還是同樣設定即可;
callback=parent.bdPass.api.login._postCallback -> 未知,也同樣設定即可;
(3)再剩下的,就是需要去分析調查,才知道為何是這樣值的了:
ppui_logintime=6852
此值6852,看起來就像是會變化的。但是到底如何得到的,則需要去分析分析了。
所以就去搜索6852:
經過搜尋,發現結果只能搜到此單獨一處的6852,貌似沒辦法找到此資料如何得到的。
但是,我們可以再去搜其引數ppui_logintime,然後另外在別的檔案中也可以找到2處,其中一處是:
很明顯,此處是javascript指令碼:
在其中根據實際情況計算出來