[本文出自天外归云的博客园]
脚本内容
代码如下:
from mitmproxy importhttp, ctx from multiprocessing importLock classFilter: 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} " 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 inself.filter_info: if info["str_in_url"] inflow.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"] returnTrue else: returnFalse def modify_response(self, flow: http.HTTPFlow) ->http.HTTPFlow: if self.switch_on andself.response_file: with open(self.response_file, "r") as f: flow.response.content =f.read().encode() returnflow def request(self, flow: http.HTTPFlow) ->None: ifself.is_target_flow(flow): self.log_info = "" self.log(f"——METHOD—— {flow.request.method}") self.log(f"——HOST—— {flow.request.pretty_host}") self.log(f"——URL—— {flow.request.pretty_url}") query = [i + ":" + flow.request.query[i] + "" for i inflow.request.query] self.log(f"——QUERY STRING—— {''.join(query)}") ifflow.request.urlencoded_form: form = [i + ":" + flow.request.urlencoded_form[i] + "" for i inflow.request.urlencoded_form] self.log(f"——FORM—— {''.join(form)}") self.write_log() def response(self, flow: http.HTTPFlow) ->None: ifself.is_target_flow(flow): self.log_info = "" self.log(f"——RESPONSE before modified—— {flow.response.content.decode()}") flow =self.modify_response(flow) self.log(f"——RESPONSE after modified—— {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指定使用该脚本和端口号即可:
mitmproxy -p 6666 -s xxx.py
在mitmproxy运行时:
1. 会拦截url中包含str_in_url字符串的请求
2. 会把response.content修改为当前mitm运行所在目录下的response_file文件中的内容
3. 打印信息在当前mitm运行所在目录下的log_file文件中
4. 如果无需修改response设置switch_on为False即为开关关闭
5. 如果不修改response的话response_file需要写None