# mock **Repository Path**: lingalreis/mock ## Basic Information - **Project Name**: mock - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-15 - **Last Updated**: 2026-04-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Mock API Server ## 1. 项目介绍 Mock 模拟数据接口服务:从真实 API 拉取响应数据,在本地提供 mock 服务,供客户端或测试环境使用。支持数据定时更新、热更新,以及 docker / docker-compose 部署。 ### 功能特性 - **接口模拟**:根据请求体中的 `Api` 字段(及 `Name` 字段)匹配并返回预录制的响应数据 - **数据热更新**:修改 `mock_data.json` 后,下次请求自动加载最新数据,无需重启 - **定时更新**:支持 interval(固定间隔)和 cron(定时表达式)两种自动更新策略 - **启动即更新**:服务启动前自动从真实 API 拉取一次最新数据 - **环境变量配置**:关键参数均可通过环境变量覆盖 - **零依赖**:纯 Python 标准库实现,无需安装第三方包 ### 路由匹配规则 | 接口类型 | 匹配方式 | 示例 | |----------------|--------------------|-------------------------------| | `GetPublicData` | `Api` + `Name` 双键 | `Api=GetPublicData, Name=Hd` | | 其他接口 | `Api` 单键 | `Api=GetToken`、`Api=HeartBeat` | 当前已注册的 mock 路由: | Api | Name | 匹配方式 | 数据来源 | |-----------------|-------------|----------|----------| | GetToken | - | Api | 自动更新 | | GetAppGongGao | - | Api | 自动更新 | | GetAppVersion | - | Api | 自动更新(两次调用:先用 Version=1.0.0 获取 NewVersion,再以此调用) | | GetAppUpDataJson| - | Api | 自动更新(需 Token 请求头) | | UserLogin | - | Api | 固定数据 | | GetUserConfig | - | Api | 固定数据 | | SetTab | - | Api | 固定数据 | | HeartBeat | - | Api | 固定数据 | | GetPublicData | Hd | Api+Name | 自动更新 | | GetPublicData | rObjects | Api+Name | 自动更新 | | GetPublicData | systemNotice| Api+Name | 自动更新 | | GetPublicData | ocversion | Api+Name | 自动更新 | | GetPublicData | ObjectConf | Api+Name | 自动更新 | > **自动更新**:由 `mock_data.py` 从真实 API 拉取最新数据覆盖。 > **固定数据**:来自 `mock_data.json` 的初始数据,更新时不会被修改或丢失。 --- ## 2. 项目文件说明 ``` . ├── mock.py # Mock 服务主程序(HTTP 服务器 + 调度器 + Cron 解析器) ├── mock_data.py # 数据更新模块(GetAppVersion 两次调用、GetAppUpDataJson 等,并备份 mock_data_.json) ├── mock_data.sh # 数据更新 Shell 版本(依赖 curl + jq) ├── mock_data.json # Mock 数据存储(由 mock_data.py/sh 生成) ├── mock_data_.json # 按 GetAppVersion 返回的 Version 备份(如 mock_data_2.3.5.json) ├── Dockerfile # Docker 镜像构建文件 ├── DockerfilebBuild.sh # 多平台构建并推送 Harbor 的脚本 ├── docker-compose.yml # docker-compose 部署配置 ├── .dockerignore # Docker 构建排除规则 ├── mock_iptables_add.sh # Linux 客户端:添加 iptables 转发规则 ├── mock_iptables_delete.sh # Linux 客户端:删除 iptables 转发规则 ├── mock_macos_pf_add.sh # macOS 客户端:添加 pf 重定向规则 ├── mock_macos_pf_delete.sh # macOS 客户端:删除 pf 重定向规则 ├── mock_windows_portproxy_add.ps1 # Windows 客户端:添加 portproxy 转发 └── mock_windows_portproxy_delete.ps1 # Windows 客户端:删除 portproxy 转发 ``` --- ## 3. 项目使用说明 ### 3.1 本地运行 ```bash # 默认端口 18888 python3 mock.py # 自定义端口 python3 mock.py 8080 # 通过环境变量配置定时更新 UPDATE_INTERVAL=300 python3 mock.py # 同时启用 interval 和 cron UPDATE_INTERVAL=600 UPDATE_CRON="0 */2 * * *" python3 mock.py ``` ### 3.2 手动更新数据 ```bash # Python 版本 python3 mock_data.py # Shell 版本(依赖 curl + jq) bash mock_data.sh ``` `mock_data.py` / `mock_data.sh` 会: 1. 调用 GetToken 获取 Token 2. **GetAppVersion**:先以 `Version=1.0.0` 调用,取响应中的 `NewVersion`,再以此 Version 调用第二次,获取最终数据 3. 调用 GetAppUpDataJson(需 Token)、GetAppGongGao、GetPublicData 等 4. 写入 `mock_data.json`,并按 GetAppVersion 返回的 Version 备份为 `mock_data_.json`(如 `mock_data_2.3.5.json`) ### 3.3 接口调用示例 ```bash # 查看所有已注册路由 curl http://127.0.0.1:18888/ # 请求 mock 接口 curl -X POST "http://127.0.0.1:18888/Api?AppId=10003" \ -H "Content-Type: application/json" \ -d '{"Api":"GetPublicData","Name":"ocversion","Status":67246,"Time":1770688192}' # 请求 HeartBeat curl -X POST "http://127.0.0.1:18888/Api?AppId=10003" \ -H "Content-Type: application/json" \ -d '{"Api":"HeartBeat","Status":36801,"Time":1770689331}' # 请求 GetAppUpDataJson(需 Token 请求头,Token 来自 GetToken 返回值) curl -X POST "http://127.0.0.1:18888/Api?AppId=10003" \ -H "Content-Type: application/json" \ -H "Token: G3UVPMFKPSTOBSZOGVBXZJCLBJGM9MRB" \ -d '{"Api":"GetAppUpDataJson","Status":43035,"Time":1770860556}' ``` ### 3.4 环境变量 | 变量 | 默认值 | 说明 | |--------------------|----------------------------|------| | `MOCK_PORT` | `18888` | HTTP 服务监听端口 | | `UPDATE_INTERVAL` | `0` | 定时更新间隔(秒),`0` 表示禁用 | | `UPDATE_CRON` | `""` | Cron 表达式,空字符串表示禁用 | | `API_URL` | `http://43.138.132.233:18888` | 真实 API 地址 | | `APP_ID` | `10003` | 应用 ID,用于拼接请求 URL | | `TZ` | `Asia/Shanghai` | 时区(影响 Cron 调度时间) | ### 3.5 Cron 表达式与更新策略 标准 5 字段格式:`分 时 日 月 星期` | 语法 | 说明 | 示例 | |--------|--------|------| | `*` | 任意值 | `* * * * *` 每分钟 | | `*/N` | 每隔 N | `*/5 * * * *` 每 5 分钟 | | `N` | 固定值 | `30 3 * * *` 每天 03:30 | | `N-M` | 范围 | `0 9 * * 1-5` 工作日 09:00 | | `N,M` | 多个值 | `0,30 * * * *` 每小时 :00 和 :30 | | 场景 | 配置 | |----------------|------| | 禁用自动更新 | `UPDATE_INTERVAL=0`(默认) | | 每 5 分钟更新 | `UPDATE_INTERVAL=300` | | 每天凌晨 3 点 | `UPDATE_CRON=0 3 * * *` | | 每 2 小时整点 | `UPDATE_CRON=0 */2 * * *` | | 双策略同时生效 | `UPDATE_INTERVAL=600` + `UPDATE_CRON=0 */2 * * *` | > 当 `UPDATE_INTERVAL=0` 且未配置 `UPDATE_CRON` 时,服务启动时**不会**从真实 API 拉取数据,直接使用本地 `mock_data.json` 提供服务。 ### 3.6 数据格式 `mock_data.json` 以 `Api` 或 `Api:Name` 为 key: ```json { "GetToken": { "request_sample": { "Api": "GetToken", "Status": 14765, "Time": 1770688025 }, "response_template": { "Data": { "Token": "xxx", ... }, "Time": 1770688025, "Status": 14765, "Msg": "" } }, "GetPublicData:ocversion": { "request_sample": { "Api": "GetPublicData", "Name": "ocversion", ... }, "response_template": { "Data": { "ocversion": "v4", ... }, ... } } } ``` 自动更新覆盖 GetToken、GetAppGongGao、GetAppVersion(两次调用)、GetAppUpDataJson、GetPublicData 等可拉取路由;4 条固定路由(UserLogin、GetUserConfig、SetTab、HeartBeat)始终保留。 --- ## 4. 项目构建 基于 `python:3.9-slim`,纯标准库无额外依赖,镜像体积约 125MB。 ### 4.1 本地简单构建 ```bash docker build -t mock/helldivers2 . ``` ### 4.2 多平台构建并推送 Harbor(DockerfilebBuild.sh) 使用 `DockerfilebBuild.sh` 通过 docker buildx 构建多平台镜像并可选推送到 Harbor: ```bash # 默认配置(linux/amd64,推送到默认 Harbor),打两个 Tag:latest + 当天日期 yyyyMMdd bash DockerfilebBuild.sh # 指定主 Tag,仍会打日期 Tag bash DockerfilebBuild.sh v1.0.0 # 覆盖仓库 / 名称 / 平台 IMAGE_REGISTRY=my.harbor.local:443 \ IMAGE_NAME=library/mock/helldivers2 \ PLATFORMS=linux/amd64,linux/arm64 \ bash DockerfilebBuild.sh v1.0.0 # 仅本机构建不推送 PUSH=false bash DockerfilebBuild.sh # 禁用缓存 NO_CACHE=true bash DockerfilebBuild.sh ``` 主要环境变量:`IMAGE_REGISTRY`、`IMAGE_NAME`、`IMAGE_TAG`、`BUILD_DATE_TAG`、`PLATFORMS`、`DOCKERFILE`、`PUSH`、`NO_CACHE`(详见脚本内注释)。 --- ## 5. 项目部署 ### 5.1 使用 docker 运行容器 适用于单机、临时或自定义参数场景。 ```bash # 基本运行(仅启动时更新一次数据) docker run -d -p 18888:18888 --name mock.helldivers2 mock/helldivers2 # 每 5 分钟自动更新数据 docker run -d -p 18888:18888 \ -e UPDATE_INTERVAL=300 \ --name mock.helldivers2 mock/helldivers2 # 每 2 小时整点更新 docker run -d -p 18888:18888 \ -e "UPDATE_CRON=0 */2 * * *" \ --name mock.helldivers2 mock/helldivers2 # 同时启用 interval + cron,并自定义 API 地址 docker run -d -p 18888:18888 \ -e UPDATE_INTERVAL=600 \ -e "UPDATE_CRON=0 */2 * * *" \ -e API_URL=http://your-api-host:port \ -e APP_ID=10003 \ --name mock.helldivers2 mock/helldivers2 # 查看日志 docker logs -f mock.helldivers2 # 停止并删除 docker stop mock.helldivers2 && docker rm mock.helldivers2 ``` ### 5.2 使用 docker-compose 运行 在已有镜像(如从 Harbor 拉取)的前提下,推荐用 docker-compose 统一管理容器与网络。 `docker-compose.yml` 完整配置: ```yaml services: mock.helldivers2: image: harbor.5210125.xyz:12443/library/mock/helldivers2:latest container_name: mock.helldivers2 hostname: mock.helldivers2 networks: - local ports: - 18888:18888 environment: - TZ=Asia/Shanghai - LANG=en_US.UTF-8 restart: always networks: local: external: true ``` 如需定时更新,可在 `environment` 中追加: ```yaml environment: - TZ=Asia/Shanghai - LANG=en_US.UTF-8 - UPDATE_INTERVAL=300 # 每 5 分钟更新 # - UPDATE_CRON=0 */2 * * * # 或每 2 小时整点更新 # - API_URL=http://your-api:18888 # 自定义真实 API 地址 # - APP_ID=10003 # 自定义 AppId ``` 首次使用需先创建外部网络: ```bash docker network create local ``` 常用命令: ```bash # 后台启动 docker compose up -d # 查看日志 docker compose logs -f mock.helldivers2 # 停止并删除容器 docker compose down ``` 使用日期 Tag 镜像时,将 `image` 中的 `:latest` 改为对应 Tag(如 `:20260211`),再执行 `docker compose pull` 和 `docker compose up -d`。 --- ## 6. 客户端流量劫持 在客户端设备上可将访问真实 API 的流量重定向到 mock 服务。仓库提供按操作系统划分的脚本,与 docker-compose 中的服务名/端口一致使用。 ### 6.1 Linux(iptables) 在 Linux 客户端上透明转发真实 API 流量到 mock 服务: ```bash # 添加转发规则(需 root) sudo bash mock_iptables_add.sh # 恢复直连真实 API sudo bash mock_iptables_delete.sh ``` 默认:真实 API `43.138.132.233:18888` → Mock 服务 `10.0.0.211:18888`。 可通过环境变量覆盖:`REAL_IP`、`MOCK_IP`、`MOCK_PORT`。脚本可重复执行,不会重复添加或误删不存在的规则。 示例: ```bash REAL_IP=1.2.3.4 MOCK_IP=192.168.1.10 MOCK_PORT=18888 sudo bash mock_iptables_add.sh ``` ### 6.2 macOS(pf) 在 macOS 客户端上使用 pf 重定向(需 root,会修改 `/etc/pf.conf`,脚本首次运行会备份为 `/etc/pf.conf.mock.bak`): ```bash sudo bash mock_macos_pf_add.sh # 添加规则 sudo bash mock_macos_pf_delete.sh # 删除规则 ``` 默认与 Linux 一致,同样支持 `REAL_IP`、`MOCK_IP`、`MOCK_PORT`。建议仅在开发/测试环境使用。 ### 6.3 Windows(netsh portproxy) Windows 无法透明修改目的 IP,需将客户端改为访问本机端口,再用 portproxy 转发到 mock 服务。PowerShell 脚本需**以管理员身份**运行: ```powershell .\mock_windows_portproxy_add.ps1 # 默认监听 127.0.0.1:18888 → 10.0.0.211:18888 .\mock_windows_portproxy_delete.ps1 # 删除转发 ``` 可覆盖:`REAL_LISTEN_IP`、`MOCK_IP`、`MOCK_PORT`。配置完成后,将客户端请求地址设为 `127.0.0.1:18888`(或自定义的 `REAL_LISTEN_IP:MOCK_PORT`)即可。