让AI写了份报告
# Quicker Link 动作「需开启 WSS」问题排查报告
- 动作:**Quicker Link**(quicker2.0:连接 Android 手机与电脑上的 Quicker)
- 环境:Windows + Quicker 2.3.0.0(通道 slow),账号目录 `fd2c6c81…`,本机 `192.168.31.45`
- 排查时间:2026-10-05 08:5x – 09:1x
- 结论:**不是用户设置问题**。电脑端 WebSocket / WSS 均已开启且服务确实在跑 wss;是动作内部读取了"账号层"设置对象,而当前版本已把这两项设置改为"仅本机"存储,动作因此永远判定为"未开启"。
---
## 一、现象
运行 **Quicker Link** 动作时不出现配对二维码,而是:
1. 弹出提示:`请启用 WebSocket 和安全连接 WSS,点击“应用设置”后重新运行本动作。`
2. 自动打开「Quicker 设置 → HTTP / WebSocket 服务」页。
而设置页显示:`启用安全连接(HTTPS / WSS)` ✔、`启用 WebSocket 服务` ✔、验证码已填写、端口 668;运行状态 `HTTP: 已关闭 WebSocket: 已开启`,证书有效期至 2026-12-16。
## 二、电脑端实测(全部正常)
| 项目 | 实测结果 |
| --- | --- |
| 设置项 `websocket.enableSecure` | true |
| 设置项 `websocket.isEnabled` | true |
| 设置项 `localServer.allowRemote` | true |
| 设置项 `websocket.port` | 668 |
| 验证码 | 已设置(6 位) |
| 本机设置文件 `local-settings.json` | `useHttps=true`、`webSocket.enabled=true`、password 已存 |
| 端口 668 实测 | 仅接受 TLS;`https://192.168.31.45:668/` 正常握手(404),纯 HTTP 请求被断开 → 服务确实在跑 wss |
| 证书 | `CN=*.lan.quicker.cc`(Let's Encrypt 签发,链验证通过,Tls12,2026-12-16 到期) |
| DNS | `192-168-31-45.lan.quicker.cc` → `192.168.31.45`,可解析 |
| 监听 / 防火墙 | 监听 `::` 668(全网卡);Quicker 入站规则允许,当前网络为「专用」 |
| Quicker 日志 | 无任何 wss 相关报错 |
## 三、根因
动作内部是一段 C# 脚本(编译产物缓存:`…\script-cache-abi-2\normal\b1c05a72….dll`),其判定逻辑为:
```
GetSecureWebSocketErrorCode():
IApplicationSettingsService.Settings2 // 账号层设置
→ UserSettings2.WebsocketServerSettings
→ IsEnabled && EnableSecure // 不满足 → 返回 "secure_websocket_required"
→ IsValidPassword(Password) // 不满足 → 返回 "invalid_connection_password"
在运行中的 Quicker 进程里读同一个对象,实测值:
LIVE UserSettings2.WebsocketServerSettings : IsEnabled=False EnableSecure=True Password=(空) Port=668
FRESH new WebsocketServerSettings() : IsEnabled=False EnableSecure=True Password=(null) Port=668
**两者完全一致**,说明该对象根本没有被当前版本的设置流程写入。
而设置页真正写入的是**本机层**(日志里 `Target=AccountLocalServerSettings`):
local-settings.json : localServer.useHttps=true localServer.webSocket.enabled=true password=112112
设置页对「启用 WebSocket 服务」的说明也写着 **“仅保存在当前账号本机”**。
→ 动作读的是账号层 `UserSettings2.WebsocketServerSettings`,当前 Quicker 把「启用 WebSocket 服务 / 验证码」存到本机层,两层不再同步,动作永远看到 `IsEnabled=False`、`Password` 为空。
**补充验证(排除"没应用设置"的可能)**:通过设置接口把「启用 WebSocket 服务」关→开、并重设验证码(等价于点“应用设置”)后,该对象**仍为** `IsEnabled=False / Password 空`。所以重新应用设置、重启 Quicker 都不能解决。
## 四、临时解决方案(已验证有效)
在 Quicker 进程内解析同一服务,把账号层对象的两个字段补齐(**仅内存,重启失效**):
```csharp
IApplicationSettingsService.Settings2.WebsocketServerSettings.IsEnabled = true;
IApplicationSettingsService.Settings2.WebsocketServerSettings.Password = <当前验证码>;
验证结果:
- `GetSecureWebSocketErrorCode()` 返回 **空**(判定通过)
- 重新运行动作:不再弹提示、不再跳设置页,出现 **“Quicker Link 配对”** 窗口(含二维码)
> 注意:重启 Quicker 后该内存补丁失效,需要重新执行一次。
## 五、建议的正式修复
(给动作作者 github.com/shuimowang/QuickerLink 和/或 Quicker 官方)
1. **动作**:改为读取“生效设置”,即本机层 `AccountLocalServerSettings`/合并后的服务设置,或使用官方推荐的新设置 API,不要依赖 `UserSettings2.WebsocketServerSettings`。
2. **动作**:判定放宽为“服务在运行且为 wss 即通过”,例如直接探测本机端口能否完成 wss 握手,而不是读对象。
3. **Quicker**:设置提交时同步/通知旧的 `Settings2` 对象(日志为 `[settings-v2] Committed … Notify=False`,可核查是否应 `Notify=True`),或在 2.x 保留兼容映射,避免社区动作集体失效。
4. **兜底**:动作内加一个“跳过环境检查”的开关,便于用户自查。
## 六、快速复现要点
- 触发:面板运行 **Quicker Link** → 弹提示 + 跳设置页,无二维码
- 判定错误码:`secure_websocket_required`(或 `invalid_connection_password`)
- 关键矛盾:设置页「运行状态」显示 **WebSocket 已开启**,但动作报未开启
更新动作,软件。软件通过github更新或者加qq群。