首先附上github地址:https://github.com/mitmproxy/mitmprox,上面的内容永远是最新的

  1. 作为一名测试穿戴设备相关app的工程师,与数据打交道是常事,那么,如果想要获取app上传给服务器的文件,怎么获取?

    上传文件,http请求头header的Content-Type字段multipart/form-data

    注意:如果要修改请求参数,必须得了解Content_Type的类型,Content_Type主要告知请求的消息主要用了何种编码,常见3中类型:

application/x-www-form-urlencoded

form形式,提交的数据按照 key1=val1&key2=val2 的方式进行编码

application/json

JSON编码方式,消息主体是序列化后的 JSON 字符串

multipart/form-data

主要是传输二进制流等,boundary区分普通文件内容和二进制流内容

def request(flow: http.HTTPFlow) -> None:

target=["/course/data/save"]

url_path = flow.request.path

print("完整收到请求(包括body部分)={}".format(url_path))

if url_path.split("?")[0] in target:

ctx.log.info("#"50)

ctx.log.info("课程接口")

ctx.log.info(flow.request.url)

fp=open("courseData.dat","wb")

for key,value in flow.request.multipart_form.items():

print(key)

if key==b"courseData":#文件名

fp.write(value)

fp.close()

2. 接口返回字段变更,为了兼容,暂时未去掉,未来去掉,这种情况下,app需要做好兼容性测试,那么需要通过模拟删除相应字段

def response(self,flow: http.HTTPFlow) -> None:

if flowfilter.match(self.filter, flow):

url_path = flow.request.path

if "
由于隐私该处省略" in url_path:

ctx.log.warn("#" * 60)

res=json.loads(flow.response.text)

for i in res.get("data"):

i.pop('happenDate')#删除happenDate字段,这个地方得看返回内容的结构

flow.response.set_text(json.dumps(res))

3. 笔者测试的app在header中需要带上一段自定义的字段,当中途新增接口,有时候后开发会忘记添加,那么,测试人员在测试迭代需求的时候,需要检查一遍新增接口请求,阅读完接口后可编写脚本,待发布app时直接执行

def request(self,flow: http.HTTPFlow) -> None:

if url_path.split("?")[0] in "
特定接口*":

ctx.log.warn("#" * 60)

dict_obj = json.loads(flow.request.headers.get("selfHeader","{}")) # 字典字符串,headers为字典对象

4.自定义options

默认options:

https://docs.mitmproxy.org/stable/concepts-options/

自定义filter

def load(self, loader):

"""

脚本载入时执行,对应--options参数,默认有多个可供选择的项,如flow_detail,同时可在载入脚本时自定义选项

option格式:(name,typespec,defult,help)

"""

loader.add_option("filter", str, "", "过滤规则")

def configure(self,updated):

"""脚本载入,读取配置"""

self.filter =flowfilter.parse(ctx.options.filter) #得到一个过滤器

def request(self,flow: http.HTTPFlow) -> None:

if flowfilter.match(self.filter, flow):

print("filter")

结语

在使用fitler这个过滤功能时,发现源代码有一处错误,如

class FDomain(_Rex):

code = "d"

help = "Domain"

flags = re.IGNORECASE

is_binary = False

@only(http.HTTPFlow, websocket.WebSocketFlow)
def __call__(self, f):
if isinstance(f, websocket.WebSocketFlow):
f = f.handshake_flow
return bool(
self.re.search(f.request.host) or
self.re.search(f.request.pretty_host) #这里应该添加str,否则一直报错,其他地方类似
)

作者:小蜗牛的成长

链接:https://www.jianshu.com/p/23fe9858b2bb

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

最新文章

  1. vue data对象添加新属性触发视图
  2. proxy改变this指向
  3. Nginx下安装PIP监控软件
  4. SGU326 Perspective(指派问题)
  5. python笔记 - day7
  6. JavaScript学习笔记之 数组方法一 堆栈 和队列
  7. 如何做到机器学习竞赛Kaggle排名前2%
  8. UOJ#75. 【UR #6】智商锁 随机化算法 矩阵树定理
  9. Linux 下 ls -l 命令执行显示结果的每一列含义【转载】
  10. elasticsearch及head插件安装与配置
  11. java调用Linux执行Python爬虫,并将数据存储到elasticsearch中--(java后台代码)
  12. Ecshop 表结构 字段说明
  13. java中result和resultSet
  14. 阿里云Redis外网转发访问
  15. C#解析数组形式的json数据
  16. 计算机意外地重新启动或遇到错误。windows安装无法继续。若要安装windows 请单击 确定 重新启动计算机
  17. 深度学习(Deep Learning)算法简介
  18. <转>机器学习系列(9)_机器学习算法一览(附Python和R代码)
  19. vue_列表渲染
  20. Memcache命令及参数用法

热门文章

  1. Game over 作业
  2. python 多参数并行化
  3. 实现AJAX的基本步骤
  4. #pragma once 与 #ifndef 的使用
  5. 常用的sublime text 3插件(很爽哦)
  6. selenium_UI自动化——篇1(基础)
  7. Two Bases CodeForces - 602A (BigInteger c++long long也可以)
  8. 洛谷P2542 [AHOI2005]航线规划(LCT,双连通分量,并查集)
  9. 【BZOJ3872】Ant colony(二分,动态规划)
  10. HGOI 20181028 题解