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()
]

Mitmproxy工具之Python API教程_第1张图片
2、使anatomy.py脚本文件与mitmdump关联起来,代码如下:

mitmdump -s ./anatomy.py
  • -s参数是指向是python的文件
  • 输入以上命令回车,如图:
    Mitmproxy工具之Python API教程_第2张图片

3、打开mitmproxy的代理工具,访问百度首页,可以查看到python文件中定义的日志信息,如图:
Mitmproxy工具之Python API教程_第3张图片

Events

Events是mitmproxy的事件机制,它支持Generic 、HTTP、WebSocket以及TCP等事件,这里以介绍HTTP事件为主,可以看到官方文档包含请求连接,请求头,请求体,以及响应头,响应体等等事件,每一个函数就是一个事件,如图:
Mitmproxy工具之Python API教程_第4张图片

  • 注意:事件的命名不要随意更改

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()
]

Mitmproxy工具之Python API教程_第5张图片

2、使用mitmdump执行rewrite.py脚本文件,如图:

mitmdump -s ./rewrite.py

Mitmproxy工具之Python API教程_第6张图片

3、打开手机上的雪球app,进入到行情页面,查看页面,如图:

  • 原图:
    Mitmproxy工具之Python API教程_第7张图片
  • rewrite之后的页面,如图:
    Mitmproxy工具之Python API教程_第8张图片

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()
]

Mitmproxy工具之Python API教程_第9张图片

  • 注意,必须先拿到修改的的原始文件,保存在本地,然后根据对应的需求进行修改,然后代码才进行读取

2、使用mitmdump执行map_local.py脚本文件,如图:

mitmdump -s ./maplocal.py

Mitmproxy工具之Python API教程_第10张图片
3、进入到雪球行情页面,刷新页面,如图:

  • 原始界面:
    Mitmproxy工具之Python API教程_第11张图片
  • 读取本地修改后xueqiu.json文件如图:
    Mitmproxy工具之Python API教程_第12张图片
    至此,Python API工具使用已经介绍完毕!

你可能感兴趣的:(Mitmproxy,python,python)