代理 mitmproxy Python非命令行启动 使用笔记(一)
mitmproxy Python非命令行启动
在进行 APP
应用操作时,难免会遇到抓包操作,于是我们这里使用 mitmproxy
来完成这能力
目录
简介
mitmproxy
是一组工具,为 HTTP/1、HTTP/2 和 WebSocket 提供交互式、支持 SSL/TLS 的拦截代理,官方文档见这里
常用的命令行启动
- 基础启动
mitmweb # 启动带WEB 可视化界面的代理,默认:host=127.0.0.1,port=8080
mitmproxy # 启动无可视化代理,默认:host=127.0.0.1,port=8080
- 自定义地址端口,允许公共 IP 地址的连接,带脚本插件启动
# host=192.167.6.120,port=8888,允许公共 IP 地址的连接:block_global=false,脚本插件:test_addon.py
mitmweb --listen-host=192.167.6.120 -p=8888 --set block_global=false -s .\test_addon.py
mitmproxy --listen-host=192.167.6.120 -p=8888 --set block_global=false -s .\test_addon.py
注意:为什么要加 block_global=false
?,若不加,则只能本地拦截,而移动设备请求无法被拦截
报错如下:Client connection from 192.167.6.166 killed by block_global option
非命令行脚本直接启动
- 方式一,通过
main.mitmdump
函数
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File : test_mitmproxy.py
@ Author : yqbao
@ Version : V1.0.0
@ Description : 通过`main.mitmdump`函数
"""
from mitmproxy.http import HTTPFlow
from mitmproxy.tools import main
class Counter:
def request(self, flow: HTTPFlow):
request = flow.request # 获取请求对象
print(f"request host = {request.host}")
def response(self, flow: HTTPFlow):
if flow.response.status_code != 200:
return
response = flow.response # 获取响应对象
print(f"response body json = {response.json()}")
if __name__ == '__main__':
main.mitmdump(['-s', __file__, '--listen-host', '192.167.6.120', '-p', '8888', '--set', 'block_global=false'])
- 方式二,通过
dump.DumpMaster
类
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File : test_mitmproxy.py
@ Author : yqbao
@ Version : V1.0.0
@ Description : 通过`dump.DumpMaster`类
"""
import asyncio
from mitmproxy import http, options, optmanager
from mitmproxy.tools import dump
class Counter:
def request(self, flow: HTTPFlow):
request = flow.request # 获取请求对象
print(f"request host = {request.host}")
def response(self, flow: HTTPFlow):
if flow.response.status_code != 200:
return
response = flow.response # 获取响应对象
print(f"response body json = {response.json()}")
async def func_temp(host: str = '127.0.0.1', port: int = 8080, conf_file: str = None):
opts = options.Options(listen_host=host, listen_port=port)
# print(opts.keys()) # 输出选项名称
# 加载配置文件,如果你的参数在 opts.keys() 中不存在,则必须使用配置文件,否则不需要用
if conf_file:
optmanager.load_paths(opts, conf_file)
# with_termlog设置为True会显示运行中mitmproxy遇到的错误;with_dumper是用来控制是否显示每个请求相关信息的
dm = dump.DumpMaster(opts, with_termlog=True, with_dumper=False)
dm.addons.add(Counter()) # python脚本直接运行需要单个add添加
try:
await dm.run()
except BaseException as e:
print(e)
dm.shutdown()
if __name__ == '__main__':
asyncio.run(func_temp(conf_file=r'.\.mitmproxy\config.yaml'))
- 配置文件如下,配置文件中的选项,请参考官网,见这里
%YAML 1.2
---
listen_host: 192.167.6.120
listen_port: 8888
block_global: false
...
参考文章与友情链接
参考文章一
参考文章二
mitmproxy 官方文档
Appium 2.0 官方文档
本文章的原文地址
GitHub主页