文档类型:API 参考 关联软件:FoxTimer 更新于 2026-09-30

集成与 API

FoxTimer 对外集成参考:Web 控制台 REST API、鉴权、参数表、错误码与调用示例。

把 IFU 接进现有系统

1. 集成方式总览

方式 传输 默认监听 特点
HTTP REST TCP 0.0.0.0:9527 /api/* 全部能力:登录、设置读写、计时器 CRUD 与控制
WebSocket TCP 同端口 /ws 服务端单向推送:timers_changed、settings_changed 实时同步(只读,不接收指令)
网页控制台 — 同端口 / 内置 SPA(计时器 / 设置 / 手册三页),即开即用

服务随主程序启动;端口与开关在桌面端「设置 → Web 控制台」修改,保存后服务自动重启生效。不使用远程管理时可整体关闭。

2. 鉴权

项 说明
登录 POST /api/auth/login,body {"password":"<控制密码>"};成功返回 {"token":""}
默认密码 admin123(首次部署必须修改;桌面端设置面板或 PUT /api/settings 的 webPassword 字段修改)
携带方式 其余全部 /api/* 请求需带请求头 Authorization: Bearer
令牌有效期 24 小时;修改密码后旧令牌立即失效
失败响应 403 {"error":"未提供认证令牌|令牌无效|令牌已过期"};密码错误 401 {"error":"密码错误"}
不鉴权的路径 /api/auth/login、网页静态资源(/)、WebSocket(/ws,仅推送只读状态)

令牌为简化 JWT(三段式):签名部分由控制密码派生,因此密码即密钥——不要在日志中泄露密码与令牌。

3. 接口清单

接口 方法 用途
/api/auth/login POST 登录换取 token
/api/settings GET 读全部设置(不含 webPassword)
/api/settings PUT 局部更新设置(见第 4 节字段表)
/api/settings/reset POST 恢复默认设置并清除已持久化的设置与计时器数据;当前会话内已运行的计时器保留,重启后为默认队列
/api/timers GET 计时器列表(含当前索引)
/api/timers POST 添加计时器
/api/timers DELETE 清空全部计时器
/api/timers/ PUT 修改计时器(label / mode / targetMs)
/api/timers/ DELETE 删除单个计时器
/api/timers//toggle POST 开始 / 暂停切换
/api/timers//reset POST 重置计时器
/ws GET(WS) 实时推送订阅

4. 设置字段(PUT /api/settings,全部可选,按需携带)

字段 类型 说明
windowOpacity number 0.3–1.0 窗体透明度(默认 0.95)
textOpacity number 0.3–1.0 计时文字透明度
textColorValue int | null 文字颜色 ARGB;null = 自动跟随主题
hoverTransparent bool 鼠标移出时透明
alwaysOnTop bool 窗口置顶
themeMode string light / dark / system
fontFamily string monospace / Orbitron / Share Tech Mono / JetBrains Mono
alertMethod int 0–3 结束提醒:0 无 / 1 弹窗 / 2 声音 / 3 弹窗+声音
soundPreset int 0–3 结束提示音:0–2 为 MP3-1~3,3 为 TTS
ttsVoice string | null TTS 播报人(null = 系统默认)
alertVolume number 0.0–1.0 提示音音量
countdownAlertMethod int 0–3 倒计时语音提醒方式(同上 0–3,默认 0)
countdownSoundPreset int 0–3 倒计时提示音:0–2 为 MP3-4~6,3 为 TTS
countdownAlertMinutes int[] 剩余分钟提醒点,如 [5,3,1]
countdownAlertText string 播报文本,{time} 占位符(默认「请注意,还剩下{time}分钟」)
countdownEndText string 结束 TTS 播报文本(默认「计时结束」)
webEnabled bool Web 服务开关
webPort int 监听端口(修改后服务自动重启)
webPassword string 控制密码(修改后旧令牌全部失效)

成功响应:{"success":true},并通过 WebSocket 广播 settings_changed(不含密码)。

5. 计时器对象与参数

5.1 计时器对象(GET /api/timers 返回)

{
  "timers": [{
    "id": "uuid",
    "label": "15分0秒",
    "mode": "countDown | countUp",
    "state": "idle | running | paused | finished",
    "displayMs": 899990,
    "formatted": "15:00",
    "targetMs": 900000,
    "elapsedMs": 10,
    "shortcutKey": "1",
    "shortcutModifier": "Control"
  }],
  "currentIndex": 0
}
  • formatted:超过 1 小时显示 HH:MM:SS,否则 MM:SS
  • displayMs:倒计时为剩余值,正计时为已计值

5.2 添加计时器(POST /api/timers)

字段 类型 必填 说明
label string 否 名称,默认「计时器」
mode string 否 countdown(默认)/ countup
targetMs int 否 目标时长毫秒,默认 900000(15 分钟)

返回:{"success":true,"id":"<新计时器id>"}

6. WebSocket 推送(/ws)

连接后由服务端单向推送,消息结构:

{"event": "timers_changed", "data": {"timers": [ ... 同 5.1 ... ], "currentIndex": 0}}
{"event": "settings_changed", "data": { ... 同 GET /api/settings ... }}
  • timers_changed:计时器增删改、状态与进度变化时推送(进度随计时持续刷新);
  • settings_changed:任意设置变更时推送(本地、API、控制台改动同源);
  • 客户端向 /ws 发送的消息服务端不处理;连接无鉴权,请依赖内网边界保护。

7. 错误码与响应约定

HTTP 含义 处理建议
200 成功 业务结果见 body
400 请求格式错误 / 参数非法 核对 JSON 与字段类型
401 登录密码错误 核对控制密码
403 未携带 / 无效 / 过期令牌 重新登录换取 token
404 计时器不存在 先 GET /api/timers 核对 id
500 服务器内部错误 查看桌面端日志,联系技术支持

错误 body 统一为 {"error":"<中文说明>"}。

8. 调用示例

8.1 登录并添加计时器(curl)

# 登录
TOKEN=$(curl -s -X POST http://192.168.1.100:9527/api/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"password":"admin123"}' | sed 's/.*"token":"\([^"]*\)".*/\1/')

