近日,友人发来一链接,说页面请求分析过程中碰到一个奇怪的post请求,于是乎,好奇心旺盛的博主也立马上手研究起来。
报文截图如下,不知各位看官是否遇见过这样的请求体。
好了,报文有了,那么我们就开始分析这其中的原理,并最终实现模拟功能。
首先,报文中多次出现webkitFormBoundary这个关键字,我猜测这肯定是某种函数或者软件自动生成的结果。
与此同时,我们也必须研究下请求头,截图如下
如图中标红部分,一个是multipart/from-data,一个是boundary,在看到后者的瞬间,博主心中大喊“原来如此!”
ok,payload的组成一定与content-Type有关,借助谷歌,博主自我科普了一把multipart/form-data的概念。
诸位有兴趣的可以看下方链接,
http://www.jianshu.com/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对这类请求支持不是很好,根据官方文档,我们需要使用requests-toolbelt 这个库,详细的介绍大家可以搜索这个帮助文档。
具体代码如下:
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 = '目标网址'
resp = requests.post(url_origin,headers=headers,data=m,timeout=10)
print(resp.status_code)
不过话说回来,现在很少有网站用到这种请求,或者我猜测文件上传用到这种方式比较多。。
anyway,新技能点get!