安装

pip  install  mitmproxy

腾讯云镜像加速安装:

pip install -i https://mirrors.cloud.tencent.com/pypi/simple  mitmproxy

检查是否安装成功:命令行中输入命令查看

mitmdump --version

安装成功后在Python安装路径Script路径下可以找到 mitmdump.exe 、mitmproxy.exe 、mitmweb.exe 这三个可执行文件

工具介绍

mitmproxy

命令行界面,允许交互式检查和修改http数据流,不支持windows

mitmweb

Web界面,用户可以实时看到发生的请求,过滤请求,查看请求数据
mitmweb

mitmdump

一个命令行工具,没有界面,不能交互,但是可以通过启动参数并结合自定义脚本进行定制化功能的实现,是我们运行的环境

这三个命令功能一致,且都可以加载自定义脚本,唯一的区别是交互界面的不同;
mitmproxy,mitmweb主要用来做调试,部署项目时使用mitmdump。

设置代理

PC端设置代理

开启代理时需要把其他的代理都关掉
关闭自动检测设置
设置代理

注:这时我们刚开启代理,还未安装证书,如果访问其他网址会出现报错,如下图所示:

PC端安装证书

在代理状态下,访问http://mitm.it/,PC端与移动端操作相同。
(注意:设置完成后,浏览器打开网页发现都是未连接网络,需要先启动mitmweb.exe或者mitmdump.exe程序才能打开链接)
下载证书
根据自己的系统环境下载对应的证书安装,后面点击下载的证书按步骤导入就可以了

mitmdump

官方文档:https://docs.mitmproxy.org/stable/addons-overview/

插件使用

  • 插件的本质就是一个脚本文件,在Python中就是一个类的实例对象。
  • 此处插件是Counter实例对象,request方法是一个事件
  • 对于request事件,它的参数是一个mitmproxy.http.HTTPFlow的对象。
    如:(官方文档例子)

    """
    Basic skeleton of a mitmproxy addon.
    Run as follows: mitmproxy -s anatomy.py
    """
    from mitmproxy import ctx
    class Counter:
     def __init__(self):
    self.num = 0
     def request(self, flow):
    self.num = self.num + 1
    ctx.log.info("We've seen %d flows" % self.num)
    addons = [
     Counter()
    ]

    上面是一个简单的插件,用于跟踪我们已经看到的流(或更具体的HTTP请求)数量。每次看到新的流量时,它都会使用mitmproxy的内部日志记录机制来宣布其提示。可以在交互式工具的事件日志中或mitmdump的控制台中找到输出。
    运行指定脚本命令:

    mitmdump -s anatomy.py

    可以使用mitmdump -s ./anatomy.py运行插件(anatomy.py是创建的文件名)。

    常用事件

    def request(self, flow: mitmproxy.http.HTTPFlow):
    ​ """
    ​ The full HTTP request has been read.
    ​ """
    def response(self, flow: mitmproxy.http.HTTPFlow):
    ​ """
    ​ The full HTTP response has been read.
    ​ """

    request事件

    注意:记得在代理状态下执行,命令:mitmdump -s xxx.py

    from mitmproxy import http
    def request(flow:http.HTTPFlow):  #注意函数名request不能写错
     #获取请求头信息
     print('请求头',flow.request.headers)
     #完整请求地址
     print('请求url',flow.request.url)
     #域名
     print('域名',flow.request.host)
     #请求路径  url除域名之外的内容
     print('请求路径',flow.request.path)
     #返回MultiDictView类型的数据,URL的键值参数
     print('url的键值参数',flow.request.query)
     #请求方法
     print('请求方法',flow.request.method)
     #请求类型
     print('请求类型',flow.request.scheme)
     #获取请求内容
     '''
     print('请求内容',flow.request.get_text)
     print('请求内容类型',type(flow.request.get_text))
     print('请求内容bytes',flow.request.raw_content)
     print('请求内容bytes',flow.request.get_content)
     '''
     if 'https://www.baidu.com' in flow.request.url:
    #取得请求参数wd的值
    print(flow.request.query.get('wd'))
    #取得所有请求参数
    print(list(flow.request.query.keys()))
    #修改请求参数
    flow.request.query.set_all('wd',['python'])
    #打印修改过后的参数
    print(flow.request.query.get('wd'))

    response事件

    注意:记得在代理状态下执行,命令:mitmdump -s xxx.py

    from mitmproxy import http
    def response(flow:http.HTTPFlow):  #注意函数名response不能写错
     #状态码
     print('状态码',flow.response.status_code)
     #返回内容,已解码
     print('返回内容',flow.response.text)
     #返回内容, bytes类型
     print('返回内容bytes类型',flow.response.content)
     #取得响应的文本
     print('应的文本',flow.response.get_text)
     #修改响应 的文本
     flow.response.set_text('你的响应内容被修改了!')

    下载图片

    注意:记得在代理状态下执行,命令:mitmdump -q -s xxx.py 加-q会使打印更清晰可观

    import os
    index = 0
    def response(flow):
     global index
     print('===========下载==============')
     print(flow.request.url)
     if flow.request.url[-3:] == 'jpg':
    dir = 'images'
    if not os.path.exists(dir):
    os.mkdir(dir)
    filename = dir+'/'+str(index)+'.jpg'
    with open(filename,'wb') as f:
    f.write(flow.response.get_content())
    index+=1

    mitmdump常用命令

    mitmdump -w resfile:启动mitmproxy代理,并将抓取的数据保存在resfile文件里
    
    mitmdump -s script.py:启动mitmproxy代理,并将抓取的数据通过script.py里的脚本进行处理
    
    mitmdump -p 8081 -s scritp.py:mitmproxy默认的端口号是8080;-p 可以指定监听端口号为8081

博主经验分享

我一般就是mitmdump加上脚本去抓包获取数据,分享一下吧
脚本:

import json

def response(flow):
    url = 'https://hcapi-wx.waimai.meituan.com/storm/graphql/tile/query/drug_detail'
    if flow.request.url.startswith(url):  # 筛选出需要的接口进行分析
        text = flow.response.text  # 接口返回的内容
        res_dict = json.loads(text)  # 字符串转字典
        print(res_dict) # 打印数据内容

命令:

mitmdump -q -s main.py
最后修改:2023 年 04 月 22 日
如果觉得我的文章对你有用,请随意赞赏