1. 程式人生 > >瀏覽器分析模擬登陸過程

瀏覽器分析模擬登陸過程

原文地址:http://www.crifan.com/use_ie9_f12_to_analysis_the_internal_logical_process_of_login_baidu_main_page_website/

【前提】

想要實現使用某種語言,比如PythonC#等,去實現模擬登陸網站的話,首先要做的事情就是使用某種工具,去分析本身使用瀏覽器去登陸網頁的時候,其內部的執行過程,內部邏輯。

此登陸的邏輯過程,主要指的是,需要訪問哪些地址,提交哪些http請求,其中包含了有哪些查詢關鍵字,涉及到哪些post的資料,涉及到哪些cookie等等。

只有知道了內部邏輯過程,才能談及,使用某種語言去實現,模擬,此套登陸網站的過程。

關於分析工具,其實有很多種,此處選用,之前在

所介紹的IE9的F12。

在分析之前,雖然不需要你有太多的網路相關的基礎,但是,如果真正想要熟悉分析網站抓取,模擬網站登陸的話,還是需要了解相關的知識的。

其中,和cookie相關的內容,可參考:

【使用IE9的F12分析登陸百度首頁的內部邏輯過程】

1.準備好工具,配置好工具

開啟IE9,開啟百度首頁:

按F12,調出F12工具,再切換到Network介面:

baidu F12

然後點選“Start capturing”開始除錯:

show stop capturing

下面就來利用F12來除錯,分析登陸的內部邏輯。

不過,在除錯之前,先去做一些配置上的準備工作:

(1)設定網頁跳轉時,已抓取的資料不被清除掉

即設定:

Tools -> Clear entries on navigate中的Console和Network,都取消掉:

not clear on navigate

這樣,在網頁分析過程中,由於從一個頁面跳轉到另外一個頁面,所抓取的到內容,就不會被清空掉了。

(2)清除舊的cookie和快取

為了後續的除錯,不被之前的已登陸的賬戶的(快取和cookie等)資訊所影響,所以去都清除掉:

cache clear cookies

其中,簡單解釋一下是:

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.模擬操作過程,利用工具抓取所需的整個過程

點選“登陸”:

click login show capturing info

可以看到,除了網頁中跳出你所熟悉的登陸對話方塊之外,F12除錯視窗中,就已經抓取到很多內容了。

然後輸入使用者名稱和密碼,正常登陸:

input username and pwd and click login

然後,就可以看到網頁調轉到了:

以及,對應的抓取到了很多內容:

has login can see redirect to index php

好了,到此為止,我們的操作,基本就結束了。

剩下的,就是從我們所已經抓取到的資訊中,找到是如何登陸的。

3.分析網站登陸的內部邏輯過程

3.1找到登陸網站所涉及的最核心的地址

對於熟悉的人,可以直接從那一堆的url中,找到哪個是登陸的頁面。

而現在假定你不熟悉,教你如何找到真正的有價值的資訊。

對於此處,我們可以想到的一種辦法是,通過直接搜尋密碼,而搜到哪裡傳送了我們的密碼:

search pwd found login url

【小提示:顯示內容時,設定為 自動換行】

當抓取出來的Request Body,Response Body等部分的內容中,單行內容太長,一行顯示不下,不方便檢視時,可以點選右鍵,選擇Word wrap:

choose Word wrap

即可實現自動換行顯示的效果了,方便查看了:

after 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&para2=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 headers

Request Body:

Request Body

Response Headers:

Response headers

Response body:

Response body

Cookies:

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即可;

細心的讀者,也很容易回想起,此處是對應著之前的登陸介面中的“手機登陸”:

phone login

如果是我們是通過“手機登陸”百度時,不出意外的話,肯定引數是isPhone=true

index=0 -> 未知,但是也沒看出來是什麼含義,所以也直接設定為0即可;

u=-> 空值,同樣設定空值即可;

safeflg=0 -> 未知,所以也可以暫且不管,同樣設定為0即可。

username=crifan -> 很明顯,是我們的賬號,不多解釋;   
password=xxxxxx -> 同理,是對應的密碼;     
verifycode= ->此處為空,所以也可以不管;     
mem_pass=on -> 很明顯,是memory password的所寫,即記住密碼,對應的頁面是,我們已經勾選的"記住我的登陸狀態":

remember my login status

(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:

search 6852

經過搜尋,發現結果只能搜到此單獨一處的6852,貌似沒辦法找到此資料如何得到的。

但是,我們可以再去搜其引數ppui_logintime,然後另外在別的檔案中也可以找到2處,其中一處是:

search ppui_logintime

很明顯,此處是javascript指令碼:

在其中根據實際情況計算出來