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 ftp上传文件
Feb 13 Python
Python 遍历列表里面序号和值的方法(三种)
Feb 17 Python
Python语言描述连续子数组的最大和
Jan 04 Python
详解Python中的动态属性和特性
Apr 07 Python
python计算列表内各元素的个数实例
Jun 29 Python
Django ManyToManyField 跨越中间表查询的方法
Dec 18 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
python对指定字符串逆序的6种方法(小结)
Apr 02 Python
Windows下Anaconda安装、换源与更新的方法
Apr 17 Python
Python程序慢的重要原因
Sep 04 Python
Python本地及虚拟解释器配置过程解析
Oct 13 Python
基于Python实现将列表数据生成折线图
Mar 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 循环列出目录内容的函数代码
2010/05/26 PHP
PHP 遍历文件实现代码
2011/05/04 PHP
PHP 第二节 数据类型之字符串类型
2012/04/28 PHP
PHP验证码函数代码(简单实用)
2013/09/29 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
js 页面输出值
2008/11/30 Javascript
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
jquery入门—访问DOM对象方法
2013/01/07 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
js实现简单登录功能的实例代码
2013/11/09 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
详解Node.js利用node-git-server快速搭建git服务器
2017/09/27 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
python爬取m3u8连接的视频
2018/02/28 Python
对Python中range()函数和list的比较
2018/04/19 Python
python cumsum函数的具体使用
2019/07/29 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
台湾旅游网站:灿星旅游
2018/10/11 全球购物
小学生成长感言
2014/01/30 职场文书
各营销点岗位职责范本
2014/03/05 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