本系统解决“无公网IP环境下,通过网页端远程控制网易版Minecraft客户端”的核心需求,适配Windows/Linux客户端,支持:
- 网页端输入MC指令,客户端模拟键鼠执行(网易版无RCON权限适配);
- 定时/手动查询服务器玩家数量+玩家名单,且用户指令优先级高于定时查询;
- 全链路256位密钥身份验证,防止非法访问;
- 客户端断连自动重连,保证通信稳定性。
graph LR
A[用户网页端] -->|HTTP+256位KEY| B[公网PHP中转服务器]
C[无公网Windows客户端] -->|长连接+256位KEY| B
A -->|输入指令/配置查询间隔| B
B -->|转发高优先级指令| C
C -->|双队列+优先级执行| D[网易版MC]
C -->|定时低优先级/list查询| D
C -->|返回执行结果/玩家信息| B
B -->|返回结果到网页| A
| 特性 | 实现方式 |
|---|---|
| 无公网IP通信 | 客户端主动连接公网PHP服务器(反向连接),无需端口映射 |
| 指令优先级 | 双队列(高优先级:用户指令;低优先级:定时/list)+ 互斥执行 |
| 高精度识别 | PaddleOCR+图片预处理(二值化/降噪/放大),适配MC特殊字体 |
| 安全验证 | 256位SHA-256密钥全链路验证,仅合法请求可执行指令 |
| 可配置定时查询 | 网页端动态修改/list查询间隔(≥5秒),客户端实时生效 |
| 自动重连 | 客户端断连后自动重试,服务器定期清理失效连接 |
| 跨平台兼容 | 客户端适配Windows(Linux仅需微调窗口控制逻辑) |
| 模块 | 核心技术/工具 | 前置依赖 |
|---|---|---|
| 公网PHP端 | PHP Socket、HTTP接口、256位密钥验证 | 开启PHP socket扩展,放行9501(Socket)/80/443(网页)端口 |
| Windows客户端 | Python 3.8+、PaddleOCR、pyautogui | 管理员权限、安装依赖库、MC窗口化运行、关闭中文输入法(MC窗口) |
| 核心能力 | 键鼠模拟、OCR识别、线程安全队列、长连接 | Windows:pyautogui/pygetwindow/paddleocr;Linux:wmctrl(窗口控制) |
- 公网PHP服务器启动Socket长连接服务,监听客户端连接;
- Windows客户端以管理员身份运行,主动连接PHP服务器并完成密钥验证;
- 客户端启动3个线程:通信线程(接收服务器指令)、消费线程(处理指令队列)、定时查询线程(低优先级/list);
- 网页端发送指令/配置,PHP服务器转发到客户端高优先级队列;
- 客户端消费线程优先执行用户指令,空闲时执行定时/list查询;
- 客户端将执行结果/玩家信息返回PHP服务器,再由服务器推送到网页端展示。
/var/www/html/
├── config.php # 全局配置(密钥/端口/临时文件)
├── socket_server.php # Socket长连接服务(后台常驻,转发指令)
├── api.php # 网页端接口(接收请求/返回结果)
└── index.php # 前端操作界面(指令输入/查询配置/结果展示)
- 环境准备:
- 公网服务器需安装PHP(7.4+)、开启
socket扩展(修改php.ini:extension=socket.so,重启PHP服务); - 放行端口:在服务器防火墙/安全组中放行9501(Socket)、80/443(网页)端口。
- 公网服务器需安装PHP(7.4+)、开启
- 文件部署:
- 将上述4个文件上传到服务器网页根目录(如
/var/www/html); - 修改
config.php中的SECRET_KEY为自己生成的256位密钥; - 修改
index.php中的API_URL为服务器公网域名/IP。
- 将上述4个文件上传到服务器网页根目录(如
- 启动Socket服务:
# 后台启动Socket服务,输出日志到socket.log nohup php /var/www/html/socket_server.php > /var/www/html/socket.log 2>&1 & # 验证服务是否启动(查看端口是否监听) netstat -tulpn | grep 9501
- 权限配置:
- 给
/tmp目录赋权(确保PHP能写入临时文件,如果MySQL服务正常就不用):chmod 777 /tmp; - 确保PHP进程对网页目录有读写权限。
- 给
以管理员身份运行CMD,执行以下命令安装依赖:
# 核心依赖(键鼠模拟、窗口控制、OCR识别)
pip install pyautogui pygetwindow pillow paddleocr opencv-python numpy
# 可选:如果需要中文OCR更精准,安装paddlepaddle国内源
pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple- 配置修改:
- 打开
mc_client.py,修改SERVER_HOST为PHP服务器公网IP/域名; - 确认
SERVER_PORT(9501)、SECRET_KEY与PHP端一致; - 确认
MC_WINDOW_NAME为网易版MC窗口名称(默认“我的世界”,可通过截图工具确认)。
- 打开
- 运行前准备:
- 启动网易版MC,登录并进入目标服务器;
- 将MC窗口设置为窗口化模式(非全屏);
- 关闭MC窗口的中文输入法(切换为英文);
- 以管理员身份打开CMD(右键CMD → 以管理员身份运行)。
- 启动客户端:
# 进入代码所在目录 cd /d D:\mc_client # 运行客户端 python mc_client.py
- 验证运行:
- 客户端日志显示“服务器连接成功,密钥验证通过”;
- 网页端输入指令(如
list),客户端日志显示“执行高优先级指令:exec_cmd”; - MC窗口自动执行指令,网页端返回玩家数量+名单。
| 问题现象 | 排查方案 |
|---|---|
| 无法找到MC窗口 | 确认MC窗口名称正确;MC已启动且未最小化;以管理员身份运行客户端 |
| 键鼠模拟无效果 | MC窗口需为前台窗口;关闭MC全屏;切换为英文输入法;确认管理员权限 |
| 玩家数量识别失败 | 微调chat_box_rect坐标;检查OCR依赖是否安装完整;确保聊天框有/list返回结果 |
| 客户端无法连接服务器 | 检查服务器9501端口是否放行;确认SERVER_HOST/SERVER_PORT正确;密钥是否一致 |
| 定时查询不执行 | 检查高优先级队列是否有未执行的指令;确认查询间隔≥5秒;日志是否有报错 |
- 无公网IP适配:客户端主动连接公网服务器,无需端口映射;
- 指令优先级:用户指令永远优先于定时查询,避免执行冲突;
- 高精度识别:PaddleOCR+图片预处理,适配MC特殊字体;
- 安全可靠:256位密钥验证,防止非法访问;
- 易扩展:支持新增指令类型(如服务器状态查询、玩家踢出等)。
- PHP端:Socket服务需后台常驻,确保临时文件目录有写入权限;
- 客户端:必须管理员权限运行,MC窗口化+英文输入法;
- 网络:确保客户端能访问公网服务器(测试
ping 服务器IP); - 性能:定时查询间隔建议≥5秒,避免频繁操作影响MC运行。
-
增加指令白名单:限制危险指令(如/stop、/op);
-
增加日志持久化:客户端/服务器日志写入文件,便于排查问题;
-
支持多客户端:修改PHP端Socket服务,实现多客户端管理;
-
前端优化:增加指令历史记录、玩家名单可视化等功能。