mitmproxyのaddonを書いてみる
リクエスト先をlocalhostに飛ばしたいとき
def request(flow):
if flow.request.pretty_host == "example.com":
flow.request.host = "localhost"
flow.request.port = 8889
flow.request.scheme = "http"
flow.request.headers["Host"] = "localhost"
flow.request.headers["Content-Type"] = "text/plain"
レスポンスを加工したいとき
def response(flow: http.HTTPFlow) -> None:
# 略
content viewを追加したいとき
from mitmproxy import contentviews, flow, http
from mitmproxy.contentviews.json import format_json, parse_json, PARSE_ERROR
class XXXX(contentviews.View):
name = "content viewの名前"
# 戻り値が表示する内容
# parse_jsonにjsonを渡すと色付けして表示してくれるので、加工したデータをjsonにして渡すとよい
def __call__(
self,
data: bytes,
*,
content_type: Optional[str] = None,
flow: Optional[flow.Flow] = None,
http_message: Optional[http.Message] = None,
**unknown_metadata,
) -> contentviews.TViewResult:
json_body = parse_json(data)
if json_body is not PARSE_ERROR:
return self.name, format_json(json_body)
# content viewでこれが選択される優先順位を指定する
# 数字が大きいほうが優先順位が高い
def render_priority(
self,
data: bytes,
*,
content_type: Optional[str] = None,
flow: Optional[flow.Flow] = None,
http_message: Optional[http.Message] = None,
**unknown_metadata,
) -> float:
if "XXXXX" in http_message.headers:
return 2
else:
return 0
xxx = XXX()
def load(l):
contentviews.add(xxx)
def done():
contentviews.remove(xxx)
他にも、protobufをparseしたりできますし、androidのtermux上でも同様に動かせるので、発送次第では色々なことができます