dsh-lobsterai-daddy
loyalchiiina/dsh-lobsterai-daddy
LobsterDaddy 다중 계정 콘솔을 DSH 창 안의 플로팅 볼로 바꿉니다. 어디든 드래그할 수 있고 위치를 저장하며 패널이 볼을 따라가도록 설정할 수 있습니다. 클릭하면 loopback 전용 동일 출처 프록시에서 iframe 없이 네이티브 DOM으로 콘솔을 그리는 서랍이 열립니다. 작업 버튼, 현재 로그인된 LobsterAI 계정, 계정별 잔액·출석 상태·마지막 출석 시각을 보여줍니다. 크기 조절 가능한 영속 서랍, 실시간 온라인 상태 점, 계정 수 배지도 포함합니다.
설치
dsh plugin --profile web add github:loyalchiiina/dsh-lobsterai-daddyREADME
dsh-lobsterai-daddy · LobsterAIDaddy
功能描述:把 LobsterAI(有道龙虾)桥接进 DSH:免费签到积分直接接进 DSH 对话,不用再开另一个客户端就能用这些额度跑对话、工作流与技能包。
English: Bridges LobsterAI into DSH: its free daily check-in credits become usable inside DeepSeek Harness, so conversations, workflows and skill packs run on those credits without opening another client.
[!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 后原地出现。 - 永不越界:拖拽与窗口缩放都会被夹回可视区内,不会把球拖丢。
- 点击展开:单击球展开/收起抽屉;拖拽不会误触发展开(位移超过 3px 即判定为拖拽)。
- 状态一眼可见:抽屉状态行显示「LobsterAI:运行中 / 已关闭」+ 数据来源与账号数;球左上角徽标显示账号库数量。(悬浮球上已无状态圆点——原「守护进程在线」指示灯随控制台退场已删除,它恒为灰、只是视觉上的空洞。)
- 自由缩放:拖抽屉左下角调整宽高,尺寸独立持久化。
面板跟随悬浮球
- 跟随模式:拖动悬浮球时,已展开的面板按相同位移一起移动,相对位置保持不变——球和面板始终保持在你能看到的同一区域。
- 固定模式:面板钉在原地不动,只移动悬浮球。
- 一键切换:面板头部「● 跟随 / ○ 固定」按钮,选择被记住,下次打开保持上次的模式。
- 面板可独立拖动:拖面板标题栏(避开按钮)即可单独挪动面板。
- 位置独立记忆:面板坐标与悬浮球坐标分开存储,互不干扰;窗口缩放时自动夹回可见区。
当前登录账号
- 自动显示:抽屉里有一行蓝色横幅显示 LobsterAI 当前登录的账号昵称。
- 无需手动抓取:插件每次刷新都会重新读取 LobsterAI 自己的登录记录,所以切号后自动更新,不用点任何按钮。
- 未登录有提示:LobsterAI 未登录时显示「LobsterAI 未登录」。
- 安全降级:读取失败时该行自动隐藏,不影响账号列表等其它内容。
实现说明:渲染进程无法打开 SQLite,因此由宿主半边只读访问
%APPDATA%\LobsterAI\lobsterai.sqlite的kv表(auth_tokens/auth_user)并通过GET /dsh-lobsterai-daddy/current提供。
签到状态与最近签到时间
每个账号都会显示今天的状态,并且带最近一次签到的日期与时间:
| 状态 | 含义 |
|---|---|
已签到 + 09-28 16:21 | 今天签到成功,显示签到时刻 |
今日已签到 + 时间 | 今天早些时候已经签过(本次是重复调用,幂等) |
今日未签到(灰) | 今天还没有签到记录 |
| 失败文案(红) | 今天签到时出错,显示面板返回的原因 |
日期按面板的跨天判断给出,过零点自动归为「今日未签到」,不需要手动清理缓存。
账号与积分额度
每个账号卡片显示:
- 账号标识:昵称/手机号(脱敏)+ uid 短号
- 积分余额:当前余额(大字突出)
- 套餐信息:套餐名(如「免费」「会员」)与今日已用
- 奖励明细:最多 3 条奖励条目,含剩余量与到期日
- 更新时刻:余额缓存的刷新时间
- Token 有效期:到期日期,24 小时内到期会显示 ⚠ 提醒
一键操作
抽屉顶部提供 4 个操作按钮,另外每个账号行有一个「切换」按钮:
| 按钮 | 作用 |
|---|---|
| 立即全部签到 | 用账号库里每个账号的 token 逐个签到,直调 LobsterAI 上游活动接口(内置实现,不需要控制台,也不需要任何"预先同意"开关) |
| + 免退出登录新账号 | 打开无痕窗口扫码登录,登录后自动入库,账号数无上限;不动 LobsterAI App 当前登录状态。此功能仍需 LobsterDaddy 控制台提供登录流程;控制台未运行时会明确提示,而不是静默失败 |
| 刷新额度 | 重新拉取所有账号的余额/套餐/今日已用(内置实现,绕过缓存强制重拉) |
| 同步网关到 DSH | 把当前网关端口与 token 同步进 DSH 配置。仍需 LobsterDaddy 控制台;控制台未运行时按钮会给出提示(切号链路本身不依赖它) |
| 切换(每个账号行) | 把该账号凭据写回 LobsterAI 的 SQLite 并重启 App,切完立即可用 |
- 切换账号会关闭并重启 LobsterAI,因此保留二次确认。
- 操作进行中按钮自动置灰,完成后自动刷新列表。
- 登录按钮在面板忙或登录流程进行中被禁用。
- 已移除的按钮(v0.7.2 / v0.9.5):
复位登录流程、自动签到开关(同意)、守护进程开关、抓取当前登录账号——它们都是 LobsterDaddy 控制台时代的产物。其中「抓取当前登录账号」被删是因为它与「当前登录账号」自动显示完全冗余(/local/capture与/current读的是同一份数据)。旧缓存若还残留这些按钮,点击会看到「该按钮已移除」的提示而不会静默失败。 - 抽屉里点「浏览器打开」后的网页看板(
/board)是独立页面,按钮集合与抽屉不同:立即全部签到/刷新额度/抓取当前登录账号/重新读取/+ 免退出登录新账号/ 每账号切换/★ Star。注意看板上保留了「抓取当前登录账号」(它走内置/local/capture,只是重读一次当前账号信息),抽屉里那个按钮则已按冗余理由删除。
实时刷新
- 抽屉打开时每 15 秒自动刷新一次(
REFRESH_MS = 15000,定时器在setOpen(true)里startRefresh()建立)。 - 抽屉关闭时这条 15 秒轮询确实会停(
setOpen(false)→stopRefresh()→clearInterval)。 - 但**「不占用任何资源」是错的**:悬浮球上的账号数徽标由一个独立的、无条件的 30 秒定时器维护 ——
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)。 - 面板离线提示:连续 2 次拉取失败后,抽屉状态行会显示「面板没响应,正在自动恢复(每 60 秒巡检一次)」。
⚠️ 这句界面文案有两处不实,以代码为准:①没有任何外部看护进程或"掉线即静默拉起"逻辑——
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 由宿主启动时加载)。
前置:LobsterDaddy 面板(可选)
签到、额度、切号、当前账号显示全部由插件宿主内置实现(直读 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 时原样透传字节并保留原编码头,绝不重新标注。 - 未命中上面 14 条内置子路径的其余路径,全部转发给面板。控制台自身用绝对路径
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 桌面端 + 网页端均可用
- 与其它悬浮球插件(
dsh-todo-float-ball等)共存,各自独立定位与持久化 - 容器遵循
position:static + pointer-events:none,规避 Electron 下position:fixed子元素偏移问题 - 需要 Node.js
^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:
- 在浏览器设置里清除该站点的 Cookie(或全部 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/*会读取本机账号信息,因此同样受回环限制- 不采集、不上传任何数据;账号凭据与签到缓存由 LobsterDaddy 存在本机
%APPDATA%\LobsterDaddy\(accounts\*.json、checkin-cache.json),当前账号名从%APPDATA%\LobsterAI\lobsterai.sqlite只读取得 - ⚠️ 多账号刷积分可能违反 LobsterAI 服务条款,请只用于自己的账号,风险自负
License
MIT