mitmproxy由三大功能模块组成,mitmproxy、mitmweb、mitmdump。
mitmproxy的详细介绍可以查阅:
https://mp.weixin.qq.com/s/Te82o04tk5964nNbeMw44w。
介绍一下三个功能模块的区别:
mitmproxy的强大之处,在于可以使用mitmdump模块进行编写扩展脚本,帮忙我们日常工作中提高工作效率。
使用mitmdump能解决的一些痛点:
1、模拟接口返回数据来验证客户端是否出现UI异常或者兼容性问题。
2、模拟接口返回数据延迟,验证客户端对接口loading的处理。
3、录制接口数据信息,回归接口功能是否正常。
重点掌握mitmdump是mitmproxy的命令行版本,提供了丰富的命令行参数。
命令行输入:
mitmdump --help
mitmdump可以直接对接python对请求做处理。mitmdump是mitmproxy 的命令行窗口,同时还可对接python对请求进行处理,因此就不用手动截获和分析 http 请求和响应,只需要写好请求和响应的处理逻辑即可。
首先了解下,mitmdump中录制与回放功能,它可以根据规则把请求数据录制到一个二进制文件中,然后使用回放功能对接口进行数据回放。
参数
录制功能,本地开启8999代理端口并且过滤响应数据igetget保存到本地igetget.txt文件中,
录制功能,命令如下:
mitmdump -p 8999 -w igetget.txt "~s igetget"
手机连接代理8999端口,然后操作手机中的app即可。
然后结束录制。录制结束后,需要说明的是igetget.txt文件是一个二进制文件,无法查看接口详细信息。
回放功能,回放igetcool.txt文件接口数据。
回放功能,命令如下:
mitmdump -nC igetcool.txt
在回放的过程中,可以看到页面中发送请求的信息就是第一次录制的数据。
另外,还可以过滤上面录制的请求,只保存搜索igetcool的数据。
过滤命令如下:
mitmdump -nr igetcool.txt -w igetcool-test.txt "~s igetcool"
mitmdump允许使用加载扩展脚本的方式,对接口数据进行修改。在日常工作中,梳理了如下常用修改操作。
首先,在本地创建script.py文件,命令行执行: mitmdump -p 8999 -s script.py -v。
接下来,来讲解常用修改功能是如何实现的。
接口重定向也称为MapRemote是将指定的网络请求重定向到另一个网址请求地址。比如日常测试过程中,将生产环境接口地址重定向到测试环境接口地址。
代码如下:
def request(flow):
if 'https://igetcool-gateway.igetcool.com/app-api-user-server/white/app/head/config.json' in str(flow.request.pretty_url):
ctx.log.info("pretty host is: %s" % flow.request.pretty_host)
flow.request.host = "localhost"
flow.request.port = 3000
flow.request.scheme = 'http'
flow.request.url = flow.request.scheme + '://'+ flow.request.host + ':' + flow.request.port + '/app-api-user-server/white/app/head/config.json'
如下图,可以看到请求的地址替换成了本地localhost:3000。
给每一个接口请求的请求头中增加agent字段,并且字段值是MitmProxy。
代码如下:
def request(flow):
"""
修改请求头
:param flow:
:return:
"""
flow.request.headers["agent"] = "MitmProxy"
print(flow.request.headers["agent"])
可以看到请求头中包含了agent:MitmProxy
image
修改接口响应状态码404、503等错误码。
代码如下:
def response(flow: http.HTTPFlow):
# 加上过滤条件
if "igetcool-gateway.igetcool.com" in str(flow.request.pretty_url):
flow.response.status_code = 404
# 或者
flow.response = flow.response.make(404)
# 或者
flow.response = http.HTTPResponse.make(status_code=404)
修改接口功能适合对某一类网络请求进行一些正则替换.以达到修改结果的目的。例如: 对某个接口的返回数据字段进行修改。
代码如下:
def response(flow: http.HTTPFlow):
# 加上过滤条件
if "https://igetcool-gateway.igetcool.com/app-api-user-server/white/app/head/config.json" in str(
flow.request.pretty_url):
data = json.loads(flow.response.content)
print('------------------ 修改前 ------------------')
print(data)
print('------------------ 修改后 ------------------')
data['data']['isShow'] = 2
flow.response.set_text(json.dumps(data))
data = json.loads(flow.response.content)
print(data)
在下图中,可以看到修改前和修复后的字段参数替换效果。
加载本地数据也称之为Map Local是将指定的网络请求重定向到本地文件。
代码如下:
def response(flow: http.HTTPFlow):
# 加上过滤条件
if "igetcool" in str(flow.request.pretty_url):
with open("/Users/xinxi/Documents/zhihu/mitmproxyRecode/igetget.json", 'r') as f:
resp_info = json.loads(f.read())
print(resp_info)
flow.response.set_text(json.dumps(resp_info))
mitmdump中没有设置延迟的方法,这里使用time.sleep依然可以达到效果。
代码如下:
def response(flow: http.HTTPFlow):
# 加上过滤条件
if "igetcool" in str(flow.request.pretty_url):
random_time = random.randint(100, 1000)
print(random_time)
time.sleep(random_time / 1000)
本文介绍了mitmdump功能的基本使用特性,能解决日常工作中的绝大多数问题。下篇文章是基于mitmdump模块,开发一个接口用例自动生成和回放工具,敬请期待吧~