Skip to content

dsh-bili-scroll

Verified

@jojoman2024/dsh-bili-scroll · v0.1.8 · MIT · Web UI

DSH 插件:每天替你刷一轮 B站 —— 读字幕挑出值得的、每条写一份笔记,值得的就 @ 你

Install

dsh plugin add @jojoman2024/dsh-bili-scroll

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Tags

Readme

dsh-bili-scroll | 刷B站 · 自维护版

这是 jojoman2024/dsh-bili-scroll 的自维护分支,基于上游 c1overzz/dsh-bili-scroll。 装了哪一个、有什么区别、怎么装 —— 见下面「跟上游的区别」与「装」两节。

先看三行

  • 需要 dsh ≥ 0.1.7-rc.1(本机是 0.2.0-rc.2)。⚠️ 版本不满足时,内核会静默跳过这个插件 —— 装了跟没装一样,不会报错。
  • 空间:不装「本地转写」约 84 MB;装了转写约 1 GB(其中 Whisper 模型 538 MB,可在设置里换更小的模型)。
  • 装完必须重启一次 dsh(插件在 bundle 层组装)。⚠️ host 半端改了就必须重启 —— 重载页面不算。

DSH 插件:每天替你刷一轮 B站 —— 它自己搜、读字幕原文判断、给每条值得看的写一份笔记,特别值得的会留一条评论 @ 你。 你收到的每一条 @,都是它先筛过一遍的。

跟上游的区别

上游是「搜 → 读字幕 → 写一份汇总日报 → 挑几条 @ 你」。 这一版把判重、产物、跑在哪儿三件事都改了,另外加了跨工作区读写与候选池。

🔀 这版和上游是「两个插件」,可以同时装(v0.1.6 起)。 家目录、19 个工具名、HTTP 接口、loader id 全都不同名 —— 之前不是这样:两边都用 bili-duty 这个家目录、11 个工具同名, 同时装会互相覆盖判重表,面板也可能读到对方的数据。

⚠️ 升级到 v0.1.6 时旧数据会自动迁移(含已装好的依赖,不用重装、不用重扫码), 但设置会回默认值(设置命名空间变了),需要重新配一遍。

📷 这版长这样(左边是它正在跑的那一轮,右边是插件面板):

总览:会话 + 面板

① ⭐ 前台跑(这版最大的改动)

上游只有一种跑法:起一个 headless 子进程(dsh --profile headless),跑完只留一份文件 —— 你看不见它,出了问题也很难查。

这版加了 跑在哪 开关:

值 行为
headless(默认) 老路:另起子进程,你看不见
front 在主应用里建一个真实会话 —— 能点进去看它搜、看它判断;会话留在列表里能回看
  • 两条路的提示词完全相同,只是送法不同;
  • 定时器也走这条路 ⇒ 自动跑的每一次都是可追溯的;
  • 会话 id 带 bili- 前缀;固定工作区(可自选,见下)。

② ⭐ 产物:每条一份「视频笔记」(前台 / 后台写同一个地方)

上游写 一份汇总日报 到插件家目录的 out/<日期>.md。

这版改成:

  • 挑中的每一条,各写一份独立 md(不再有汇总日报);
  • 路径:<插件家目录>\reports\<标题>-<YYMMDD>.md (标题在前、日期在后、日期用 YYMMDD 无横杠;非法字符自动换成 -,保留中文);
  • ⭐ 前台与后台写的是同一个目录 —— 这样在面板的「看产物」里永远看得到全部, 不会出现"换了个跑法,以前的笔记就看不见了" (前台用插件自己的 bilij_write 写过去:那一轮的 cwd 是工作区,沙箱不让它写家目录);
  • 内容是一篇笔记,不是推荐语:
    # <视频标题>
    > 一两句说清「这条在讲什么」
    - **UP** / **链接** / **播放量** / **时长**
    ## 讲了什么      ← 主体:把核心内容讲清楚
    ## 关键点        ← 3~6 条(方法 / 数字 / 结论 / 反直觉之处)
    ## 为什么值得看   ← 两三句(给谁看、能拿走什么)
    ## 我的一句话    ← 它的判断(按你的人设,可以尖刻)
    
    目标是:你没看视频,只读这份笔记就能把重点搞明白。 🔴 硬约束:只写视频里真有的 —— 字幕没讲的不许脑补,拿不准就写「视频里没细说」。

📷 面板里的「它的地盘」能列出全部产物,点一行直接看内容:

产物清单

③ ⭐ 判重:三层 + 前移到「搜索阶段」

上游只在发评论那一刻判重,而且只有「发过评论」一种记录。 后果:一条早已看过的视频还会被重新搜出来、重新读一遍字幕、白占候选预算,到发评论才被拦下。

这版把判重拆成三层,各自记进同一张表(seen.md 新增一列「怎么来的」):

层 什么信号 谁记
看过 读过字幕(调 bilij_subtitle) 插件自动
挑中 判定"值得看"(调 bilij_pick) 模型显式调
评论 真发出去了(有 rpid) 插件自动

⭐ 搜索阶段就把表里已有的剔掉(bilij_search 返回里带 skippedSeen)⇒ 看过的根本不进候选池、不占候选预算。

⚠️ 两个闸语义不同,别混:

  • 候选池闸:表里有任何记录就跳过(三种都算"占用过注意力");
  • 发评论闸:只有「真评论过」才算重复(看过/挑中不影响你发评论)。

④ 搜索与关键词

  • 面板可设 排序方式(综合 / 最新 / 播放量 / 弹幕)、日期过滤(默认不过滤)、看多少条;
  • 关键词交给模型自己组合:你填的是主题,它一轮里编 3~5 组具体搜索词去搜(不是把你的原话丢进去);
  • ⭐ 候选池 + 校验:插件自己记账,每次搜索后回 poolEnough,攒够才让开始筛 (上游没有这一步 —— 实测它会搜一两组就直接开始挑)。

📷 面板上的怎么找 / 怎么写(排序方式、每次看多少条、笔记写多细都在这里):

搜索与写作

⑤ 跨工作区读写(bilij_read / bilij_write)

前台会话的 cwd 是工作区,沙箱的可写根就是会话 cwd ⇒ 它写不了插件家目录、也读不到章程。 实测上游那轮为此开了个记事本靠 UIA 读窗口才读到章程,写日报则 cmd / powershell 全失败、一份都没写出来。

这版直接给工具(插件自己用 node:fs,不经沙箱):

  • bilij_read —— 读插件家目录(章程 / 人设 / 判重表 / 产物);
  • bilij_write —— 写(产物就用它),回执带写后真实字节数让你能自证;
  • 🔴 白名单:只允许插件家目录 + 你选的工作区两个根,越界一律拒绝。

⑥ ⭐ 自动回复评论(v0.1.4 真正做通了)

上游没有这个能力。这版加了「回复评论」开关(默认关)——开了之后, 它会去问 B站「谁回复了我」,然后挑着回。

🔴 它只回「回复插件自己那条评论」的人 —— 你人工发的评论被别人回复时,它不会去搭话。

  • ⭐ 这个筛选写死在代码里,不是"告诉模型别回":不符合条件的根本不会递给模型 (实测教训:只靠提示词拦,迟早会漏);
  • 回过的不会重复回(单独一个账本记着,键是"他新写那条的 id");
  • 回复内容每轮有硬上限(见下面「每轮最多几条」),每轮最多用 2 次工具调用;
  • ⚠️ 只有前台跑才有这个硬上限 —— 后台那轮用的是另一条工具通道,插件管不到(见文末说明)。

⑦ ⭐ 每轮额度是"硬上限"(v0.1.4)

「每轮最多发几条评论」和「每轮最多回几条」不只是建议 —— 超了 bilij_reply 会当场打回,回执里写清"已用几条 / 上限几条":

{ ok: false, blocked: true, quotaExceeded: true,
  kind: 'reply', used: 3, limit: 3,
  hint: '本轮回复额度已用完:…你已经回了 3 条。⇒ 这一条不再发(额度按"轮"算,下一轮重新开始)。' }
  • 两个额度分开算(跟面板上两个输入框一一对应),不共享总额;
  • 只有"真发成功"才扣额度(失败不扣,否则失败一次就白占一格);
  • 数字想填多少就多少(v0.1.3 曾悄悄限制在 1~10,现已去掉);
  • ⚠️ 拿不到"这一轮的标识"时会放行(宁可放行,也不要因为读不到而把功能锁死)。

⑧ ⭐ 「正在后台运行…」绿标(v0.1.4)

后台跑的时候,顶栏会出现一个绿标,跑完自己消失。点它 → 告诉你日志在哪 (<插件家目录>\duty.log —— 想知道它跑到哪一步了就看那个文件)。

  • ⭐ 判定不是"日志多久没动"那种猜法:那个子进程是插件自己起的 ⇒ 它的退出事件就是精确信号;跨 dsh 重启则用进程号探活兜底。

⑨ ⭐ 关注什么:可以就写一段话(v0.1.5,默认开启)

「关注什么」不再要求一行一个主题了 —— 直接写一段话就行,不用管分行:

最近在看大模型论文解读和 RAG 工程实践,特别是多智能体。
顺便关注一下「某人」这个 UP 主的更新。
入门教程那种就别给我了。

模型会自己读懂这是几件事、分别是什么,也会分清两类东西:

  • 主题 → 自己编更具体的搜索词,分批搜;
  • 账号 / UP 主 → 走 bilij_search_user 按昵称找到 uid,再用 bilij_user_videos 取他本人的投稿(⭐ 不会拿账号名去搜索视频 —— 那搜回来的是"别人聊到他")。 uid 会记进 <家>\accounts.md,同一个号下次直接查表,你也可以手工改那一行的 uid。

⚠️ 一段话还能写进"一行一个"表达不了的事:「不要入门教程那种」(筛选条件)、 「最近在搞 RAG」(背景)。想回到老写法:面板「实验功能」里把自由描述关注点关掉。

⑩ ⭐ 检查更新 / 一键升级都走国内镜像(v0.1.5)

  • 检查更新比的是 npm 上的版本号(registry.npmmirror.com,实测 55ms, 官方源要 1860ms);镜像不通会自动回退官方源。
  • 一键升级同样走镜像,失败再回退。
  • 有新版时,顶栏版本号后面会多一个黑底白字的「检测到有新版本」—— 点它弹窗,里面有「查看更新内容」(发版页面)和「直接升级」。

⑪ 其它

  • 人设从「工作区的 AGENTS.md」改成插件自己的文本框(存 persona.md,保存即生效)。 理由:AGENTS.md 是 DSH 的项目说明约定,语义 ≠ 使用者人格(实测会被喂成"安装助手")。
  • ⭐ 面板按类别分成四个标签页(v0.1.4 起三个,v0.1.5 加「实验功能」): 功能设置 / 提示词 / 环境与账号 / 实验功能 —— 样式跟会话上方「对话 / 轨迹」那一排一致。
  • ⭐ 「回复评论的细则」也能改(v0.1.4):正文存 reply.md,保存即生效、 一键恢复默认(恢复前弹确认)—— 跟人设同一套待遇。
  • ⭐ 开跑前会体检(v0.1.5):环境没装好 / 没登录就直接拒绝起跑并告诉你去哪点, 而不是"显示成功、其实哑跑"。
  • 面板从「设置」搬到右侧栏(设置面板在移动端几乎不可用,右侧栏能显示完整界面)。
  • 模型可自选(覆盖那一轮的默认模型)。
  • 会话工作区可自选,之后随时可改。
  • bilij_pick / bilij_candidates / bilij_replies / bilij_search_user / bilij_user_videos 几个新工具(共 19 个)。

📷 模型可自选 —— provider / 模型 / 思考档位,留空就用 profile 原本的默认:

模型选择

📷 提示词页 —— 人设与「回复评论的细则」都在这儿改,保存即生效:

提示词

没改的

  • 上游的峰谷定时器、扫码登录、本地转写、内置 MCP(bilibili-mcp)全部保留;
  • 评论仍然简洁(一两句、150 字内)—— 笔记变详细,但评论不变,两者定位不同: 笔记是给你细读的,评论只是叫你来看一眼。

装

从 npm(推荐 —— 连不上 GitHub 也能装)

dsh plugin --profile web add @jojoman2024/dsh-bili-scroll

⭐ 为什么推荐这条:npm 走注册表,国内有 registry.npmmirror.com 兜底; 而 github: 那条路要 git 直连 github.com:443 —— 实测很多网络下是连不上的。

也可以在 DSH 图形界面里装:设置 → 插件 → 安装,输入框填 @jojoman2024/dsh-bili-scroll (那个框叫「包名或地址」,也认 GitHub 地址与本地路径)。

从 GitHub

