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中lambda函数 list comprehension 和 zip函数使用指南
Sep 28 Python
python使用urlparse分析网址中域名的方法
Apr 15 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
Python自定义简单图轴简单实例
Jan 08 Python
Pandas 同元素多列去重的实例
Jul 03 Python
python事件驱动event实现详解
Nov 21 Python
python开启debug模式的方法
Jun 27 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
python的命名规则知识点总结
Oct 04 Python
python关于调用函数外的变量实例
Dec 26 Python
Python不支持 i ++ 语法的原因解析
Jul 22 Python
python 实现客户端与服务端的通信
Dec 23 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 UBB 解析实现代码
2011/11/27 PHP
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
Bootstrap图片轮播组件使用实例解析
2016/06/30 Javascript
原生js实现键盘控制div移动且解决停顿问题
2016/12/05 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
JavaScript callback回调函数用法实例分析
2018/05/08 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
django通过ajax发起请求返回JSON格式数据的方法
2015/06/04 Python
Python读大数据txt
2016/03/28 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
Python基础教程之tcp socket编程详解及简单实例
2017/02/23 Python
python requests 使用快速入门
2017/08/31 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
Python退火算法在高次方程的应用
2018/07/26 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
Python 制作自动化翻译工具
2021/04/25 Python
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
Django分页器的用法你都了解吗
2021/05/26 Python
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
nginx中proxy_pass各种用法详解
2021/11/07 Servers