Python3 mitmproxy 自定义 HTTP/HTTPS 请求拦截脚本实例

方予
方予
发布时间:2026-10-14| 5人浏览过
原创

本文介绍如何使用Python3编写mitmproxy自定义脚本,实现特定URL请求的拦截与响应修改。通过配置filter_info字典,可灵活控制开关、日志路径及响应文件内容。同时涵盖指定端口监听及反向代理配置示例,适用于开发调试与接口测试场景。

mitmproxy 自定义拦截脚本实现

脚本核心逻辑定义了一个名为 Filter 的类,用于处理流量过滤与日志记录。初始化时设置日志信息、多线程锁、过滤规则信息、响应文件路径、开关状态及默认日志文件名。提供 log 方法用于追加日志字符串,write_log 方法用于将累积的日志信息写入指定文件,并包含线程锁保护以确保写入安全。

具体代码实现如下:


from mitmproxy import http, ctx
from multiprocessing import Lock


class Filter:
  def __init__(self, filter_info):
    self.log_info = ""
    self.mutex = Lock()
    self.filter_info = filter_info
    self.response_file = None
    self.switch_on = False
    self.log_file = "log.txt"

  def log(self, info) -> None:
    self.log_info += f"{info}\n\n"

  def write_log(self, mode="w+") -> None:
    self.mutex.acquire()
    with open(self.log_file, mode) as f:
      f.write(self.log_info)
    self.mutex.release()

  def is_target_flow(self, flow: http.HTTPFlow) -> bool:
    for info in self.filter_info:
      if info["str_in_url"] in flow.request.url:
        self.log_file = info["log_file"]
        self.switch_on = info["switch_on"]
        if info["response_file"] != None:
          self.response_file = info["response_file"]
        return True
    else:
      return False

  def modify_response(self, flow: http.HTTPFlow) -> http.HTTPFlow:
    if self.switch_on and self.response_file:
      with open(self.response_file, "r") as f:
        flow.response.content = f.read().encode()
    return flow

  def request(self, flow: http.HTTPFlow) -> None:
    if self.is_target_flow(flow):
      self.log_info = ""
      self.log(f"——METHOD——\n{flow.request.method}")
      self.log(f"——HOST——\n{flow.request.pretty_host}")
      self.log(f"——URL——\n{flow.request.pretty_url}")
      query = [i + ":" + flow.request.query[i] + "\n" for i in flow.request.query]
      self.log(f"——QUERY STRING——\n{''.join(query)}")
      if flow.request.urlencoded_form:
        form = [i + ":" + flow.request.urlencoded_form[i] + "\n" for i in flow.request.urlencoded_form]
        self.log(f"——FORM——\n{''.join(form)}")
      self.write_log()

  def response(self, flow: http.HTTPFlow) -> None:
    if self.is_target_flow(flow):
      self.log_info = ""
      self.log(f"——RESPONSE before modified——\n{flow.response.content.decode()}")
      flow = self.modify_response(flow)
      self.log(f"——RESPONSE after modified——\n{flow.response.content.decode()}")
      self.write_log(mode="a")


filter_info = [
  {
    "str_in_url": "getSimpleNews",
    "log_file": "getSimpleNews_log.txt",
    "switch_on": True,
    "response_file": "getSimpleNews_response.txt",
  },
  {
    "str_in_url": "getQQNewsComment",
    "log_file": "getQQNewsComment_log.txt",
    "switch_on": True,
    "response_file": None,
  }
]
addons = [
  Filter(filter_info)
]

脚本使用方法与配置

使用该脚本时,需通过命令行启动 mitmproxy 并指定脚本路径及监听端口。

启动命令示例如下,其中 -p 指定端口号,-s 指定脚本文件路径:

mitmproxy -p 6666 -s xxx.py

在 mitmproxy 运行过程中,脚本将执行以下操作:

1. 检查请求 URL 是否包含 filter_info 中定义的 str_in_url 字符串,若匹配则视为目标流量。

2. 若配置了 response_file,则将拦截到的响应内容替换为指定目录下 response_file 文件中的内容。

3. 将拦截过程的详细信息打印并保存至当前运行目录下的 log_file 指定的日志文件中。

4. 若无需修改响应内容,可将对应规则的 switch_on 设置为 False,以关闭该规则的拦截功能。

5. 如果不需要替换响应内容,应将 response_file 设置为 None。

指定端口监听与反向代理配置

补充知识:关于 mitmproxy 监听指定端口的配置方法。

安装 mitmproxy 可通过 Python3 环境进行。

推荐使用 Python3 的安装方式进行部署。

官方文档地址为:https://mitmproxy.org/

配置监听指定端口的方法如下。

以监听 Presto SQL 请求为例进行说明。

假设 Presto 服务地址为:http://datacenter4:18080。

使用 mitmproxy 命令进行监听,端口设为 8484,配置如下: mitmproxy \ --mode reverse:http://datacenter4:18080 \ --listen-host datacenter4 \ --listen-port 8484 \ --replacements :~s:\/\/datacenter4/:\/\/datacenter4:18080/

配置完成后,JDBC 连接 Presto 时应使用新端口:jdbc:presto://datacenter4:8484。

上述配置可实现对指定服务的透明代理与流量监听。

以上即为 Python3 自定义 HTTP/HTTPS 请求拦截 mitmproxy 脚本的完整实例,供开发者参考使用。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。