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多进程同步Lock、Semaphore、Event实例
Nov 21 Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
Mar 30 Python
python清除指定目录内所有文件中script的方法
Jun 30 Python
Django开发中复选框用法示例
Mar 20 Python
python3.4.3下逐行读入txt文本并去重的方法
Apr 29 Python
基于Pandas读取csv文件Error的总结
Jun 15 Python
Python常用模块之requests模块用法分析
May 15 Python
详解pyppeteer(python版puppeteer)基本使用
Jun 12 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
Python random模块制作简易的四位数验证码
Feb 01 Python
使用python计算三角形的斜边例子
Apr 15 Python
Django Path转换器自定义及正则代码实例
May 29 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
一次编写,随处运行
2006/10/09 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
jQuery each()方法的使用方法
2010/03/18 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
javascript中定义类的方法详解
2015/02/10 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
2020/05/14 Javascript
python读写ini文件示例(python读写文件)
2014/03/25 Python
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
python如何保证输入键入数字的方法
2019/08/23 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
清除canvas画布内容(点擦除+线擦除)
2020/08/12 HTML / CSS
公司办公室岗位职责
2014/03/19 职场文书
反对邪教标语
2014/06/30 职场文书
职工小家建设活动方案
2014/08/25 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers