dsh-bili-scroll 的社区分支:每轮可选任意 DSH…
35/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/21 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ShingStars/dsh-bili-models-legacy该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · platform
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 14 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-bili-models(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 02:53:17
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 132 处,展示前 81 条)
- 读取本地文件bili/index.js:150
try { myVer = String(JSON.parse(readFileSync(join(pluginDir, '..', 'package.json'), 'utf8')).version || '') } catch { myVer = '' } - 读取本地文件bili/index.js:172
if (existsSync(win)) return win - 读取本地文件bili/index.js:175
for (const d of readdirSync(lib)) { - 读取本地文件bili/index.js:178
if (existsSync(p)) return p - 读取本地文件bili/index.js:184
try { return readdirSync(sitePkgs(venvRoot)).some((n) => n.startsWith(prefix)) } catch { return false } - 读取本地文件bili/index.js:191
const venvReadyNow = () => existsSync(venvPython()) && missingVenvDeps().length === 0 - 写入本地文件bili/index.js:209
writeFileSync(overrideFile, JSON.stringify(cur, null, 2), 'utf8') - 写入本地文件bili/index.js:214
mkdirSync(outDir, { recursive: true }) - 写入本地文件bili/index.js:218
try { appendFileSync(logFile, line + '\n', 'utf8') } catch { } - 写入本地文件bili/index.js:1277
try { writeFileSync(file, yml.join('\n'), 'utf8'); return file } catch (e) { log(`写 overlay 失败:${e?.message ?? e}`); return null } - 写入本地文件bili/index.js:1320
writeFileSync(f, [ - 执行外部命令来自配置/变量bili/index.js:1358
const child = spawn(dsh.command, args, { - 写入本地文件bili/index.js:1385
try { appendFileSync(logFile, toText(buf), 'utf8') } catch { } - 执行外部命令固定命令bili/index.js:1790
const c = spawn('uv', ['--version'], { windowsHide: true, stdio: 'ignore' }) - 执行外部命令来自配置/变量bili/index.js:1804
const c = spawn(cmd, ['--version'], { windowsHide: true, stdio: 'ignore' }) - 执行外部命令来自配置/变量bili/index.js:1813
try { c = spawn(cmd, args, { cwd: stateDir, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'], env: uvEnv() }) } - 删除本地文件bili/index.js:1866
try { rmSync(bak, { force: true }) } catch { } - 执行外部命令来自配置/变量bili/index.js:1889
c = spawn(cmd, args, { cwd: stateDir, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'], - 执行外部命令来自配置/变量bili/index.js:2229
try { child = spawn(cmd, args, { detached: true, stdio: 'ignore' }) } catch (e) { resolve(String(e?.message ?? e)); return } - 请求外部主机registry.npmjs.orgbili/index.js:2251
const r = await fetch('https://registry.npmjs.org/dsh-bili-scroll/latest', { signal: ctrl.signal }) - 发起网络请求bili/index.js:2251
const r = await fetch('https://registry.npmjs.org/dsh-bili-scroll/latest', { signal: ctrl.signal }) - 发起网络请求bili/client.js:42
const jget = async (p) => asJson(await fetch(API + p, { credentials: 'same-origin' })) - 发起网络请求bili/client.js:43
const jpost = async (p, body) => asJson(await fetch(API + p, { - 写入剪贴板bili/client.js:393
await navigator.clipboard.writeText(v) - 读取本地文件bili/lib/hostdeps.mjs:40
for (const n of readdirSync(join(npm, '@deepseek-ai'))) { - 读取本地文件bili/lib/hostdeps.mjs:53
for (const p of readdirSync(join(dshHome, 'profiles'))) { - 读取本地文件bili/lib/hostdeps.mjs:68
if (!existsSync(pkgFile)) return null - 读取本地文件bili/lib/hostdeps.mjs:69
const pkg = JSON.parse(readFileSync(pkgFile, 'utf8')) - 读取本地文件bili/lib/hostdeps.mjs:76
return existsSync(file) ? pathToFileURL(file).href : null - 读取本地文件bili/lib/mcp.mjs:16
const PKG = (() => { try { return JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) } catch { return {} } })() - 执行外部命令来自配置/变量bili/lib/mcp.mjs:36
this.proc = spawn(command, args, { - 读取本地文件bili/lib/verify.mjs:44
if (!existsSync(f)) return null - 读取本地文件bili/lib/verify.mjs:46
const c = JSON.parse(readFileSync(f, 'utf8')) - 发起网络请求bili/lib/verify.mjs:62
const r = await fetch(url, { headers }) - 读取本地文件bili/lib/verify.mjs:120
if (!existsSync(seenFile)) return { checked: [], skipped: 0, text: '⚠️ 判重表还没生成,没什么可复核的' } - 读取本地文件bili/lib/verify.mjs:124
const rows = parseSeen(readFileSync(seenFile, 'utf8')) - 读取本地文件bili/lib/verify.mjs:130
try { state = JSON.parse(readFileSync(stateFile, 'utf8')) } catch { } - 写入本地文件bili/lib/verify.mjs:152
try { writeFileSync(stateFile, JSON.stringify(state, null, 2), 'utf8') } catch { } - 读取本地文件bili/lib/verify.mjs:168
if (!existsSync(f)) return null - 写入本地文件bili/lib/verify.mjs:169
writeFileSync(f, readFileSync(f, 'utf8').replace(/ *$/, '') + '\n' + text + '\n', 'utf8') - 写入本地文件bili/lib/state.mjs:50
mkdirSync(dir, { recursive: true }) - 读取本地文件bili/lib/state.mjs:55
try { return JSON.parse(readFileSync(file, 'utf8')) } catch { return fallback } - 写入本地文件bili/lib/state.mjs:59
writeFileSync(file, JSON.stringify(value, null, 2), 'utf8') - 读取本地文件bili/lib/state.mjs:70
if (!existsSync(from)) { log(`缺文件:${from}`); continue } - 读取本地文件bili/lib/state.mjs:71
if (!overwrite && existsSync(to)) continue - 读取本地文件bili/lib/state.mjs:72
if (overwrite && existsSync(to) && readFileSync(from, 'utf8') === readFileSync(to, 'utf8')) continue - 读取本地文件bili/lib/state.mjs:72
if (overwrite && existsSync(to) && readFileSync(from, 'utf8') === readFileSync(to, 'utf8')) continue - 写入本地文件bili/lib/state.mjs:73
copyFileSync(from, to) - 读取本地文件bili/lib/state.mjs:85
try { if (existsSync(home)) return home } catch { } - 写入本地文件bili/lib/state.mjs:113
writeFileSync(home, newText, 'utf8'); writeFileSync(ledger, hShip, 'utf8') - 写入本地文件bili/lib/state.mjs:119
if (hLast !== hShip) writeFileSync(ledger, hShip, 'utf8') - 写入本地文件bili/lib/state.mjs:124
writeFileSync(fresh, newText, 'utf8') - 发起网络请求bili/lib/login.mjs:45
const r = await fetch(SPI, { headers: { 'User-Agent': UA } }) - 发起网络请求bili/lib/login.mjs:54
const r = await fetch(GEN, { headers: { 'User-Agent': UA } }) - 发起网络请求bili/lib/login.mjs:63
const res = await fetch(pollUrl(key), { headers: { 'User-Agent': UA }, redirect: 'manual' }) - 写入本地文件bili/lib/login.mjs:79
mkdirSync(stateDir, { recursive: true }) - 写入本地文件bili/lib/login.mjs:81
writeFileSync(file, JSON.stringify({ - 执行外部命令来自配置/变量bili/lib/login.mjs:97
child = spawn(pythonPath || 'python', ['-c', code, url, png], { cwd: stateDir, windowsHide: true }) - 读取本地文件bili/lib/login.mjs:99
const done = () => { try { resolve(existsSync(png) ? png : null) } catch { resolve(null) } } - 读取本地文件bili/lib/uvfetch.mjs:33
return createHash('sha256').update(readFileSync(file)).digest('hex') - 发起网络请求bili/lib/uvfetch.mjs:45
const r = await fetch(source.url + '.sha256') - 读取本地文件bili/lib/uvfetch.mjs:55
try { entries = readdirSync(dir, { withFileTypes: true }) } catch { return null } - 执行外部命令来自配置/变量bili/lib/uvfetch.mjs:69
const r = spawnSync(cmd, args, { stdio: 'ignore' }) - 读取本地文件bili/lib/uvfetch.mjs:83
if (existsSync(target)) return target - 写入本地文件bili/lib/uvfetch.mjs:85
mkdirSync(dir, { recursive: true }) - 删除本地文件递归bili/lib/uvfetch.mjs:87
rmSync(tmp, { recursive: true, force: true }) - 写入本地文件bili/lib/uvfetch.mjs:88
mkdirSync(tmp, { recursive: true }) - 请求外部主机pypi.tuna.tsinghua.edu.cnbili/lib/uvfetch.mjs:100
const r = await fetch('https://pypi.tuna.tsinghua.edu.cn/pypi/uv/json') - 发起网络请求bili/lib/uvfetch.mjs:100
const r = await fetch('https://pypi.tuna.tsinghua.edu.cn/pypi/uv/json') - 发起网络请求bili/lib/uvfetch.mjs:124
const res = await fetch(s.url) - 写入本地文件bili/lib/uvfetch.mjs:126
await pipeline(Readable.fromWeb(res.body), createWriteStream(s.file)) - 读取本地文件bili/lib/uvfetch.mjs:127
const mb = (statSync(s.file).size / 1048576).toFixed(1) - 写入本地文件bili/lib/uvfetch.mjs:144
copyFileSync(hit, target) - 写入本地文件bili/lib/uvfetch.mjs:145
try { chmodSync(target, 0o755) } catch { } - 执行外部命令来自配置/变量bili/lib/uvfetch.mjs:147
const r = spawnSync(target, ['--version'], { stdio: 'ignore' }) - 删除本地文件递归bili/lib/uvfetch.mjs:150
rmSync(tmp, { recursive: true, force: true }) - 删除本地文件递归bili/lib/uvfetch.mjs:158
rmSync(tmp, { recursive: true, force: true }) - 删除本地文件递归bili/selfcheck.mjs:45
try { rmSync(SANDBOX_HOME, { recursive: true, force: true }) } catch { } - 写入本地文件bili/selfcheck.mjs:46
mkdirSync(SANDBOX_HOME, { recursive: true }) - 读取本地文件bili/selfcheck.mjs:58
const pkg = JSON.parse(readFileSync('./package.json', 'utf8')) - 删除本地文件递归bili/selfcheck.mjs:118
try { rmSync(SANDBOX_HOME, { recursive: true, force: true }) } catch { }
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:registry.npmjs.org、pypi.tuna.tsinghua.edu.cn
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-tools给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
dsh-bili-scroll + 每次运行可选的模型选择器:可选 DSH 里注册的任意模型,包括其他插件提供的免费模型(比如 Our Free Model)
README
由 DeepSeek 最新模型翻译生成dsh-bili-models
dsh-bili-scroll 的社区分支(fork):保留原版「每天替你刷一轮 B 站」的全部能力,在此之上加了每一轮的模型选择、宿主内固定会话运行、多人私信/@、特别关注 UP 主通知,并重做了设置页。
原版 dsh-bili-scroll(by c1overzz,MIT)每日自动刷 B 站:搜索关键词 → 读字幕挑出值得看的 → 写一份日报 → 值得的 @ 你 / 私信你。本仓库基于上游 0.1.11 演化而来,家目录(~/.dsh/bili-duty/)与上游完全兼容,可以从原版直接迁移,旧配置、判重表、日报、扫码登录的凭证都能沿用。
与原版 dsh-bili-scroll 的区别
| # | 能力 | 原版 dsh-bili-scroll | 本分支 dsh-bili-models |
| 1 | 每一轮用什么模型 | 另起 dsh --profile headless 子进程,用 profile 里写死的默认模型;没配 API key 整轮失败 | 设置页可任选 当前 DSH 里真实注册的模型(含其它插件提供的免费模型,如 Our Free Model);GET /api/bili-duty/models 实时列清单 |
展开完整文档(README 剩余 1 节)
dsh-bili-models dsh-bili-scroll 的社区分支(fork):保留原版「每天替你刷一轮 B 站」的全部能力,在此之上加了每一轮的模型选择、宿主内固定会话运行、多人私信/@、特别关注 UP 主通知,并重做了设置页。 原版 dsh-bili-scroll(by c1overzz,MIT)每日自动刷 B 站:搜索关键词 → 读字幕挑出值得看的 → 写一份日报 → 值得的 @ 你 / 私信你。本仓库基于上游 0.1.11 演化而来,家目录(~/.dsh/bili-duty/)与上游完全兼容,可以从原版直接迁移,旧配置、判重表、日报、扫码登录的凭证都能沿用。 与原版 dsh-bili-scroll 的区别 | # | 能力 | 原版 dsh-bili-scroll | 本分支 dsh-bili-models | | 1 | 每一轮用什么模型 | 另起 dsh --profile headless 子进程,用 profile 里写死的默认模型;没配 API key 整轮失败 | 设置页可任选 当前 DSH 里真实注册的模型(含其它插件提供的免费模型,如 Our Free Model);GET /api/bili-duty/models 实时列清单 | | 2 | 跑一轮的方式 | 每次新起一个子进程 = 新开会话 | 默认 宿主内固定会话(ctx.agents,同一条会话上的新一轮对话),不起子进程、不再新开会话;runMode: headless 可切回原版方式 | | 3 | 上下文洞察冲突 | 子进程会话不在宿主 sessions 表里,打开「上下文洞察」面板会被当冷会话回写投影,正在跑的那一轮被中断 | 宿主内会话对宿主是活的,冲突从机制上消失 | | 4 | 私信 / @ 的人数 | 各限一人(dmUid / mentionName) | 多人:dmUids / mentionNames 逗号分隔,最多各 20 人,每个收件人各发一条 | | 5 | 特别关注 UP 主 | 无 | watchUids 关注最多 50 个 UP,有新视频时私信 / @ 通知(watchNotify),可设检查间隔,设置页可「立刻检查一遍」 | | 6 | 崩溃 bug | loadCfg() 引用未声明变量(hostDiff / lastDiffSig),宿主里配过设置就 ReferenceError,host 半边起不来 | 已修(v1.0.1 起) | | 7 | MCP 工具白名单 | 缺 bili_send_message / bili_received_replies,私信与评论复核在子进程里看不到工具 | 已补齐 | | 8 | v4 会话格式 | — | 宿主内投喂的消息 source.kind 用自有 producer('bili-duty'),过 v4 会话持久化校验(v2.2.0 修) | | 9 | 设置页 UI | 一整页平铺的开关 | 胶囊分页(概览 / 定时 / 发言 / 关注 / 模型 / 环境),hero 卡 + 配额进度条,配色走 DSH 设计变量,深浅色跟随宿主 | 装 git clone https://github.com/ShingStars/dsh-bili-models.git dsh plugin add file:C:/path/to/dsh-bili-models 装完重启 DSH,在「设置 → 刷B站」里能看到新 UI。 ⭐ 别和原版 dsh-bili-scroll 同装:两个插件用同一个家目录,同时启用会互相干扰。从原版迁移请先卸载原版。 用 模型选择(「模型」页) | 项 | 说明 | | provider(哪家) | 当前 DSH 真实注册的 provider。留空 = 跟随 DSH 默认 | | model | 跟着 provider 联动,列它下面能用的模型 | | 推理强度 | 可不填;填了就写进那一轮 | | 提供方插件(bridgePlugins) | 逗号分隔的包名,默认 dsh-our-free-model | 选好之后会显示「这一轮会用:provider / model · effort」。 和 Our Free Model 一起用:先装 dsh-our-free-model(本插件不内嵌它),provider 选 our-free-model 再挑免费模型即可。headless 模式下本插件会在 overlay 里用 file:// 精确指向它的 index.js 把它挂进子进程;没装也不报错,自动跳过。 宿主内运行(「定时」页) runMode: in-host(默认)时,跑一轮 = 在 DSH 宿主里用 ctx.agents 驱动同一条固定会话: - sessionId 留空自动生成并记住(存在家目录 state.json),想换新会话就清掉它; - 每一轮是这条会话里的新一轮对话,历史上下文连续、不再新开子进程; - 权限档位可选(read-only / workspace-write / danger-full-access),无人值守审批自动钉成 never; - 也可切回 headless(原版方式:dsh --profile headless --patch <overlay> "<prompt>"),GET /api/bili-duty/overlay 可看当前生成的 overlay。 私信 / @ 多人(「发言」页) - mentionNames(评论区 @ 谁)与 dmUids(私信发给谁):逗号 / 分号 / 空格分隔均可,最多各 20 人; - 兼容原版单数字段:留多人字段为空时沿用 mentionName / dmUid; - 私信正文仍受 B 站 500 字符限制(code 21007),每个收件人各发一条。 特别关注 UP 主(「关注」页) - watchUids:最多 50 个 UP 主 UID; - watchNotify:off / dm(私信通知)/ comment(评论区 @)/ both; - watchEveryMin:检查间隔(分钟,默认 15;后台定时器自动节流); - 首次见某个 UP 只建基线不补发,之后有新发布才通知(每 UP 每轮最多 3 条,按时间升序); - 设置页可看「已在盯」列表(UP 名 + 上次见到的视频)并「立刻检查一遍」(工具 bili_watch_check 同理)。 数据 家目录 ~/.dsh/bili-duty/(与上游一致): config.json 设置 state.json 运行状态(含 dutySessionId / 特别关注基线在 watch-state.json) duty.md 给那一轮的简报 seen.md 判重表 out/YYYY-MM-DD.md 日报 duty.log 运行日志 .venv/ 主依赖(设置页里「装主依赖」会建) bili_credential.json 扫码登录后的 Cookie headless-overlay.yml headless 模式每轮前重写 已知限制 - B 站账号等级:新号发不出公开评论(-107 账号未转正)、私信可能 21016 等级不够。不是插件的问题,报告里会如实记录。 - 模型调不通:/api/bili-duty/models 能看到某个 provider,不代表它的账号可用;失败时看 duty.log。 - 桥接解析(headless 模式):桥接用的是本插件所在的那棵 node_modules,「提供方插件」要装在同一份 DSH 里。 - 本插件不提供自更新,更新请 git pull 后重装。 - 插件市场开关:不要在第三方插件市场页里切换本插件的开关 —— 它的启用状态走 profile 配置(cordis.patch.yml + dsh.profile.bundles),市场页的切换会和它打架(已知会误关)。 开发 node --check bili/index.js node --check bili/client.js node bili/selfcheck.mjs # 在插件目录里跑 node tools/client-smoke.mjs # 假 loader + 假 React,跑一遍 client 历史与致谢 - 本仓库是 c1overzz/dsh-bili-scroll(MIT, © 2026 c1overzz)的 fork,bili/ 下绝大部分代码来自上游,详见 NOTICE.md。 - v1.x 时代曾以 dsh-bili-free-scroll 的名字做过「两个插件合并成一个包」的方案,已废弃;其历史保留在本仓库 git 历史中(tag v1.0.0 / v1.0.1),旧仓库 ShingStars/dsh-bili-free-scroll 已归档,仅作历史参考。 许可 MIT。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
ShingStars/dsh-bili-models-legacy
dsh-bili-scroll 的社区分支:每轮可选任意 DSH…
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,792已汉化Cordis
71.4
失败经验库Ikalus1988/MisakaNet
📚 零依赖、由 git 支撑的微课程库,让 AI 智能体异步分享并检索经过验证的调试经验。| https://misakanet.org
★ 550已汉化DSH
71.2
桌面智能体工作区freestylefly/wesight
WeSight 是开源桌面控制台,面向本地 AI 智能体。它帮你安装或复用 Claude…
★ 933已汉化MCP
71
IM 机器人接入xmanrui/dsh-im
让 DeepSeek Harness 触手可及 Connecting DeepSeek Harness
★ 3,110已汉化DeepSeek 客户端
70.9
中国平台研究引擎Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30…
★ 2,031已汉化DSH
70.7
这是你的仓库?认领条目