Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)


Posted in Python onOctober 22, 2018

http协议本身的原始方法不支持multipart/form-data请求,这个请求由原始方法演变而来的。

multipart/form-data的基础方法是post,也就是说是由post方法来组合实现的,与post方法的不同之处:请求头,请求体。

multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中的多个post的内容,如文件内容和文本内容自然需要分割开来,不然接收方就无法正常解析和还原这个文件了。

具体的头信息如下:

Content-Type: multipart/form-data; boundary=${bound}

实例:

import os, random, sys, requests
from requests_toolbelt.multipart.encoder import MultipartEncoder

url = 'http://127.0.0.1/sendmsg'
argvstr = sys.argv[1:]
argv_dict = {}
for argv in argvstr :
 argv = str(argv).replace("\r\n" , "")
 DICT = eval(argv)
 argv_dict.update(DICT)

headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0',
 'Referer': url
 }

multipart_encoder = MultipartEncoder(
 fields={
  'username': argv_dict['username'],
  'pwd': argv_dict['pwd'],
  'type': 'txt',
  'friendfield': argv_dict['friendfield'],
  'friend': argv_dict['friend'],
  'content': argv_dict['content'],
  'file': (os.path.basename(argv_dict['file']) , open(argv_dict['file'], 'rb'), 'application/octet-stream')
  #file为路径
  },
  boundary='-----------------------------' + str(random.randint(1e28, 1e29 - 1))
 )

headers['Content-Type'] = multipart_encoder.content_type
#请求头必须包含一个特殊的头信息,类似于Content-Type: multipart/form-data; boundary=${bound}

r = requests.post(url, data=multipart_encoder, headers=headers)
print(r.text)
#注意,不要设置cookies等其他参数,否则会报错

# 例子/usr/local/python36/bin/python3 /opt/lykchat/test_upload.py "{'username':'lykchat','pwd':'123456','type':'img','friendfield':'1','friend':'xxxx','content':'恭喜发财','file':'/root/b.jpg'}"
#等同于curl -F "file=@/root/a" 'http://127.0.0.1/sendmsg?username=lykchat&pwd=123456&type=img&friendfield=1&friend=xxxx&content=恭喜发财'

以上这篇Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中os和shutil模块实用方法集锦
May 13 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
python3.4实现邮件发送功能
May 28 Python
python版大富翁源代码分享
Nov 19 Python
python代码 输入数字使其反向输出的方法
Dec 22 Python
django创建简单的页面响应实例教程
Sep 06 Python
python argparser的具体使用
Nov 10 Python
Python 文件数据读写的具体实现
Jan 24 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
Mar 25 Python
Python使用os.listdir和os.walk获取文件路径
May 21 Python
Python 列表推导式需要注意的地方
Oct 23 Python
简单谈谈Python面向对象的相关知识
Jun 28 Python
python: 判断tuple、list、dict是否为空的方法
Oct 22 #Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 #Python
Python清空文件并替换内容的实例
Oct 22 #Python
Python过滤txt文件内重复内容的方法
Oct 21 #Python
python对html过滤处理的方法
Oct 21 #Python
一看就懂得Python的math模块
Oct 21 #Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 #Python
You might like
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
jQuery动态移除和添加背景图片的方法详解
2017/03/07 Javascript
vue.js中父组件调用子组件的内部方法示例
2017/10/22 Javascript
vue-star评星组件开发实例
2018/03/01 Javascript
深入理解Promise.all
2018/08/08 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
[09:22]2014DOTA2西雅图国际邀请赛 主赛事第二日TOPPLAY
2014/07/21 DOTA
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
python和flask中返回JSON数据的方法
2018/03/26 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
python多进程控制学习小结
2018/10/31 Python
django最快程序开发流程详解
2019/07/19 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
python中元组的用法整理
2020/06/15 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
PHP高级工程师面试问题推荐
2013/01/18 面试题
城市轨道专业个人求职信范文
2013/09/23 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
超市创业计划书
2014/04/24 职场文书
小学教师年度个人总结
2015/02/05 职场文书
2015年度销售个人工作总结
2015/03/31 职场文书
2015年汽车销售工作总结
2015/04/07 职场文书
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android