前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有了mitmdump还不赶紧扔掉Charles

有了mitmdump还不赶紧扔掉Charles

作者头像
测试加
发布2022-06-21 16:24:59
1.2K0
发布2022-06-21 16:24:59
举报

背景

mitmproxy由三大功能模块组成,mitmproxy、mitmweb、mitmdump。

mitmproxy的详细介绍可以查阅:

https://mp.weixin.qq.com/s/Te82o04tk5964nNbeMw44w。

介绍一下三个功能模块的区别:

  • mitmproxy: 提供一个命令行界面。
  • mitmweb:提供一个浏览器界面。
  • mitmdump: 提供一个简单的终端输出。

mitmproxy的强大之处,在于可以使用mitmdump模块进行编写扩展脚本,帮忙我们日常工作中提高工作效率。

使用mitmdump能解决的一些痛点:

1、模拟接口返回数据来验证客户端是否出现UI异常或者兼容性问题。

2、模拟接口返回数据延迟,验证客户端对接口loading的处理。

3、录制接口数据信息,回归接口功能是否正常。

mitmdump

重点掌握mitmdump是mitmproxy的命令行版本,提供了丰富的命令行参数。

命令行输入:

代码语言:javascript
复制
mitmdump --help

mitmdump可以直接对接python对请求做处理。mitmdump是mitmproxy 的命令行窗口,同时还可对接python对请求进行处理,因此就不用手动截获和分析 http 请求和响应,只需要写好请求和响应的处理逻辑即可。

录制与回放

首先了解下,mitmdump中录制与回放功能,它可以根据规则把请求数据录制到一个二进制文件中,然后使用回放功能对接口进行数据回放。

  • 录制:mitmdump -w 文件名
  • 过滤:mitmdump -nr 文件名 -w 文件名2 "~s 关键字"
  • 回放:mitmdump -nC 文件名

参数

  • -s "script.py --bar" # 执行脚本,通过双引号来添加参数
  • -n 不启动代理
  • -r 读取文件内容
  • -w 写入文件
  • ~s 过滤响应数据
  • ~q 过滤请求数据

录制功能,本地开启8999代理端口并且过滤响应数据igetget保存到本地igetget.txt文件中,

录制功能,命令如下:

代码语言:javascript
复制
mitmdump -p 8999 -w igetget.txt "~s igetget"

手机连接代理8999端口,然后操作手机中的app即可。

然后结束录制。录制结束后,需要说明的是igetget.txt文件是一个二进制文件,无法查看接口详细信息。

回放功能,回放igetcool.txt文件接口数据。

回放功能,命令如下:

代码语言:javascript
复制
mitmdump -nC igetcool.txt

在回放的过程中,可以看到页面中发送请求的信息就是第一次录制的数据。

另外,还可以过滤上面录制的请求,只保存搜索igetcool的数据。

过滤命令如下:

代码语言:javascript
复制
mitmdump -nr igetcool.txt -w igetcool-test.txt "~s igetcool"

mitmdump扩展功能

mitmdump允许使用加载扩展脚本的方式,对接口数据进行修改。在日常工作中,梳理了如下常用修改操作。

首先,在本地创建script.py文件,命令行执行: mitmdump -p 8999 -s script.py -v。

接下来,来讲解常用修改功能是如何实现的。

接口重定向

接口重定向也称为MapRemote是将指定的网络请求重定向到另一个网址请求地址。比如日常测试过程中,将生产环境接口地址重定向到测试环境接口地址。

代码如下:

代码语言:javascript
复制
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。

代码如下:

代码语言:javascript
复制
def request(flow):
    """
    修改请求头
    :param flow: 
    :return: 
    """
    flow.request.headers["agent"] = "MitmProxy"
    print(flow.request.headers["agent"])

可以看到请求头中包含了agent:MitmProxy

image

修改接口响应状态码

修改接口响应状态码404、503等错误码。

代码如下:

代码语言:javascript
复制
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)

修改接口响应结果

修改接口功能适合对某一类网络请求进行一些正则替换.以达到修改结果的目的。例如: 对某个接口的返回数据字段进行修改。

代码如下:

代码语言:javascript
复制
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是将指定的网络请求重定向到本地文件。

代码如下:

代码语言:javascript
复制
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依然可以达到效果。

代码如下:

代码语言:javascript
复制
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模块,开发一个接口用例自动生成和回放工具,敬请期待吧~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试加 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • mitmdump
    • 录制与回放
    • mitmdump扩展功能
      • 接口重定向
        • 修改请求头
          • 修改接口响应状态码
            • 修改接口响应结果
              • 加载本地数据
                • 模拟接口响应延迟
                • 结语
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档