NTEPilot 是一款专为《异环》设计的自动化工具,通过 ADB 连接 Android 模拟器,自动执行各类游戏操作。项目采用前后端分离架构,后端使用 Python + FastAPI 处理核心逻辑,前端使用 React + TypeScript 构建现代化控制台,通过 WebSocket 实现实时双向通信。
|
|
|
|
|
|
| 运行环境 | Windows 10/11 |
| Python 版本 | 3.14 或更高 |
| Node.js 版本 | 18 或更高(仅开发需要) |
| ADB 工具 | Android Debug Bridge |
| 模拟器 | 雷电、MuMu、BlueStacks 等 Android 模拟器 |
为什么使用模拟器? 如果你用桌面端来运行脚本的话,游戏窗口必须保持在前台,我猜你也不想运行脚本的时候不能动鼠标键盘像个傻宝一样坐在那吧,所以用模拟器
或者使用启动器一键启动
git clone https://github.com/NTEPilot/NTEPilot.git
cd NTEPilot# 使用 uv 安装依赖并同步虚拟环境
uv synccd frontend
npm install
cd ..cd frontend
npm run build
cd ..构建产物输出到 frontend/.static,后端启动后自动托管。
uv run main.py访问 http://127.0.0.1:9150/ 打开控制台。
在控制台的"通用配置"中填写 ADB 设备序列号,格式如 127.0.0.1:16448(不同模拟器端口不同)。
| 层级 | 技术栈 | 说明 |
|---|---|---|
| 前端 | React 19 + TypeScript + Vite 7 | Material Design 3 设计语言,动态配置表单渲染 |
| 后端 | Python 3.14 + FastAPI + Uvicorn | 异步 WebSocket 服务,插件化工具系统 |
| 通信 | WebSocket JSON 协议 | 实时双向通信,支持日志流、状态推送 |
| 图像 | OpenCV 4.13 + ONNX Runtime | 模板匹配、OCR 推理、图像预处理 |
| 设备 | ADB + DroidCast + minitouch | 设备连接、截图捕获、触控输入 |
前后端分离开发时,可同时运行 Vite 开发服务器和后端:
# 终端 1:启动后端
uv run main.py
# 终端 2:启动前端开发服务器
cd frontend
npm run dev访问 http://127.0.0.1:5173/?ws=ws://127.0.0.1:9150/ws
如需仅开发前端,可使用内置的 mock WebSocket 服务器:
# 终端 1:启动 mock 服务器
cd frontend
npm run mock:server
# 终端 2:启动前端
npm run devNTEPilot/
├── main.py # 应用入口
├── pyproject.toml # Python 项目配置
│
├── api/ # WebSocket API 服务
│ ├── server.py # FastAPI 应用及 WebSocket 端点
│ ├── scheduler.py # 每日计划调度器
│ └── task_runner.py # 线程化任务执行器
│
├── NTEPilot/ # 核心业务逻辑
│ ├── config/ # 配置系统
│ ├── device/ # Android 设备交互层
│ ├── tools/ # 工具实现(fish/combat/bond/cafe/daily/house)
│ ├── team/ # 角色/队伍管理
│ ├── ui/ # 屏幕自动化层
│ ├── map/ # 地图导航
│ ├── ocr.py # OCR 文字识别
│ └── instance.py # 实例管理
│
├── template/ # 模板图片资源
│ ├── fish/ # 钓鱼相关模板
│ ├── control/ # 战斗控制模板
│ └── ui/ # 通用 UI 模板
│
├── frontend/ # React 前端
│ ├── src/
│ │ ├── App.tsx # 主界面
│ │ ├── components/ # UI 组件
│ │ ├── lib/ # Hooks
│ │ └── types/ # TypeScript 类型
│ └── vite.config.ts # Vite 配置
│
├── bin/ # 二进制依赖
│ ├── DroidCast/ # 截图 APK
│ └── Minitouch/ # 触控工具
│
├── instances/ # 运行时实例配置
└── logs/ # 运行时日志
配置使用路径式 key,嵌套 JSON 结构:
{
"general": {
"name": "NTE",
"serial": "127.0.0.1:16448"
},
"tools": {
"fish": {
"sell_fish": true,
"buy_bait": true
}
}
}代码中通过 config["tools.fish.buy_bait"] 访问。
| 中文名 | 英文名 | E 技能冷却 | Q 技能冷却 |
|---|---|---|---|
| 零 | Zero | 16s | 15s |
| 早雾 | Sakiri | 16s | 20s |
| 九原 | Jiuyuan | 16s | 15s |
| 哈索尔 | Hathor | 16s | 15s |
| 法帝娅 | Fadia | 16s | 20s |
| 达芙蒂尔 | Daffodill | 16s | 20s |
| 白藏 | Baicang | 14s | 20s |
| 小吱 | Chiz | 3s | 15s |
| 阿德勒 | Adler | 16s | 20s |
| 海月 | Aurelia | 15s | 15s |
| 埃德嘉 | Edgar | 16s | 20s |
| 哈尼娅 | Haniel | 20s | 20s |
| 薄荷 | Mint | 6s | 15s |
| 翳 | Skia | 15s | 15s |
| 娜娜莉 | Nanally | 16s | 15s |
| 浔 | Hotori | 16s | 0s |
| 安魂曲 | Lacrimosa | 16s | 20s |
| 参数 | 类型 | 说明 |
|---|---|---|
general.name |
text | 实例名称 |
general.serial |
text | ADB 设备序列号 |
general.client |
select | 客户端类型:异环 / 云·异环 |
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
tools.fish.sell_fish |
boolean | true | 钓满后自动卖鱼 |
tools.fish.buy_bait |
boolean | true | 鱼饵用完自动购买 |
tools.fish.buy_bait_stack_count |
number | 5 | 每次购买鱼饵组数(1-20) |
tools.fish.green_bar_safe_proportion |
number | 0.4 | 绿条安全比例(0-1) |
| 参数 | 类型 | 说明 |
|---|---|---|
team.chara_1 ~ team.chara_4 |
text | 队伍中的角色名称 |
team.skill_order |
text | 技能循环顺序,如 1E>2E>3E>4E>1A |
技能循环格式:<角色编号><技能类型>,角色编号 1-4,技能类型 E/Q/A。
- 创建对应 runner 类,实现任务逻辑
- 在
NTEPilot/config/framework.py中注册任务、runner、字段和默认值
前端会自动发现并渲染新工具,无需修改前端代码。
在 NTEPilot/team/character.py 中:
class NewChara(Character):
def __init__(self, id, device):
super().__init__(id, device, e_cd=16, q_cd=15)
CHINESE_TO_CHARA['新角色'] = NewChara添加或删除 template/ 目录下的 PNG 文件后,需重新生成模块索引:
python template/update.py本项目使用 GNU Affero General Public License v3.0 许可。