dsh plugin --profile web add github:jojoman2024/dsh-bili-scroll

本地 link(改代码时用)

git clone https://github.com/jojoman2024/dsh-bili-scroll.git
dsh plugin --profile web add link:<clone 出来的绝对路径>

⚠️ 装完必须重启一次 dsh(bundle 层要重启才组装)。 然后到 右侧栏 → 「开始」页 → 点「刷B站」那张卡。

⚠️ 别装错:npm 上的 dsh-bili-scroll(不带 scope)是上游那份,没有下面这些改动。 我们这一版的包名是带 scope 的 @jojoman2024/dsh-bili-scroll。


首次使用(两步)

  1. 装主依赖 —— 面板里点「装主依赖(建 venv)」:在插件自己的家目录建一个独立 venv,装 3 个包 (bilibili-api-python / mcp<2 / qrcode)。走国内镜像 + uv,通常几十秒(进度写 install.log,不卡页面)。
  2. 扫码登录 —— 点「扫码登录」,用手机 B站 扫页面上那张码。 ⚠️ 确认时选「记住我 / 长期」那张(选 24 小时的话,明天就得重扫)。 凭证只落在你本机的插件家目录:<DSH_HOME>/bili-scroll-jojo/bili_credential.json,不上传任何地方。

装之前不要求机器上已经有 Python:插件会自己下一份 uv 到家目录(免管理员、不用进 PATH, 直连 GitHub 不通就走国内加速代理,并核对官方 sha256)。


面板里有什么

(入口在右侧栏:展开右侧栏 → 在「开始」页点「刷B站」那张卡。它是个常驻 tab,切走再回来状态还在。)

面板分三个标签页(v0.1.4):功能设置 / 提示词 / 环境与账号。

项 说明
跑在哪 ⭐ 前台(主应用里建真会话,能看能追溯)/ 后台(另起子进程)。定时器也走这个
会话建在哪个目录 只在「前台」时出现。调 DSH 原生目录选择器;可改、可回默认(默认是插件家目录下的 front-sessions)
峰谷时段自动刷 总开关;打开之后才展开「中午谷时 12:00–14:00」「晚上/夜间谷时 18:00–09:00」两个子开关。依据 DeepSeek 官方定价:工作日 9:00–12:00、14:00–18:00 是高峰,其余(含整个周末)都是谷时
每天最多挑几条 数字自己填;填 0 = 不自动刷(但还能手动跑)
自动评论并 @ 你 默认关;打开后展开两栏:每轮最多发几条评论、要 @ 谁(B站 昵称) —— ⚠️ 留空就不发评论(评论的意义就是 @ 那一下)
回复评论(只回楼中楼) ⭐ v0.1.4 做通了:默认关。开了之后它去问 B站「谁回复了我」,只回"回复插件自己那条评论"的人 —— 你人工发的评论被回复时它不搭话。展开一栏「每轮最多回几条」
搜索怎么搜 排序方式 / 只看最近几天 / 每次看多少条
关注关键词 一行一个;留空用内置那几组。⭐ 填的是主题,模型会自己编具体搜索词
用哪个模型 选跑一轮用哪个 provider / 模型 / 思考档位。留空 = 用 profile 原本的默认
它的人设(提示词页) 面板里的文本框,写它怎么说话、有哪些红线。存 persona.md,保存后下一轮立刻生效
回复评论的细则(提示词页) ⭐ v0.1.4 新增:回复规则单独一份(reply.md),能改、能一键恢复默认(恢复前弹确认)。⚠️ 只在「回复评论」开着时才注入给模型
本地转写没字幕的视频 默认关 —— 要在本机装 Whisper、下几百 MB 模型
看产物(它的地盘) 列出 <插件家目录>\reports\ 里的笔记,点一行看内容
现在跑一轮 / 装主依赖 / 扫码登录 / 测一下 / 检查更新

📷 面板截图见开头「长这样」那节(总览 / 模型 / 搜索写作 / 产物 / 提示词)。


