dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
[!WARNING] LobsterAIDaddy 已于 2026-10-21 停止维护(End of Life)。
出于作者个人精力与优先级调整,
dsh-lobsterai-daddy不再继续开发与维护:不再新增功能、不再适配 DSH 新版本、不保证修复缺陷。 仓库与 npm 上的包继续保留,已安装的用户可以照常使用,但不会再收到任何更新。感谢一路以来的使用与反馈。
[!WARNING] LobsterAIDaddy is no longer maintained (End of Life, 2026-10-21).
Due to a shift in the author's personal priorities,
dsh-lobsterai-daddyis discontinued: no new features, no DSH compatibility updates, and no guaranteed bug fixes. The repository and the npm package remain available; existing installs keep working, but no further updates will be published.Thanks to everyone who used it and sent feedback.
把 LobsterAI 多账号管理变成 DSH 界面上的悬浮球:可自由拖拽摆放、位置自动记忆;面板可跟随悬浮球一起移动;点开即查看当前登录账号与账号列表,并直接签到、刷新额度、切号——这些能力由插件宿主内置实现,不需要 LobsterDaddy 控制台常驻。
A draggable floating ball that renders a native-DOM LobsterAI multi-account panel inside DSH: the account LobsterAI is currently signed in as, the full account list with balances and per-account check-in state, check-in-all / refresh-quota / switch-account actions backed by a built-in data layer (reads LobsterAI's SQLite directly), plus a self-hosted board page. Drag it anywhere, let the panel follow it. Only "log in a new account" and "sync gateway into DSH" still need the LobsterDaddy console.

⚠️ 截图为旧版本(≤ v0.9.5),仅作界面布局参考,按钮与指示器以正文为准:图中按钮区有 5 个按钮(含已删除的「抓取当前登录账号」),悬浮球右下角还有已被删除的状态圆点。当前实际为 4 个按钮、球上无圆点。
内容自上而下:操作按钮区 → 当前登录账号 → 账号列表(余额 / 套餐 / 今日已用 / 奖励明细 / 签到状态 / token 到期)→ 运行信息(数据目录 / LobsterAI 进程 / 定时自动签到 / 转接 DSH)。 抽屉顶部状态行的圆点为绿色 = LobsterAI 正在运行(该圆点在抽屉内,悬浮球上已不再有圆点);右侧标注「内置 · 账号 N 个」= 数据由插件宿主直读,不依赖任何外部控制台进程。
| 能力 | 说明 |
|---|---|
| 🟠 悬浮球 | 常驻 DSH 界面,可拖到任意位置,坐标自动持久化(重启后原地出现) |
| 🧲 面板跟随悬浮球 | 拖动悬浮球时面板一起走(相对位置不变);面板头部也可单独拖动;「跟随 / 固定」一键切换并记忆 |
| 📥 原生渲染面板 | 点球展开/收起。抽屉内容自上而下:操作按钮 → 当前登录账号 → 账号列表 → 运行信息(数据目录 / LobsterAI 进程 / 定时自动签到 / 转接 DSH) |
| 👤 当前登录账号 | 自动读取 LobsterAI 的登录状态并显示昵称;切号后自动更新,无需手动抓取 |
| ✅ 签到状态与时间 | 每个账号显示 已签到 / 今日已签到 / 今日未签到,并附最近签到时间 |
| ⏱ 定时自动签到 | 宿主内建调度器:启动后 8 秒首跑,之后每 60 分钟一轮(CHECKIN_INTERVAL_MS),状态见抽屉「定时自动签到」行与 GET /health 的 checkinScheduler |
| 💰 积分额度 | 余额、套餐、今日已用、奖励明细(含到期日) |
| 🦞 免退出并行登录 | 「+ 免退出登录新账号」扫码加入(仍需 LobsterDaddy 控制台提供登录流程;控制台未运行时按钮会给出明确提示) |
| 🔁 一键操作 | 立即全部签到 / + 免退出登录新账号 / 刷新额度 / 同步网关到 DSH / 切号(签到、刷新额度为内置直调上游;登录新账号与同步网关仍走控制台) |
| ↔️ 自由调整大小 | 拖动抽屉左下角调整宽高,尺寸自动记忆 |
| 🔢 账号数徽标 | 球左上角显示当前账号库数量(读宿主 /local/status,不依赖任何外部进程) |
| 🌐 浏览器打开 / 网页看板 | 头部「浏览器打开」由宿主进程真正拉起系统浏览器,打开插件自建的看板页 /dsh-lobsterai-daddy/board(带签到/刷新额度/抓取/登录/切号按钮) |
| ⭐ Star 直达 | 头部与看板均有「★ Star」,一键打开 GitHub 仓库 |
| 🧩 完全自包含 | 账号/额度/签到/切号全部由插件宿主直接实现(读 SQLite + 直调官方接口),不需要 LobsterDaddy 控制台常驻 |
localStorage),重启 DSH 后原地出现。实现说明:渲染进程无法打开 SQLite,因此由宿主半边只读访问
%APPDATA%\LobsterAI\lobsterai.sqlite的kv表(auth_tokens/auth_user)并通过GET /dsh-lobsterai-daddy/current提供。
每个账号都会显示今天的状态,并且带最近一次签到的日期与时间:
| 状态 | 含义 |
|---|---|
已签到 + 09-28 16:21 | 今天签到成功,显示签到时刻 |
今日已签到 + 时间 | 今天早些时候已经签过(本次是重复调用,幂等) |
今日未签到(灰) | 今天还没有签到记录 |
| 失败文案(红) | 今天签到时出错,显示面板返回的原因 |
日期按面板的跨天判断给出,过零点自动归为「今日未签到」,不需要手动清理缓存。
每个账号卡片显示:
抽屉顶部提供 4 个操作按钮,另外每个账号行有一个「切换」按钮:
| 按钮 | 作用 |
|---|---|
| 立即全部签到 | 用账号库里每个账号的 token 逐个签到,直调 LobsterAI 上游活动接口(内置实现,不需要控制台,也不需要任何"预先同意"开关) |
| + 免退出登录新账号 | 打开无痕窗口扫码登录,登录后自动入库,账号数无上限;不动 LobsterAI App 当前登录状态。此功能仍需 LobsterDaddy 控制台提供登录流程;控制台未运行时会明确提示,而不是静默失败 |
| 刷新额度 | 重新拉取所有账号的余额/套餐/今日已用(内置实现,绕过缓存强制重拉) |
| 同步网关到 DSH | 把当前网关端口与 token 同步进 DSH 配置。仍需 LobsterDaddy 控制台;控制台未运行时按钮会给出提示(切号链路本身不依赖它) |
| 切换(每个账号行) | 把该账号凭据写回 LobsterAI 的 SQLite 并重启 App,切完立即可用 |
/local/capture 与 /current 读的是同一份数据)。旧缓存若还残留这些按钮,点击会看到「该按钮已移除」的提示而不会静默失败。/board)是独立页面,按钮集合与抽屉不同:立即全部签到 / 刷新额度 / 抓取当前登录账号 / 重新读取 / + 免退出登录新账号 / 每账号 切换 / ★ Star。注意看板上保留了「抓取当前登录账号」(它走内置 /local/capture,只是重读一次当前账号信息),抽屉里那个按钮则已按冗余理由删除。REFRESH_MS = 15000,定时器在 setOpen(true) 里 startRefresh() 建立)。setOpen(false) → stopRefresh() → clearInterval)。lib/client.js:1786 setInterval(probe, 30000),它每次拉一遍 /local/status?quota=0(只取 accountsCount)。这条与抽屉开关无关,从挂载起就一直跑。⟳ 按钮可随时手动刷新。ℹ️ 代码里还留着
BACKGROUND_REFRESH_MS = 60000(lib/client.js:265)与startRefresh()中「关闭态降频到 60 秒」的分支(:485-490),但那是遗留死代码:startRefresh()的唯一调用点在open === true分支(:455),而setOpen(false)会立刻stopRefresh()(:463),所以定时器回调执行时open恒为true,那个 else 分支永远不会进入。文档按真实可达路径描述,不按注释描述。
/dsh-lobsterai-daddy/board(不是 LobsterDaddy 控制台;window.open 在 Electron 沙箱里会被静默拦截,故改为宿主 spawn)。lib/index.js 唯一的 setInterval 是签到调度器(:528),grep 巡检|拉起|revive 在 lib/*.js 里只命中这条 UI 文案本身;②文案里的"每 60 秒"也不是恢复周期,实际重试节奏就是前面说的 15 秒(抽屉开)/ 30 秒(徽标探针)。于是状态行的判断是"还能不能拉到数据",与服务是否开着无关——内置数据层正常时,即便 LobsterDaddy 控制台根本没跑,状态行也不会出现这句话。⚠️ 为什么不用 iframe 嵌网页(v0.3.0 起):DSH 桌面端页面运行在
dsh-app://app协议下,该协议只给顶层框架发放x-dsh-desktop-renderer通行证,iframe 作为子框架永远拿不到 → 403 → 空文档;改用绝对http://127.0.0.1:port又被渲染进程 CSP 拦(实测Failed to fetch);DSH 还在main.js里主动禁用了webview。三条路都封死,所以账号面板改为在抽屉里用原生 DOM 绘制,数据由宿主内置路由(/local/*、/current)提供,仅剩余功能经同源代理fetch取(该通道实测可用)。
# 从 npm
dsh plugin --profile desktop add dsh-lobsterai-daddy
# 或从 GitHub
dsh plugin --profile desktop add github:loyalchiiina/dsh-lobsterai-daddy
装完重启 DSH 生效(客户端 bundle 由宿主启动时加载)。
签到、额度、切号、当前账号显示全部由插件宿主内置实现(直读 SQLite + 直调官方接口),不需要控制台常驻。
只有两个功能仍需控制台:「+ 免退出登录新账号」(需要控制台的扫码登录流程)和 「同步网关到 DSH」。需要时先跑:
node lobster-daddy.js panel --no-browser
(默认监听 127.0.0.1:17819,仅本机可访问;--no-browser 为后台常驻模式,不弹窗口、不开浏览器。)
DSH 界面
└─ 悬浮球(client.js,shadow DOM,position:fixed)
└─ 抽屉 → 原生 DOM 渲染的账号面板
└─ fetch(根相对路径,走客户端 transport)
├─ /dsh-lobsterai-daddy/local/* ← 宿主内置实现(读 SQLite + 直调官方接口)
└─ /dsh-lobsterai-daddy/panel/api/* ← 宿主端同源反向代理(仅登录新账号 / 同步网关等仍需控制台的功能)
└─ http://127.0.0.1:17819 ← LobsterDaddy 网页控制台(可选)
fetch 的 URL 必须保持根相对路径。渲染进程的 CSP 拒绝绝对 loopback 请求(实测 relative-fetch status=200 而 loopback-fetch FAILED)。曾把 URL 升级为 http://127.0.0.1:<port> 导致抽屉全空,客户端探针里有一条断言专门守这个。accept-encoding: identity。代理要往 HTML 里注入 shim 并重算长度,一旦面板返回压缩体而我们又重标了 content-length,浏览器会按 gzip 解压一段明文 → 白屏 / 乱码。拿不到 identity 时原样透传字节并保留原编码头,绝不重新标注。fetch('/api/...'),shim 会改写成 /panel/api/...;若代理只认 /panel/* 前缀而对其余路径回 404 JSON,控制台就会报 刷新失败:Unexpected token 'o', "not found" is not valid JSON。改动路由时必须保持这个 fallback 顺序:先内置子路径、最后才是转面板。插件只注册 1 条 prefix 路由 /dsh-lobsterai-daddy(kind: "prefix"),以下 14 条是 handler 内部的子路径分派;全部只允许本机回环地址访问,非回环一律 403。
| 路由 | 方法 | 用途 |
|---|---|---|
/local/status | GET | 内置数据源主力:直读 LobsterAI 的 SQLite,返回账号列表 + 额度。?quota=0 跳过额度、?force=1 绕缓存 |
/local/switch | POST | 内置切号:把指定账号凭据写回 LobsterAI 存储并重启 App |
/local/checkin | GET/POST | 内置签到:对所有账号跑一遍签到,?force=1 强制重签(handler 只校验回环,不限方法) |
/local/quota/refresh | GET | 内置额度刷新:强制重拉所有账号余额(绕过缓存) |
/local/capture | GET | 重读 SQLite 返回当前登录账号(内置版「抓取」,等价于刷新当前账号信息;抽屉已不再放这个按钮,看板仍在用) |
/current | GET | 当前登录账号:只读 kv 表 auth_tokens / auth_user,返回 {available, uid, name, reason} |
/status | GET | 宿主探活 + 面板健康(账号数量、面板端口) |
/health | GET | 插件健康:版本号、账号数、定时签到调度器状态(是否启用/间隔分钟/启动延迟/上次运行) |
/selfcheck | GET | 请求头体积自检:统计 dsh-auth-* Cookie 条数与请求头占 maxHeaderSize 比例,给出 danger/warn 判词与处置建议 |
/board | GET | 插件自建看板页(/open 打开的就是它),不依赖控制台 |
/open | GET | 由宿主进程拉起系统浏览器打开看板页(cmd start / open / xdg-open) |
/open-url | POST | 由宿主进程打开任意 http/https URL(body {url},非 http(s) 直接 400)——这是外链绕过 window.open 拦截的通用通道,看板的「★ Star」走它 |
/report | POST | 客户端诊断上报(写入 ~/.dsh/lobsterai-daddy-client.log) |
/panel/* 及其余所有未命中路径 | GET/HEAD/POST | 面板同源反向代理。/panel/x → /x,其余路径原样转发(控制台自身用绝对路径 fetch('/api/...'),shim 会改写成 /panel/api/...);非 GET/HEAD/POST 返回 405 |
为什么
/current由宿主实现:渲染进程打不开 SQLite。宿主只读打开 LobsterAI 的数据库并返回{available, uid, name, reason};任何失败都返回available:false而不抛错,绝不拖垮/status。注意
/status与/panel/api/status不是一回事:前者是宿主自己的探活(返回账号数量),后者是控制台的账号列表。同名不同源,历史上混淆过一次。
在 profile 的 patch 里可覆盖面板端口:
- insert:
- id: dsh-lobsterai-daddy
name: dsh-lobsterai-daddy
config:
panelPort: 17819
dsh-todo-float-ball 等)共存,各自独立定位与持久化position:static + pointer-events:none,规避 Electron 下 position:fixed 子元素偏移问题^22.19.0 || >=24.0.0(package.json 的 engines.node);/current、/local/* 依赖 node:sqlite(Node 22+ 内置),不可用时相关行自动降级为不显示现象:DSH 桌面端一切正常,但用浏览器访问本地地址时报错;换一个浏览器却可能正常。
根因(已实测确认,非本插件问题):DSH 自身的认证 Cookie 累积,撑爆了请求头上限。
DSH 的浏览器认证 Cookie 命名规则是:
authority = new URL("http://" + host).host // 含端口 → "127.0.0.1:56958"
cookieName = "dsh-auth-" + sha256(authority) // 端口变 → Cookie 名就变
Max-Age = 30 天, HttpOnly // 旧 Cookie 30 天内不会被清理
而 DSH 默认 port: 0 —— 每次重启都会换一个随机端口,于是:
重启一次 → 端口变 → authority 变 → 生成一个新 dsh-auth-* Cookie
(旧的仍在,30 天后才过期)
↓
多次重启后累积到几十条
↓
Node 的 HTTP 请求头默认上限 16 KB(16384 字节)
↓
超限 → 服务器返回 431 → 浏览器显示"访问遇到了问题"
实测数据(本机):
| 浏览器 | 请求头总长 | Cookie 部分 |
|---|---|---|
| 干净浏览器 | 929 字节 | 226 字节 |
| 累积后 | 16663 字节 | 16014 字节(71 条 dsh-auth-*) |
任何浏览器、任何用户,只要 DSH 重启足够多次(≈70 次以上)都会遇到,与浏览器品牌无关。
① 治标(立即可用):把 Node 请求头上限调大
[Environment]::SetEnvironmentVariable('NODE_OPTIONS','--max-http-header-size=131072','User')
# 然后重启 DSH 生效
验证:
$env:ELECTRON_RUN_AS_NODE='1'
& "$env:LOCALAPPDATA\Programs\DSH NEXT\DSH NEXT.exe" -e "console.log(require('http').maxHeaderSize)"
# 输出 131072 即生效
② 治本(推荐):固定 DSH 端口 —— 端口不再变,Cookie 名就不会变,自然不累积。
编辑 %USERPROFILE%\.dsh\desktop-preferences.json:
{
"port": 56958, // 原来是 0(0 = 每次随机)
"lanPort": 0
}
改完重启 DSH,之后端口固定,旧的 Cookie 到期后不再产生新的。
③ 清理已累积的 Cookie:
HttpOnly,JS 无法删除,只能从浏览器设置里清?token= 的地址访问一次以重新认证(DSH 启动时会自动打开该地址)访问插件自检路由(本机):
http://127.0.0.1:<DSH端口>/dsh-lobsterai-daddy/selfcheck
它会报告当前请求的头上限、是否可能超限,以及针对性的建议。
⚠️ 这不是本插件的缺陷:Cookie 由 DSH 的
dsh-client-connection写入。 本插件只是恰好也跑在同一个端口上,因此同样受影响。
127.0.0.1;所有插件路由同样只接受回环地址(/local/*、/current、/status、/health、/selfcheck、/board、/open、/open-url、/report、/panel/* 全部走 isLoopback() 校验),非本机请求一律 403/current 与 /local/* 会读取本机账号信息,因此同样受回环限制%APPDATA%\LobsterDaddy\(accounts\*.json、checkin-cache.json),当前账号名从 %APPDATA%\LobsterAI\lobsterai.sqlite 只读取得MIT