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删除过期文件的方法
May 29 Python
Python实现的桶排序算法示例
Nov 29 Python
基于Python打造账号共享浏览器功能
May 30 Python
详解10个可以快速用Python进行数据分析的小技巧
Jun 24 Python
python 循环数据赋值实例
Dec 02 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
Apr 24 Python
Python Pandas 对列/行进行选择,增加,删除操作
May 17 Python
Django2.1.7 查询数据返回json格式的实现
Dec 29 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 Python
Python pandas求方差和标准差的方法实例
Aug 04 Python
Python中的 Set 与 dict
Mar 13 Python
Python使用MapReduce进行简单的销售统计
Apr 22 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输出Excel文件类
2010/02/08 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
2011/11/25 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
Bootstrap 填充Json数据的实例代码
2017/01/11 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
2018/09/21 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
pygame实现俄罗斯方块游戏
2018/06/26 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
pymysql模块的操作实例
2019/12/17 Python
python实现数字炸弹游戏程序
2020/07/17 Python
Pycharm github配置实现过程图解
2020/10/13 Python
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
优秀应届毕业生自荐信
2013/11/16 职场文书
英文自荐信
2013/12/15 职场文书
经济管理专业自荐信
2013/12/30 职场文书
护士辞职信模板
2014/01/20 职场文书
2014年元旦感言
2014/03/06 职场文书
供货协议书范本
2014/04/22 职场文书
媒体宣传策划方案
2014/05/25 职场文书
教师求职自荐书
2014/06/14 职场文书
英语课外活动总结
2014/08/27 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
优秀高中学生评语
2014/12/30 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android