# 添加 10 分钟倒计时
curl -X POST http://192.168.1.100:9527/api/timers \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"label":"嘉宾发言","mode":"countdown","targetMs":600000}'

# 立即开始它(toggle)
curl -X POST http://192.168.1.100:9527/api/timers//toggle \
  -H "Authorization: Bearer $TOKEN"

8.2 修改剩余提醒点与播报文本

curl -X PUT http://192.168.1.100:9527/api/settings \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"countdownAlertMinutes":[10,5,3,1],"countdownAlertText":"请注意,还剩下{time}分钟","countdownAlertMethod":3}'

8.3 实时订阅计时状态(Node.js)

const WebSocket = require('ws')
const ws = new WebSocket('ws://192.168.1.100:9527/ws')
ws.on('message', m => {
  const msg = JSON.parse(m)
  if (msg.event === 'timers_changed') {
    const cur = msg.data.timers[msg.data.currentIndex]
    console.log(cur.label, cur.state, cur.formatted)
  }
})

9. 集成注意事项

  • 单端口承载网页 + API + WebSocket;客户端并发无硬限制,控制台与集成方共存没有问题;
  • REST 无幂等键:重复 toggle 会来回切换状态,集成方建议以 GET /api/timers 的 state 为准再操作;
  • settings/reset 会恢复默认设置并清除持久化数据(当前会话正在运行的计时器不受影响,重启后回到默认队列);集成时避免在会中误调;
  • WebSocket 推送频率与计时节拍一致(约 500ms),第三方界面无需自行轮询;
  • 所有设置类修改即时持久化,主程序重启后仍生效。

文档解决不了的,直接问我们

把现场条件和使用场景说清楚,我们的工程师会给出明确结论,而不是只发一份资料链接。