python模擬登陸知乎(最新版)

高金001發表於2018-01-24

為啥要寫這一篇文章呢?
(主要是qq群內有人在模擬登陸知乎,一直不成功)然後我抓包看了下,發現知乎登陸頁已經改版了,而且難度大大提高了。

開始抓包

首先內,還是開啟知乎首頁,然後輸入賬號密碼,登陸(記得輸錯密碼)

這樣我們就可以看到請求頭了(請求頭如下)

python模擬登陸知乎(最新版)

我們發現有這幾個請求頭和正常的不一樣(紅色框中的)

  1. authorization (感覺應該是js生成的,後面再看
  2. Content-Type (後面多了boundary=xxx 這種,那這種是啥意思呢,後面和請求引數一起看
  3. cookie:這個要注意,登陸前cookie就不為空,說明之前肯定有set-cookie的操作
  4. x-udid,x-sxrftoken 這兩個都是驗證引數,估計都在網頁原始碼能找到

再看一下請求引數

python模擬登陸知乎(最新版)

可以看到引數是以payload的形式出現的

第一次看到這種的人估計會一臉懵逼

這個要結合請求中的

Content-Type:

multipart/form-data; boundary=----WebKitFormBoundary2KNsyxgtG28t93VF
複製程式碼

來一起看

multipart/form-data 是一種表單提交的方式,後面的boundary=xxx 是表單分割的方式,那到底啥意思呢?看一個簡單的小列子你就能明白啦

python模擬登陸知乎(最新版)

------WebKitFormBoundary2KNsyxgtG28t93VF 是分割不同引數的,所以可以直接不看他(這個是由上面的Content-Type後面的boundary決定的,可以隨便修改)

那把分割線去掉後,上面的就相當於 client_id=c3cef7c66a1843f8b3a9e6a1e3160e20,

grant_type=password.

那麼這個payload就很好理解了.

我們來看一下,一共有哪些引數

python模擬登陸知乎(最新版)

引數還挺多的,可以看到很多引數都是固定的,如賬號,密碼,時間戳,等等

變動的有兩個 client_id,signature

開始找引數

authorization

我們在chrome內,直接按ctrl+shift+f(全域性搜尋,搜尋js,css這些),可以看到已經搜尋到了,並且是直接寫在js裡面的,然後重新隨便換個賬號再抓一次包,發現authorization 的值還是固定的,所以說明authorization 是直接寫在js裡面的,不是動態修改的(那麼authorization 的值我們就已經找到了)

python模擬登陸知乎(最新版)
python模擬登陸知乎(最新版)

cookie

在登陸之前,就發現cookie的值不為空,說明肯定開啟網頁後就有set-cookie的操作了,我們想驗證的話,先開啟一個無痕瀏覽器(主要是為了把之前的cookie全部清空,避免干擾),然後開啟zhihu.com,我們發現他有幾次set-cookie的動作

python模擬登陸知乎(最新版)

python模擬登陸知乎(最新版)

python模擬登陸知乎(最新版)

那我們想要模擬的話,很簡單的方法是直接使用requests.session

x-udid,x-sxrftoken:

一般這種驗證引數都會在網頁原始碼裡面,所以直接檢視網頁原始碼

可以看到已經找到了,後續就是如何把這個找出來而已,可以使用正則,或者xpath定位到

python模擬登陸知乎(最新版)

client_id:

你會發現client_id與上面的authorization 一模一樣

signature:

還是使用ctrl+shift+f 全域性搜尋

發現找到了,但是引數是js動態生成的...

python模擬登陸知乎(最新版)

主要是找到如何加密的,然後使用Python模擬出來

第一步:下載這個js,格式化(讓程式碼好看一些)

第二步:使用fiddle替換掉原來的js,使用剛剛格式化的js

第三步:慢慢除錯。。。直到找到如何生成的...

大概步驟是這樣

但是假如你js像我一樣很渣的話,你可以直接找到這段加密的js,然後Python執行這段js就可以了。。。

上面呢,我們把該找的引數都找到了,接著只要模擬傳送就可以了

程式碼請關注微信公眾號【python爬蟲分享】,傳送“知乎登陸程式碼”可見~~~

相關文章