Python3 mitmproxy 自定义 HTTP/HTTPS 请求拦截脚本实例
本文介绍如何使用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 脚本的完整实例,供开发者参考使用。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













