Mitmproxy工具之Python API教程
Posted w1990end
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mitmproxy工具之Python API教程相关的知识,希望对你有一定的参考价值。
Mitmproxy工具之Python API教程
Python API是Mitmproxy工具之一,也是python工具,该工具是使用mitmdump加一些参数关联写的脚本文件,可以高度定制化需求。
Python API工具官网介绍地址:https://docs.mitmproxy.org/stable/
这里主要介绍ADDON DEVELOPMENT的内容,该内容是Python API工具的核心内容。
Addons
Addons是mitmproxy的插件机制,这里以官方的实例作为演示。
1、打开pycharm工具,创建一个anatomy.py文件,并且导入mitmproxy包,代码如下:
"""
Basic skeleton of a mitmproxy addon.
Run as follows: mitmproxy -s anatomy.py
"""
from mitmproxy import ctx
class Counter:
def __init__(self):
self.num = 0
def request(self, flow):
self.num = self.num + 1
ctx.log.info("We've seen %d flows" % self.num)
addons = [
Counter()
]
2、使anatomy.py脚本文件与mitmdump关联起来,代码如下:
mitmdump -s ./anatomy.py
- -s参数是指向是python的文件
- 输入以上命令回车,如图:
3、打开mitmproxy的代理工具,访问百度首页,可以查看到python文件中定义的日志信息,如图:
Events
Events是mitmproxy的事件机制,它支持Generic 、HTTP、WebSocket以及TCP等事件,这里以介绍HTTP事件为主,可以看到官方文档包含请求连接,请求头,请求体,以及响应头,响应体等等事件,每一个函数就是一个事件,如图:
- 注意:事件的命名不要随意更改
Mitmproxy的mock之Rewrite实战
1、打开pycharm工具,创建一个rewrite.py文件,并且导入mitmproxy.http、json等包,代码如下:
"""HTTP-specific events."""
import json
import mitmproxy.http
class Rewrite:
def response(self, flow: mitmproxy.http.HTTPFlow):
'''
使用response事件实现Rewrite
:param flow:
:return:
'''
# 判断请求的url是否包含指定的url
if "https://stock.xueqiu.com/v5/stock/batch/quote.json?_t=" in flow.request.pretty_url:
'''
拿到响应数据信息
flow.response.text是str属性,所以如果要是拿到这个对象的话,必须转换为python字典的数据结构,
否则只能使用和str相关的用法
'''
data = json.loads(flow.response.text) # 转换为json格式
data["data"]["items"][0]["quote"]["name"] = "天华超净1234567890"
data["data"]["items"][0]["quote"]["current"] = -2345678998654
data["data"]["items"][0]["quote"]["percent"] = 0
flow.response.text = json.dumps(data) # 转换为原有的格式
# addons 是mitmproxy 的强制要求的规范
# 一定要使用此变量名存放类的实例
addons = [
Rewrite()
]
2、使用mitmdump执行rewrite.py脚本文件,如图:
mitmdump -s ./rewrite.py
3、打开手机上的雪球app,进入到行情页面,查看页面,如图:
- 原图:
- rewrite之后的页面,如图:
Mitmproxy的mock之Map Local实战
1、打开pycharm工具,创建一个map_local.py文件,并且导入mitmproxy、json等包,代码如下:
"""
Basic skeleton of a mitmproxy addon.
Run as follows: mitmproxy -s anatomy.py
"""
import json
from mitmproxy import http
class Events:
def request(self, flow: http.HTTPFlow):
'''
使用request事件实现map local
:param flow:
:return:
'''
# 判断请求的url是否包含指定的url
if "https://stock.xueqiu.com/v5/stock/batch/quote.json?_t=" in flow.request.pretty_url:
with open("xueqiu.json", encoding="utf-8") as f:
'''
给flow.response属性进行赋值,赋值调用mitmproxy响应对象的make方法
响应体在make函数里面所需要的数据为str
'''
flow.response = http.HTTPResponse.make(
200, # (optional) status code
f.read(), # (optional) content
{"Content-Type": "text/html"} # (optional) headers
)
# addons 是mitmproxy 的强制要求的规范
# 一定要使用此变量名存放类的实例
addons = [
Events()
]
- 注意,必须先拿到修改的的原始文件,保存在本地,然后根据对应的需求进行修改,然后代码才进行读取
2、使用mitmdump执行map_local.py脚本文件,如图:
mitmdump -s ./maplocal.py
3、进入到雪球行情页面,刷新页面,如图:
- 原始界面:
- 读取本地修改后xueqiu.json文件如图:
至此,Python API工具使用已经介绍完毕!
以上是关于Mitmproxy工具之Python API教程的主要内容,如果未能解决你的问题,请参考以下文章
[转]使用 mitmproxy + python 做拦截代理
Python3+mitmproxy安装使用教程(Windows)