源碼:https://github.com/mitmproxy/mitmproxy
mitmdump
針對 HTTP 生命周期的事件
- 請求:def request(self, flow: mitmproxy.http.HTTPFlow):
- 響應:def response(self, flow: mitmproxy.http.HTTPFlow):
- 其它:
- def http_connect(self, flow: mitmproxy.http.HTTPFlow):
- def requestheaders(self, flow: mitmproxy.http.HTTPFlow):
- def responseheaders(self, flow: mitmproxy.http.HTTPFlow):
- def error(self, flow: mitmproxy.http.HTTPFlow):
請求:def request(flow:flow)
- flow.request.headers
- 獲取所有頭信息,包含Host、User-Agent、Content-type等字段
- flow.request.url
- 完整的請求地址,包含域名及請求參數,但是不包含放在body里面的請求參數
- flow.request.host
- 域名
- flow.request.method
- 請求方式:POST、GET等
- flow.request.scheme
- 請求類型:http、https
- flow.request.path
- 請求的路徑,URL除域名之外的內容
- flow.request.get_text()
- 請求中body的內容,有一些http會把請求參數放在body里面,可通過此方法獲取,返回字典類型
- flow.request.get_content()
- 結果如flow.request.get_text(),返回bytes類型
- flow.request.raw_content
- 結果如flow.request.get_content(),返回bytes類型
- flow.request.urlencoded_form
- MultiDictView,content-type:application/x-www-form-urlencoded的請求參數,不包含url直接帶的鍵值參數
- flow.request.multipart_form
- MultiDictView,content-type:multipart/form-data
- flow.request.query
- 返回MultiDictView類型的數據,URL的鍵值參數
- flow.request.query.get('wd')
- 取得請求參數wd的值
- flow.request.query.keys()
- 取得所有請求參數
- flow.request.query.set_all(key,[value])
- 修改請求參數
from mitmproxy.http import flow def request(flow:flow):# 獲取所有頭信息,包含Host、User-Agent、Content-type等字段# print(flow.request.headers)# 域名# print(flow.request.host)# 請求方式:POST、GET等# print(flow.request.method)# 請求類型:http、https# print(flow.request.scheme)# 請求的路徑,URL除域名之外的內容# print(flow.request.path)# 請求中body的內容,有一些http會把請求參數放在body里面,可通過此方法獲取,返回字典類型# print(flow.request.get_text())# 返回MultiDictView類型的數據,URL的鍵值參數# print(flow.request.query)# 完整的請求地址,包含域名及請求參數,但是不包含放在body里面的請求參數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'))
響應:def response(flow: flow)
- flow.response.status_code
- 狀態碼
- flow.response.text
- 返回內容,已解碼
- flow.response.content
- 返回內容,Bytes類型
- flow.response.get_text()
- 取得響應的文本
- flow.response.set_text()
- 修改響應的文本
- flow.response = flow.response.make(404)
- 返回404
from mitmproxy.http import flow import json import re def response(flow: flow): # 狀態碼 # print(flow.response.status_code) # 返回內容,已解碼 # print(flow.response.text) # 返回內容,Bytes類型 # print(flow.response.content) # 取得響應的文本 # print(flow.response.get_text()) # 修改響應的文本 # flow.response.set_text('123') # 返回404 # flow.response = flow.response.make(404) # 修改淘寶對selenium的js檢測文件 targetUrl = 'https://g.alicdn.com/AWSC/uab/122.js' if targetUrl in flow.request.url: taobao_js =flow.response.get_text() taobao_js = taobao_js.replace('!function(){function','!function (){Object.defineProperties(navigator,{webdriver: {get: () => false}})function') flow.response.set_text(taobao_js) print('已修改') # 淘寶搜索商品時,自動打印商品信息 if 'https://s.taobao.com/search' in flow.request.url: start = flow.response.text.strip().index('{') end = -2 print(json.loads(flow.response.text.strip()[start: end])['mods']['itemlist']['data']['auctions']) # 空氣質量網,修改檢測F12的JS # https://www.aqistudy.cn/historydata if 'https://www.aqistudy.cn/historydata/monthdata.php' in flow.request.url: js = flow.response.text js = re.sub(r'endebug.*?}\);','',js,flags=re.S) flow.response.set_text(js) print('已正常')