mitmproxy 抓包工具,優點可以使用python進行二次開發,或者進行接口的mock
官網地址:https://www.mitmproxy.org/
打算用這個最初的需求是,想對app做接口測試,但是app的接口有200多個,這么多接口,如果人工的的抓包或者獲取,很浪費人力,那能不能自動的抓取到所有的請求呢?
答案是可以,使用mitmdump -s xx.py 可以過濾我們想要的數據,比如存到數據庫之類的
from mitmproxy import ctx
# 所有的請求都會經過request
def request(flow):
info = ctx.log.info
d = {}
if flow.request.host == 'xxxxx': # 過濾請求,如果host是xxx則寫入請求相關信息
d['url'] = flow.request.url
d['host'] = flow.request.host
d['headers'] = flow.request.headers
d['method'] = flow.request.method
if flow.request.method == 'POST':
d['body'] = flow.request.get_text()
fp = open("/Users/dcc/Desktop/aaaa.txt",'a+',encoding='utf-8')
fp.write(str(d) + '\n')
# 所有的請求都會經過request
def response(flow):
info = ctx.log.info
# info(str(flow.response.headers))
# info(str(flow.response.cookies))
info(str(flow.response.text))
fp = open("/Users/dcc/Desktop/bbbb.txt",'a+',encoding='utf-8')
fp.write(str(flow.response.text) + '\n')
那既然能拿到所有的請求是不是可以為所欲為了呢?具體的應用場景可以自行嘗試哈!比如爬蟲?
MOCK功能:
mock功能也是類似,在request里判斷發送的請求是不是自己想要的,然后進行修改
修改請求:
def request(flow):
if flow.request.url.startswith("http://xxx.x.xxx.com.cn/xxx/xxxx/xxxx"):
ctx.log.info("modify request form")
if flow.request.urlencoded_form:
flow.request.urlencoded_form["code"] = "11111"
else:
flow.request.urlencoded_form = [
("abc", "1234"),("name","name")
]
修改返回:
def response(self, flow):
if flow.request.url.startswith("https://xxx.x.xxx.com.cn/activityInfo/getPrizeInfo=="):
//獲取響應的json字符串,轉成python對象進行解析和修改
response = json.loads(flow.response.get_text())
response['limitCount'] = 1
//修改完成后,獎python對象轉成json字符串,set進請求的響應體重發送給客戶端
flow.response.set_text(json.dumps(response))
ctx.log.info('modify limitCount')