三角洲行动© 挂狗地图 API,提供挂房数据获取功能。
三角洲行动© 挂狗地图 API 是一个基于 NestJS 构建的高性能后端服务,专门用于:
- 服务器探测:自动扫描和监控游戏服务器的在线状态
- 实时数据采集:通过 WebSocket 连接获取实时游戏数据(玩家位置、装备、血量等)
- 多数据库支持:兼容 MySQL、PostgreSQL 和 MongoDB
- 数据缓存:使用 Redis 缓存探测结果,提高响应速度
- RESTful API:提供标准化的 HTTP 接口供前端调用
- 添加/查询游戏服务器信息
- 支持多种版本协议(当前支持 Ray 版本)
- 服务器状态实时监控
- HTTP 探测:通过Http协议探测外挂雷达网页标识
- WebSocket 探测:建立 WebSocket 连接获取实时数据
- 自动重试机制:支持带密码认证的 WebSocket 连接
- 数据解压缩:自动处理 zlib/gzip 压缩数据
- 多格式解析:支持 JSON 和 MessagePack 格式
- Ray 数据转换器:将原始游戏数据转换为结构化格式
- 玩家信息映射:包含角色名称、装备、血量、护甲等详细信息
- AI/Bot 识别:区分真实玩家和 AI 机器人
- Boss 标记:特殊标记 Boss 级敌人
- 队伍分组:按队伍 ID 组织玩家信息
- Redis 缓存探测结果
- 自动清理旧缓存
- 提高 API 响应速度
- NestJS 11.x - 企业级 Node.js 框架
- TypeScript 5.7+ - 类型安全的 JavaScript
- MySQL (mysql2) - 关系型数据库
- PostgreSQL (pg) - 高级关系型数据库
- MongoDB (mongodb) - NoSQL 文档数据库
- Redis (ioredis) - 内存缓存数据库
- WebSocket (ws) - 实时双向通信
- MessagePack (@msgpack/msgpack) - 高效的二进制序列化
- Prettier - 代码格式化
- ESLint - 代码质量检查
- Jest - 单元测试框架
┌─────────────┐
│ Client │ (Frontend / Mobile App)
└──────┬──────┘
│ HTTP/REST
▼
┌─────────────────────────────────┐
│ NestJS Application │
│ │
│ ┌──────────┐ ┌─────────────┐ │
│ │Controller│→ │ Service │ │
│ └──────────┘ └──────┬──────┘ │
│ │ │
│ ┌────────▼──────┐ │
│ │ ScannerRegistry│ │
│ │ - RayScanner │ │
│ └────────┬──────┘ │
└───────────────────────┼─────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Database │ │ Redis │ │Game Server│
│(MySQL/ │ │ (Cache) │ │(WebSocket)│
│ PG/Mongo)│ │ │ │ │
└──────────┘ └──────────┘ └──────────┘
-
ProbesModule - 探测服务模块
ProbesController- REST API 控制器ProbesService- 核心业务逻辑ServerScannerRegistry- 扫描器注册中心RayServerScanner- Ray 版本专用扫描器
-
DatabaseModule - 数据库模块
- 支持多适配器模式(MySQL/PostgreSQL/MongoDB)
RedisService- Redis 缓存服务
-
Converters - 数据转换器
RayDataConverter- Ray 数据格式转换
- Node.js 18+
- pnpm 包管理器
- 至少一种数据库(MySQL/PostgreSQL/MongoDB)
- Redis 服务器
# 1. 克隆项目
git clone <repository-url>
cd deltaforce_cheat_api
# 2. 安装依赖
pnpm install
# 3. 配置环境变量
cp .env.example .env
# 编辑 .env 文件,填写数据库配置
# 4. 初始化数据库
pnpm run install:db
# 5. 启动开发服务器
pnpm run start:dev# 扫描所有服务器
pnpm run scan创建 .env 文件并配置以下变量:
# 数据库配置(三选一)
DB_DRIVER=mysql # mysql | postgres | mongodb
DB_HOST=localhost
DB_PORT=3306
DB_NAME=deltaforce
DB_USER=root
DB_PASSWORD=your_password
# 应用密钥(用于服务器添加认证)
APP_KEY=your-secret-key-here
# 服务器端口
PORT=3000
# 探测超时设置(毫秒)
PROBE_TIMEOUT_MS=5000
# 自动探测间隔(0 表示禁用,单位:毫秒)
PROBE_INTERVAL_MS=0
# Redis 配置
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=your_redis_password
REDIS_DB=0GET /servers响应示例:
{
"code": 0,
"msg": "success",
"data": [
{
"id": 1,
"address": "example.com:8080",
"version": "ray",
"token": null,
"alive": 1,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z",
"detail": {
"map": {"name": "bks"},
"players": [...],
"items": [...],
"boxes": [...]
}
}
]
}GET /servers/:idPOST /servers
Authorization: Bearer YOUR_APP_KEY
Content-Type: application/json
{
"address": "game-server.example.com:8080",
"version": "ray",
"token": "optional-token"
}请求参数:
address(必填): 服务器地址(URL 或主机名)version(必填): 服务器版本,目前仅支持"ray"token(可选): 服务器访问令牌
注意: 需要有效的 APP_KEY 进行身份验证
探测仅通过 CLI 或自动定时任务执行,不提供 HTTP 触发接口。
GET /servers/:id/probe从 Redis 缓存中获取最新的探测结果。
响应示例:
{
"code": 0,
"msg": "success",
"data": {
"map": {"name": "bks"},
"players": [
{
"name": "Player1",
"isBot": false,
"isBoss": false,
"isCheater": true,
"role": 2100654105,
"roleName": "wl",
"roleAlias": "威风的龙",
"weapon": "AKM",
"health": 100,
"helmet": 3,
"helmetDurability": 80,
"armor": 4,
"armorDurability": 90,
"teamId": 1,
"position": {
"x": 123.45,
"y": 67.89,
"z": 0,
"angle": 180
}
}
],
"items": [
{
"id": "item_001",
"name": "Medical Kit",
"price": 5000,
"grade": 3,
"position": {
"x": 100.5,
"y": 200.3
}
}
],
"boxes": [
{
"isBot": false,
"position": {
"x": 150.0,
"y": 250.0,
"z": 0
}
}
]
}
}# 扫描所有活跃服务器
pnpm run scan
# 扫描指定服务器(通过 ID)
pnpm run scan -- --id 1
# 或简写
pnpm run scan -- 1
# 以 JSON 格式输出
pnpm run scan -- --json
# 查看帮助
pnpm run scan -- --helpJSON 输出示例:
{
"code": 0,
"msg": "success",
"data": {
"summary": {
"total": 5,
"alive": 4,
"failed": 1
},
"results": [
{
"id": 1,
"address": "http://server1.example.com",
"alive": 1,
"scanMode": "ray:http+websocket",
"latencyMs": 150,
"statusCode": 200,
"version": "ray",
"httpMatched": true,
"websocketMatched": true,
"websocketData": {...},
"error": null,
"checkedAt": "2024-01-01T00:00:00.000Z"
}
]
}
}pnpm run install:db自动创建所需的数据库表和索引。
src/
├── common/ # 通用模块
│ ├── api-exception.filter.ts # 全局异常过滤器
│ └── api-response.interceptor.ts # 统一响应拦截器
├── converters/ # 数据转换器
│ ├── index.ts
│ └── ray.converter.ts # Ray 数据转换逻辑
├── database/ # 数据库层
│ ├── adapters/ # 数据库适配器
│ │ ├── mysql.adapter.ts
│ │ ├── postgres.adapter.ts
│ │ └── mongodb.adapter.ts
│ ├── redis/ # Redis 服务
│ │ ├── redis.module.ts
│ │ └── redis.service.ts
│ ├── database.config.ts # 数据库配置
│ ├── database.module.ts
│ ├── database.service.ts
│ └── database.types.ts # 类型定义
├── interface/ # 接口定义
│ ├── GameData.ts # 游戏数据结构
│ ├── index.ts
│ ├── ray.ts # Ray 原始数据类型
│ └── websocket.types.ts # WebSocket 相关类型
├── probes/ # 探测模块
│ ├── probe.types.ts # 探测结果类型
│ ├── probes.controller.ts # REST 控制器
│ ├── probes.module.ts # 模块定义
│ ├── probes.service.ts # 核心服务
│ ├── server-scanners.ts # 服务器扫描器
│ └── server.dto.ts # 数据传输对象
├── app.controller.ts # 应用控制器
├── app.module.ts # 根模块
├── app.service.ts # 应用服务
├── configure-app.ts # 应用配置
├── install.ts # 数据库初始化脚本
├── main.ts # 入口文件
└── scan.ts # 命令行扫描工具
- 在
src/probes/server-scanners.ts中创建新的扫描器类:
class NewVersionScanner implements ServerScanner {
readonly version = 'new-version';
async scan(server: DfServer, context: ScannerContext): Promise<ScannerProbeResult> {
// 实现扫描逻辑
}
}- 在
ServerScannerRegistry构造函数中注册:
constructor() {
this.register(new RayServerScanner());
this.register(new NewVersionScanner()); // 添加新扫描器
}修改 src/converters/ray.converter.ts 中的映射表:
ROLE_NAME_MAP_OFFICIAL- 角色 ID 到名称的映射ROLE_ALIAS_MAP- 角色别名(中文显示名)MAP_NAME- 地图 ID 到名称的映射
# 单元测试
pnpm run test
# 监听模式
pnpm run test:watch
# 测试覆盖率
pnpm run test:cov
# E2E 测试
pnpm run test:e2e# 格式化代码
pnpm run format
# ESLint 检查并修复
pnpm run lint# 编译 TypeScript
pnpm run build
# 启动生产服务器
pnpm run start:prodFROM node:18-alpine
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN npm install -g pnpm && pnpm install --prod
COPY dist/ ./dist/
COPY .env ./
EXPOSE 3000
CMD ["node", "dist/main"]# 安装 PM2
npm install -g pm2
# 启动应用
pm2 start dist/main.js --name deltaforce-api
# 开机自启
pm2 startup
pm2 save如需启用自动探测,设置环境变量:
PROBE_INTERVAL_MS=60000 # 每 60 秒探测一次或使用 cron 任务:
# 每 5 分钟执行一次扫描
*/5 * * * * cd /path/to/project && pnpm run scan > /var/log/deltaforce-scan.log 2>&1- APP_KEY 保护:确保
APP_KEY环境变量设置为强随机字符串,不要泄露 - CORS 配置:根据实际需求修改
configure-app.ts中的跨域设置 - 数据库安全:使用强密码,限制数据库访问 IP
- Redis 认证:启用 Redis 密码认证
- HTTPS:生产环境建议使用反向代理(如 Nginx)启用 HTTPS
- Redis 缓存:合理设置缓存过期时间,平衡实时性和性能
- 探测超时:根据网络状况调整
PROBE_TIMEOUT_MS - 并发控制:大量服务器时使用队列限制并发探测数
- 数据库索引:确保常用查询字段已建立索引
- 连接池:配置适当的数据库连接池大小
欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
本项目采用 CC BY-NC-SA 4.0 许可协议。
您可以:
- 共享 — 在任何媒介以任何形式复制、发行本作品
- 演绎 — 修改、转换或以本作品为基础进行创作
惟须遵守下列条件:
- 署名 — 您必须给出适当的署名,提供指向本许可协议的链接,同时标明是否(对原始作品)作了修改。
- 非商业性使用 — 您不得将本作品用于商业目的。
- 相同方式共享 — 如果您再混合、转换或者基于本作品进行创作,您必须基于与原先许可协议相同的许可协议分发您贡献的作品。
如有问题或建议,请提交 Issue 或通过以下方式联系。
QQ群:酷曦科技
Telegram群:酷曦科技
注意:本项目仅供学习和研究使用,请遵守相关法律法规和游戏用户协议。