新版知乎登錄之post請求

前言

上一篇文章中給大家講解了requests發(fā)送post請求的幾種方式,并分析了一些使用陷阱。

疑惑

在文章發(fā)表之后,有朋友給我留言說,知乎登錄就沒有使用提交Form表單(application/x-www-form-urlencoded)的方式,而是上傳文件(multipart/form-data),這是為什么呢?知乎登錄post請求該怎么發(fā)送呢?

本質(zhì)

我想說的是一般情況下是使用提交Form表單的方式進行登錄,但是不排除其他的方式。大家要透過現(xiàn)象看本質(zhì),登錄驗證的本質(zhì)上是客戶端發(fā)送驗證消息,服務(wù)端校驗消息,返回響應(yīng)。登錄驗證可以使用提交Form表單,可以使用發(fā)送ajax,也可以上傳驗證文件,甚至我不用http請求,使用Websocket,都是可以的,這沒必要糾結(jié)。好多朋友在知乎登錄的時候,就傻眼了?這個怎么使用requests發(fā)送post請求呢?

新版知乎登錄分析

首先打開谷歌瀏覽器,同時F12,打開開發(fā)者模式,并勾選Preserve log。

為了保留所有的網(wǎng)絡(luò)信息

接著在知乎登錄首頁,輸入賬號與密碼,開始登錄。(這次不涉及驗證碼的分析)

知乎登錄

知乎登錄請求如下圖,大家肯定注意到了content-type: multipart/form-data; boundary=----WebKitFormBoundarypxPm5bUFaA8CHOHo。不僅不是Form表單提交,而且和之前講的上傳文件還有區(qū)別,即boundary的配置。

image

requests模擬知乎登錄

上一篇文章里的文件上傳,post函數(shù)里使用的是files參數(shù),通過這個參數(shù)來表明使用的是multipart/form-data編碼,這里不再是通過files參數(shù)傳文件,而是傳參數(shù),其實本質(zhì)上一樣的,文件內(nèi)容不就是這參數(shù)嗎?好,為了測試方便,向 http://httpbin.org/post 發(fā)送post請求,代碼如下:

import requests
url = "http://httpbin.org/post"

fields = {
    "client_id":  "c3cef7c66a1843f8b3a9e6a1e3160e20",
    "grant_type":  "password",
    "timestamp": "1527040472416",
    "source":  "com.zhihu.web",
    "signature":"66a16483ab16e54c3bb4ef84bf683dd67cadc246",
    "username": "xxxxx@qq.com",
    "password":  "xxxxxxxx"
}


res = requests.post(url, files=fields)

print(res.request.body)
print(res.request.headers)
print(res.text)

從上面代碼中可以看到,files參數(shù)只不過變成了參數(shù)字典。在控制臺的輸出效果如下:

image

打印的方式觀察的效果不是很好,不如使用http Analyzer
抓取發(fā)送的包更加直觀。對于http Analyzer的使用在我的書《Python爬蟲開發(fā)與項目實戰(zhàn)》中有講解。http Analyzer抓到的發(fā)送包請求頭截圖如下:

請求頭

image

payload信息如下,效果已經(jīng)出來了。

post payload

image

從上面兩張圖中,我們發(fā)現(xiàn)我們寫的程序沒有問題,發(fā)送的post請求和知乎登錄的數(shù)據(jù)包差別不是很大。

boundary定制

要說和知乎登錄請求包還有什么差別,也就是boundary的配置。

知乎登錄的類似boundary=----WebKitFormBoundarypxPm5bUFaA8CHOHo,而我們寫的程序為boundary=f30cf72e14254d59a9824e694e10e2c0??隙ㄓ新斆鞯男』锇?,已經(jīng)開動腦筋,我們在requests單獨配置headers不就可以了?很不幸的告訴大家,這樣是不行的,雖然headers改變了,但是post數(shù)據(jù)中的boundary內(nèi)容并沒有改變呢。這個時候我們要引入幫手requests_toolbelt。

requests_toolbelt

requests_toolbelt是對requests的補充,是一個第三方輔助插件,通過這個插件就可以定制boundary。首先安裝requests_toolbelt:

pip3 install requests_toolbelt

定制代碼如下:

import requests
from requests_toolbelt import MultipartEncoder
url = "http://httpbin.org/post"
fields = {
    "client_id":  "c3cef7c66a1843f8b3a9e6a1e3160e20",
    "grant_type":  "password",
    "timestamp": "1527040472416",
    "source":  "com.zhihu.web",
    "signature":"66a16483ab16e54c3bb4ef84bf683dd67cadc246",
    "username": "xxxxx@qq.com",
    "password":  "xxxxxxxx"
}

m = MultipartEncoder(fields, boundary='----WebKitFormBoundaryWp8R1tWtqL2vhLuG')
res = requests.post(url, headers={'Content-Type': m.content_type}, data=m.to_string())

print(res.request.body)
# # 查看請求頭
print(res.request.headers)
print(res.text)

發(fā)送效果

這次直接使用http analyzer抓包看一下效果。

請求頭

image

post payload

image

福利大放送

關(guān)注公眾號:七夜安全博客

image
  • 回復(fù)【1】:領(lǐng)取 Python數(shù)據(jù)分析 教程大禮包
  • 回復(fù)【2】:領(lǐng)取 Python Flask 全套教程
  • 回復(fù)【3】:領(lǐng)取 某學(xué)院 機器學(xué)習(xí) 教程
  • 回復(fù)【4】:領(lǐng)取 爬蟲 教程

知識星球已經(jīng)快40人了,隨著人數(shù)的增多,價格之后會上漲,越早關(guān)注越多優(yōu)惠。星球的福利有很多:

  • 比如上面的教程,已經(jīng)提前在知識星球中分享
  • 可以發(fā)表一些問題,大家一塊解決
  • 我之后寫的電子書,錄制的教學(xué)視頻,對于知識星球的朋友都是優(yōu)惠的(基本上免費)
  • 一些節(jié)假日會給大家發(fā)個紅包或者贈書
image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容