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使用新浪微博api上传图片到微博示例
Jan 10 Python
Python的面向对象编程方式学习笔记
Jul 12 Python
Python实现曲线点抽稀算法的示例
Oct 12 Python
python3设计模式之简单工厂模式
Oct 17 Python
利用Tkinter(python3.6)实现一个简单计算器
Dec 21 Python
解决python大批量读写.doc文件的问题
May 08 Python
Python正则表达式和元字符详解
Nov 29 Python
python动态视频下载器的实现方法
Sep 16 Python
Python数据可视化:箱线图多种库画法
Nov 06 Python
python变量的作用域是什么
May 26 Python
Python直接赋值及深浅拷贝原理详解
Sep 05 Python
Python实现EM算法实例代码
Oct 04 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
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
Docker配置PHP开发环境教程
2016/12/21 PHP
JavaScript中的prototype使用说明
2010/04/13 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
shiro授权的实现原理
2017/09/21 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
2020/11/06 Javascript
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
python中的yield使用方法
2014/02/11 Python
关于python的list相关知识(推荐)
2017/08/30 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
Python如何将模块打包并发布
2020/08/30 Python
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
Europcar意大利:汽车租赁
2019/07/07 全球购物
浅谈react路由传参的几种方式
2021/03/23 Javascript
生产车间主管岗位职责
2013/12/28 职场文书
教师党员思想汇报
2014/01/06 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
地震捐款简报
2015/07/21 职场文书
python turtle绘图命令及案例
2021/11/23 Python