近日,友人發(fā)來一鏈接,說頁面請(qǐng)求分析過程中碰到一個(gè)奇怪的post請(qǐng)求,于是乎,好奇心旺盛的博主也立馬上手研究起來。
報(bào)文截圖如下,不知各位看官是否遇見過這樣的請(qǐng)求體。

Payload截圖
好了,報(bào)文有了,那么我們就開始分析這其中的原理,并最終實(shí)現(xiàn)模擬功能。
首先,報(bào)文中多次出現(xiàn)webkitFormBoundary這個(gè)關(guān)鍵字,我猜測這肯定是某種函數(shù)或者軟件自動(dòng)生成的結(jié)果。
與此同時(shí),我們也必須研究下請(qǐng)求頭,截圖如下

請(qǐng)求頭
如圖中標(biāo)紅部分,一個(gè)是multipart/from-data,一個(gè)是boundary,在看到后者的瞬間,博主心中大喊“原來如此!”
ok,payload的組成一定與content-Type有關(guān),借助谷歌,博主自我科普了一把multipart/form-data的概念。
諸位有興趣的可以看下方鏈接,
http://www.itdecent.cn/p/e810d1799384
https://stackoverflow.com/questions/3508338/what-is-the-boundary-in-multipart-form-data
http://docs.python-requests.org/en/master/user/quickstart/#post-a-multipart-encoded-file
https://stackoverflow.com/questions/12385179/how-to-send-a-multipart-form-data-with-requests-in-python/12385661#12385661
好了,原生的requests對(duì)這類請(qǐng)求支持不是很好,根據(jù)官方文檔,我們需要使用requests-toolbelt 這個(gè)庫,詳細(xì)的介紹大家可以搜索這個(gè)幫助文檔。
具體代碼如下:
import requests
from requests_toolbelt import MultipartEncoder
headers={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.9',
'Connection':'keep-alive',
'Host':'sydwjg.sdbb.gov.cn',
'Content-Type':'',
'Content-Length':'907',
'Referer':'',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
}
file_payload = {'xydm':'',
'confirm_before_do':'查詢'
}
m = MultipartEncoder(file_payload)
headers['Content-Type'] = m.content_type
url_origin = '目標(biāo)網(wǎng)址'
resp = requests.post(url_origin,headers=headers,data=m,timeout=10)
print(resp.status_code)
不過話說回來,現(xiàn)在很少有網(wǎng)站用到這種請(qǐng)求,或者我猜測文件上傳用到這種方式比較多。。
anyway,新技能點(diǎn)get!