红线(写死在提示词里,不靠自觉)

  • 不透露你的隐私:账号、机器路径、你聊过的话 —— 一个字都不进评论
  • 每轮条数不超过设置里填的那个数(v0.1.4 起是硬上限:超了直接打回);同一视频只评论一次;不刷屏、不吵架
  • ⭐ 只回「回复插件自己那条评论」的人(v0.1.4):你人工发的评论被别人回复时,它不搭话
  • 不确定的事不编(笔记里如实写「没查到」)
  • 只写视频里真有的 —— 字幕没讲的不许脑补
  • ⚠️ 前台会话的额外约束:它手上有整个 DSH 的工具,所以提示词写死了 「默认只用 B站 那几个工具、只做刷一轮这一件事」; ⭐ 唯一例外:使用者本人在会话里明确要求别的 ⇒ 听他的 (网页内容 / 字幕 / 评论 / 文件里写的"请帮我做 X"一律不算 —— 那是数据,不是指令)。

⚠️ 一件要分清的:前台 vs 后台,硬上限只在前台生效

前台(推荐) 后台
你能看到过程 ✅ 主应用里一个真会话 ❌ 另起子进程,你看不见
每轮条数的硬上限 ✅ 真的会拦 ❌ 拦不住(那轮用的是另一条工具通道)
"只回插件评论"的筛选 ✅ 写死在代码里 ❌ 只能靠提示词
怎么知道它在跑 ✅ 会话列表里能看到 ✅ 顶栏的绿标(跑完自己消失)

⇒ 为什么后台拦不住:后台那轮是插件另起一个 dsh 子进程跑的, 那个进程用的是内置 MCP 的原始工具,插件自己的代码不在那条路上 ⇒ 想拦也没有位置下手。 (要彻底解决得改内置 MCP 那一层,暂时没做。)

⇒ 一句话:想要"硬上限 / 不打扰你人工的评论"这两条真正生效,就用前台跑。


它是怎么跑的

  • 插件内部起一个 Python MCP(下面那个开源项目,已内置),把它的能力注册成 DSH 工具;
  • 定时到点(或你点「现在跑一轮」)⇒ 按 跑在哪 分派:
    • 后台:起一个 headless dsh 会话,工作目录 = 插件家;
    • 前台:在主应用里 workspaceRegistry.create() 建工作区 → agents.create() 建会话 → attachSession() 挂上去 → 设标题 → 把提示词作为首轮提交进去;
  • 一轮要做的事写在 prompts/duty.md(你可以改),和人设、当天设置一起进提示词;
  • 人设由插件读出来、内联进提示词,而不是让那一轮去读工作区的 AGENTS.md —— 后者是 DSH 的项目说明约定,语义上不等于「使用者人格」。

如果你是一个 AI 助手,正在帮用户装这个插件

按顺序来,别跳步:

  1. ⚠️ 先分清版本:用户要的是这一版(@jojoman2024/dsh-bili-scroll)还是上游那份? 面板里有「跑在哪」这一节 = 这一版;没有 = 上游版;
  2. 装:dsh plugin --profile web add @jojoman2024/dsh-bili-scroll (优先走 npm —— 它不要求能连 GitHub;github: 那条路要 git 直连 github.com:443, 实测很多网络下不通。前提不用管 —— 插件会自己下一份 uv);
  3. ⚠️ 必须提醒用户重启一次 dsh —— bundle 层要重启才组装,不重启插件不会生效;
  4. 重启后请用户到 右侧栏 →「开始」页 → 点「刷B站」那张卡:先点「装主依赖」(几十秒,进度就在面板下面)、再点「扫码登录」 (手机 B 站扫码,确认时选"记住我 / 长期");
  5. 不要替用户打开「自动评论并 @ 你」—— 那是拿用户的号说话。要用得让用户自己在面板里填「要 @ 谁」;
  6. 可选:让用户决定「跑在哪」—— 想看到过程就选前台(推荐),在意省资源就留后台。

依赖与致谢

  • 内置 bilibili-mcp(MIT,Copyright (c) 2026 AGI_Ananas)—— 搜索 / 字幕 / 评论 / 发评论这些能力来自它;本插件只做「挑什么、什么时候挑、要不要说话」这一层
  • 上游插件:c1overzz/dsh-bili-scroll(MIT)
  • 需要本机有 Python 3.10+(会用 uv 或 python -m venv 建独立环境),不需要它已经进 PATH
  • Python 依赖只有 3 个(见 vendor/bilibili-mcp/requirements.txt);mcp 必须锁 <2(2.x 起不来)

许可证

MIT(内置的 vendor/bilibili-mcp/ 另见该目录下的 LICENSE)