1.5K
一个功能强大的本地代理服务,支持 HTTP/HTTPS(MITM) 智能Mock、动态数据生成、接口延迟测试等功能
| 功能 | 描述 | 示例 |
|---|---|---|
| HTTP 代理 | 支持按完整URL正则匹配Mock,未匹配的请求自动转发 | ^http://api\.example\.com/.*$ |
| HTTPS MITM 代理 | 通过动态证书签发拦截HTTPS请求,支持Mock和转发 | ^https://api\.example\.com/.*$ |
| 接口延迟测试 | 支持毫秒级精度的延迟模拟,用于性能测试 | delay: 3000 |
| 请求头验证 | 支持正则匹配的请求头权限验证,失败返回401 | Authorization: "Bearer.*" |
| 动态数据生成 | 集成Faker库,支持模板变量生成真实数据 | {{faker.name}} |
| 配置文件热更新 | 修改配置文件后自动重新加载,无需重启 | 实时生效 |
| Docker支持 | 提供完整的Docker化部署方案 | 一键部署 |
# 1. 运行容器
docker run -d -p 8888:8888 jsonstiananan/pretender-proxy:latest
# 2. 测试 HTTP Mock
curl -x http://127.0.0.1:8888 http://www.example.com/api/test
# 运行容器(挂载配置目录)
docker run -d -p 8888:8888 -v ./mockConfig:/app/config jsonstiananan/pretender-proxy:latest
# 1. 克隆项目
git clone https://github.com/anansite/pretender.git
cd pretender
# 2. 安装依赖
pip install -r requirements.txt
# 3. 启动服务
python app.py
# 或使用便捷脚本
./start.sh
启动后日志会打印 CA 证书路径,HTTPS Mock 需客户端信任该证书。
| 变量 | 默认值 | 说明 |
|---|---|---|
PRETENDER_HOST | 0.0.0.0 | 监听地址 |
PRETENDER_PORT | 8888 | 监听端口 |
Pretender 通过 MITM(中间人)方式拦截 HTTPS 请求:
CONNECT host:port 请求首次启动时会自动生成 CA 证书(certs/ca.crt)。Docker 环境可通过以下方式导出:
docker cp <container>:/app/certs/ca.crt ~/pretender-ca.crt
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/pretender-ca.crt
# 方式1:指定 CA 证书
curl -x http://127.0.0.1:8888 --cacert certs/ca.crt https://api.example.com/api/test
# 方式2:跳过证书验证
curl -k -x http://127.0.0.1:8888 https://api.example.com/api/test
mocks:
# HTTPS Mock(URL以https://开头)
- url: ^https://api\.example\.com/api/test$
method: GET
response:
code: 200
msg:
message: "Hello from HTTPS Mock!"
timestamp: "{{datetime.now}}"
# 支持 IP 地址 + 非标准端口
- url: ^https://172\.25\.224\.105:11111/api/rest/.*$
method: GET
response:
code: 200
msg:
data: "HTTPS Mock Response"
config/mock_config.yaml
mocks:
- url: "^https?://example\.com/api/.*$" # 正则匹配URL(支持http/https)
method: "GET" # HTTP方法
headers: # 请求头验证(可选)
Authorization: "Bearer.*"
response: # 响应配置
code: 200 # HTTP状态码
msg: # 响应内容
message: "{{faker.sentence}}"
data: "{{random.randint:1,100}}"
delay: 1000 # 延迟时间(毫秒,可选)
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
url | String | 是 | 正则表达式,re.fullmatch 匹配完整URL | ^https?://api\.example\.com/.*$ |
method | String | 是 | HTTP方法(GET、POST、PUT、DELETE等) | GET |
headers | Object | 否 | 请求头验证规则,支持正则匹配 | Authorization: "Bearer.*" |
response | Object | 是 | Mock返回内容,支持模板变量 | 见示例 |
delay | Number | 否 | 模拟接口延迟时间(毫秒) | 3000 |
- url: ^http://api\.example\.com/users$
method: GET
response:
code: 200
msg:
id: "{{faker.uuid4}}"
name: "{{faker.name}}"
- url: ^http://api\.example\.com/secure$
method: GET
headers:
Authorization: "Bearer.*"
response:
code: 200
msg:
message: "认证成功"
- url: ^http://api\.example\.com/slow$
method: GET
response:
code: 200
msg:
message: "延迟响应"
delay: 3000 # 延迟3秒
| 类型 | 语法 | 示例 |
|---|---|---|
| Faker | {{faker.method}} | {{faker.name}} |
| Faker带参数 | {{faker.method:param1,param2}} | {{faker.random_number:6}} |
| Random | {{random.method}} | {{random.randint:1,100}} |
| Datetime | {{datetime.method}} | {{datetime.now}} |
| 方法 | 示例 | 说明 |
|---|---|---|
{{faker.name}} | 张三 | 生成姓名 |
{{faker.email}} | [email protected] | 生成邮箱 |
{{faker.phone_number}} | 13812345678 | 生成电话号码 |
{{faker.uuid4}} | 550e8400-e29b-41d4-... | 生成UUID |
{{faker.company}} | 腾讯科技有限公司 | 生成公司名 |
{{faker.address}} | 北京市朝阳区xxx街道 | 生成地址 |
| 方法 | 示例 | 说明 |
|---|---|---|
{{random.randint:1,100}} | 42 | 随机整数 |
{{random.uniform:10,100}} | 67.89 | 随机浮点数 |
{{random.choice:"a","b","c"}} | b | 随机选择 |
| 方法 | 示例 | 说明 |
|---|---|---|
{{datetime.now}} | 2024-01-15 10:30:00 | 当前日期时间 |
{{datetime.strftime:"%Y-%m-%d"}} | 2024-01-15 | 格式化日期 |
# Mock 响应
curl -x http://127.0.0.1:8888 http://www.example.com/api/test
# 代理转发(未匹配Mock规则)
curl -x http://127.0.0.1:8888 http://httpbin.org/get
# 使用 CA 证书
curl -x http://127.0.0.1:8888 --cacert certs/ca.crt https://api.example.com/api/test
# 跳过证书验证
curl -k -x http://127.0.0.1:8888 https://api.example.com/api/test
# HTTPS 透传(未匹配,转发到真实服务器)
curl -k -x http://127.0.0.1:8888 https://httpbin.org/get
-Dhttp.proxyHost=localhost -Dhttp.proxyPort=8888
-Dhttps.proxyHost=localhost -Dhttps.proxyPort=8888
import os
os.environ['HTTP_PROXY'] = 'http://localhost:8888'
os.environ['HTTPS_PROXY'] = 'http://localhost:8888'
process.env.HTTP_PROXY = 'http://localhost:8888';
process.env.HTTPS_PROXY = 'http://localhost:8888';
# 基础运行
docker run -d -p 8888:8888 jsonstiananan/pretender-proxy:latest
# 挂载配置 + 持久化证书
docker run -d -p 8888:8888 \
-v ./mockConfig:/app/config \
-v ./certs:/app/certs \
jsonstiananan/pretender-proxy:latest
# 导出 CA 证书
docker cp <container>:/app/certs/ca.crt .
pip install -r requirements.txt
python app.py
| 问题 | 解决方案 |
|---|---|
| 如何修改Mock配置? | 编辑 config/mock_config.yaml,保存后自动重新加载 |
| 代理配置不生效? | 检查代理地址是否为 127.0.0.1:8888,确保服务正在运行 |
| 数据生成模板不工作? | 检查模板语法,确保使用双大括号 {{}},验证方法名和参数格式 |
| 问题 | 解决方案 |
|---|---|
| HTTPS 请求失败? | 客户端需信任 certs/ca.crt,或使用 curl -k 跳过验证 |
| 证书在哪里? | 首次启动自动生成在 certs/ 目录,Docker 中为 /app/certs/ |
| IP 地址的 HTTPS? | 已支持,证书 SAN 会自动使用 IPAddress 类型 |
| 问题 | 解决方案 |
|---|---|
| 容器无法启动? | 检查端口8888是否被占用,查看日志:docker logs <container> |
| 配置文件不生效? | 检查挂载:docker exec <container> ls -la /app/config/ |
| 证书丢失(重启后)? | 挂载证书目录:-v ./certs:/app/certs |
pretender/
├── app.py # 主入口(asyncio 事件循环)
├── requirements.txt # 依赖
├── Dockerfile
├── start.sh
├── config/
│ └── mock_config.yaml # Mock 配置
├── certs/ # 自动生成
│ ├── ca.key # Root CA 私钥
│ ├── ca.crt # Root CA 证书(客户端需信任)
│ └── domains/ # 域名证书缓存
└── src/
├── core/
│ ├── config_manager.py # 配置管理(热更新)
│ ├── cert_manager.py # CA + 域名证书签发
│ └── data_generator.py # 模板数据生成
├── handlers/
│ └── response_handler.py # Legacy 同步响应处理
└── server/
├── async_proxy.py # asyncio TCP 代理(HTTP + HTTPS MITM)
└── proxy_server.py # Legacy 同步代理服务器
Client → Proxy(8888)
├─ HTTP: 解析URL → 噪音过滤 → match_mock()
│ ├─ 匹配 → DataGenerator → Mock JSON 响应
│ └─ 未匹配 → httpx 转发 → 真实服务器
└─ CONNECT: 动态签发证书 → TLS 握手 → 读取明文请求 → 同上流程
| 文档 | 说明 |
|---|---|
| Faker 官方文档 | 数据生成库 |
| Python Random 模块 | 随机数生成 |
| Python Datetime 模块 | 日期时间处理 |
| 正则表达式测试 | URL匹配规则调试 |
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情
Content type
Image
Digest
sha256:620d671e8…
Size
69.6 MB
Last updated
7 months ago
docker pull jsonstiananan/pretender-proxy