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实现简单聊天应用 python群聊和点对点均实现
Sep 14 Python
python先序遍历二叉树问题
Nov 10 Python
python3库numpy数组属性的查看方法
Apr 17 Python
python中的常量和变量代码详解
Jul 25 Python
10个Python小技巧你值得拥有
Sep 29 Python
Python中is和==的区别详解
Nov 15 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
PyQt 图解Qt Designer工具的使用方法
Aug 06 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 Python
python反编译教程之2048小游戏实例
Mar 03 Python
浅谈python中的多态
Jun 15 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面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
php获取json数据所有的节点路径
2015/05/17 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
PHP join()函数用法与实例讲解
2019/03/11 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
jquery 学习之二 属性 文本与值(text,val)
2010/11/25 Javascript
JavaScript 5 新增 Array 方法实现介绍
2012/02/06 Javascript
img onload事件绑定各浏览器均可执行
2012/12/19 Javascript
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
微信小程序实现聊天室
2020/08/21 Javascript
Django中使用group_by的方法
2015/05/26 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
pycharm显示远程图片的实现
2019/11/04 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
python代码中怎么换行
2020/06/17 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
.net开发工程师面试题
2014/02/25 面试题
客服专员岗位职责
2014/02/28 职场文书
开展批评与自我批评发言材料
2014/05/15 职场文书
大学生党员自我评价
2015/03/04 职场文书
工厂门卫岗位职责
2015/04/13 职场文书
行为习惯主题班会
2015/08/14 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python
python基础之错误和异常处理
2021/10/24 Python