🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

B站刷分模型选择 ShingStars/dsh-bili-models-legacy

DeepSeek Harness
ShingStars14 天前有提交已提供中文文档扫描:含敏感能力

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
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 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.org
    bili/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.cn
    bili/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。
预览分享卡片长什么样 ↓ShingStars/dsh-bili-models-legacy
分享 · DeepSeek Harness Hub
ShingStars/dsh-bili-models-legacy

dsh-bili-scroll 的社区分支:每轮可选任意 DSH…

这是你的仓库?认领条目

回到顶部