搜索
您的当前位置:首页正文

论如何实现multipart/form-data类型的post请

来源:二三娱乐

近日,友人发来一链接,说页面请求分析过程中碰到一个奇怪的post请求,于是乎,好奇心旺盛的博主也立马上手研究起来。
报文截图如下,不知各位看官是否遇见过这样的请求体。


Payload截图

好了,报文有了,那么我们就开始分析这其中的原理,并最终实现模拟功能。
首先,报文中多次出现webkitFormBoundary这个关键字,我猜测这肯定是某种函数或者软件自动生成的结果。
与此同时,我们也必须研究下请求头,截图如下


请求头

如图中标红部分,一个是multipart/from-data,一个是boundary,在看到后者的瞬间,博主心中大喊“原来如此!”
ok,payload的组成一定与content-Type有关,借助谷歌,博主自我科普了一把multipart/form-data的概念。
诸位有兴趣的可以看下方链接,



http://docs.python-requests.org/en/master/user/quickstart/#post-a-multipart-encoded-file

好了,原生的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',
    
    '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!

Top