dsh-bili-jar
鲸鱼娘带着一个罐子,守在右下角。按照你的兴趣,她会去 B 站探险,按赞币藏率排,给你找一些符合口味的电子榨菜。哪个词搜得少,她换条路再找。回来把五条装进罐子里,然后和你说说这些视频讲了什么。时政这类她只留最近两周,游戏攻略和音乐不限时间,每根轴她自己定。
安装
dsh plugin --profile web add dsh-bili-jar
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
电子榨菜罐 · dsh-bili-jar
鲸鱼娘带着一个罐子,守在右下角。按照你的兴趣,她会去 B 站探险,按赞币藏率排,
给你找一些符合口味的电子榨菜。
她平时睡着。点一下罐子,她就出门找,回来把五条装进罐子,再和你说说这些视频讲了什么。
<img src="docs/trip.gif" width="120" alt="出门找 → 满载而归">
<img src="docs/panel.png" width="720" alt="面板">
<sub>面板图是用插件自己那套 CSS 渲染的,不是屏摄 —— 真机上长得一样,只是多了窗口背景。</sub>
先看四行:
- 需要 dsh ≥ 0.1.7;装完要重启一次(插件在 bundle 层组装)。
- 需要 你自己的 DeepSeek API Key。一轮「换一批」大约
¥0.004–0.01。 - 时政这类只留最近两周,游戏攻略和音乐不限时间 —— 每根轴她自己定。
- 第一次装要等一轮(二三十秒),之后每次点开都是秒开 —— 上一批一直在磁盘上。
它干什么
- 按你填的兴趣轴(
deepseek/时政/历史/ 随便什么)去搜 B 站 - 按互动率(赞、币、藏、弹幕除以播放)排好坏,而不是播放量
- 结果并进一个池子,跨天累积;今天没搜到的好东西,明天被别的词带出来还在
- 最后把前 24 条交给模型,让它挑 5 条,每条写一句理由
- 理由只说内容:讲了什么、怎么讲的、适合什么时候看。数据用来挑,不写进理由
- 点开卡片能小窗播放;不感兴趣的可以 👍/👎(攒够 20 条开始影响打分)
- 打开就有东西:上一批存在磁盘上,面板一开先给你看,重建在后台做。换好了只在顶部弹一行「新的一批装好了」,点了才换 —— 不会把你正在读的卡片抽走
- 认熟人:从你点过的赞、加的稍后看、点开过的视频里认人。1 次互动算观察,3 次转正;转正之后他发的新片会被优先拿来试,不等互动数据攒够
- 熟人最多占 5 条里的 2 条,剩下的必须走发现路径 —— 不然越用越窄,变成只看那几个人
- 点击标题、「打开」或「小窗」即记为已观看,从推荐、关注和待看中移除,小红点同步减少(只统计推荐列表)。「历史」页保留最近 10 条,重复观看移到最前,重启后仍保留;历史超过 10 条时移除最早记录,当前片单仍不会补回已看视频。
模型没配或调用失败时退回纯规则挑片:每根轴先挑一条相似度 ≥0.85 的,同轴最多 2 条、同 UP 最多 1 条。片单不会因为没模型就空着。
一轮都经过什么
搜 每根轴 3 个词(第 3 个按小时轮换):前两个走综合排序保相关,第 3 个走「最新发布」保新鲜 熟人 你赞过 / 点开过 / 加过稍后看的 UP(最多 6 个)直接拉最新投稿,3 天内的进候选并加权 补货 某根轴凑不够 3 条时,换两条通道再找:按时长带重搜(news 轴走最新、常青轴走综合)+ 从种子扩散(相关推荐,30 天内的新种子优先) 并池 和上一轮的池子合并,同一个 BV 只更新数据;池子上限 400,一直没再露面的先淘汰 筛 时长、播放门槛、充电专属、直播回放、日期窗口、贴不上任何轴 —— 全砍 打分 两套权重各自合计 1.00:news 轴的时效占 0.10,evergreen 轴只占 0.02(差额给了播放 +0.03 和小众 tag +0.05);其余一样:赞/币/藏的率 0.39 + 贴轴 0.30 + 字幕 0.06 + 多轴 0.04 扣分 进过 main 的条目每轮 -0.03(封顶 0.15),把位置让给没见过的 打乱 前 5 名固定,其余按分数加权抽签(设置里「多样性」0–1);种子记进 stats,能重放 补查 前 12 名回查真实投币数(搜索接口给的是旧的),重新打分 补漏 新条目缺互动数据时每轮补查 8 条(播放涨得快的优先),回查前按冷启动给 0.01–0.05 的临时加分;补过的数据 7 天后过期,每轮再刷 3 条 配额 main 里至少一条「3 天内 + 播放达标 + 贴轴 + 非标题党」,没有就从合格候选里换一条进来(只换轴上还有队友的最低分) 回音室 熟人来源最多 2 条 —— 规则挑完收一次,模型策展完再收一次 策展 只把前 24 名交给模型(每条带上「发布几天前」和数据是否已回查),让它挑 5 条、写理由
为什么只给模型 24 条:给整个池子也能挑,但一次调用会贵十倍,挑得还未必更好。
「换一批」会排除最近 5 轮推过的所有条目(≤25 条)+ 已观看的 —— 之前只排除上一轮那 5 条,池子里的老面孔每轮都回来。
多久换一次
不是每半小时就在后台重跑一遍 —— 那样既慢(一次完整重建二三十秒)又费钱(每次都要叫一次模型)。分三档:
距上次完整重建 · 做什么 · 代价
不到 3 小时 · 不动,直接用手里这批 · 0
3–24 小时(你打开面板时)或满 6 小时(不管开不开) · 轻量探测:6 个熟人的最新投稿 + 每根轴一次「最新发布」 · 8–14 次请求,不叫模型、不算分
超过 24 小时 · 完整重建,就是上面那一整套 · 一次全量 + 一次模型调用
轻量探测只在真捞到「够新 + 有人看 + 贴轴」的片子时才升级成完整重建;捞不到就继续用手里这批。所以「一直没变」通常是正常的 —— 两小时内本来就不会凭空多出好片。
探测过一次,两个计时一起清零,不会重复触发。想看时间戳:~/.dsh/bili-jar/refresh.json,人话版在 STATE.md 里。
熟人是怎么认出来的
只用你自己的本地记录,不联网查你的账号:
来源 · 权重
👍 点赞 · 1 次互动
稍后看 · 1 次互动
点开看过 · 1 次互动
👎 踩 · 扣 2 次
- 同一条视频点三次也只算一次;180 天前的互动不算
- 攒到 1–2 次 = 观察中,3 次及以上 = 转正
- 踩扣到 0 以下 = 拉黑,不再拉他的投稿
转正之后,他的新片(3 天内)会直接进候选,并且加一点权重 —— 这是预测,不等点赞率、投币率攒成形。观察中的只加半个权重。
名单不占设置页的地方,只在日志(ups:list)和 STATE.md 里报一行。想重置就删 ~/.dsh/bili-jar/ups.json,下次自己重新长。
日期:每根轴自己决定
同一个窗口不可能同时适合「时政」和「空洞骑士攻略」—— 前者 14 天就过期,后者 2023 年的攻略今天照样有用。
所以每根轴有一个 freshness:
· 日期窗口 · 时效分权重
news · 14 天(全局可改) · 0.10
evergreen · 不限 · 0.02
怎么定的:不看条数,看合格条目的年龄中位数。超过 90 天就算常青内容。
实测七个冷门词,分得很干净:丝之歌 361 天、空洞骑士 2052 天、vtuber 2385 天(都是 evergreen);时政 13 天、深蓝 26 天、术力口 5 天、kards 5 天(都是 news)。中间几乎没有模糊地带。
条数会跟着搜索结果抖(同一个词两次跑,命中数会变),中位数不会 —— 所以拿它当判据。
新轴默认 news,跑一轮后自动看:如果它凑不够 3 条、而且合格条目普遍很老,就在同一轮里改判成 evergreen,日志记一行原因。设置页每根轴旁边有个两态小开关,点了就是手填,手填之后不再被自动覆盖。
冷门轴为什么搜不到
搜「空洞骑士」时,B 站 的前 3 页被续作「丝之歌」的新内容占满,五年前的好视频排不进来 —— 有一条 33 分钟、108 万播放的攻略要翻到第 4 页才有。
所以凑不够 3 条时会走两条补充通道:
1. 按时长带重搜:B 站 搜索支持 duration 参数(1=<10 分 / 2=10–30 / 3=30–60 / 4=>60 分),一页 20 条全落在想要的时长里,比混着搜再筛掉强得多
2. 种子扩散:/x/web-interface/archive/related?bvid= 是按内容相似度给的,不受新内容淹没。从任意 3 条同主题视频出发(不需要它们合格),去重后能捞回几十条,其中就有搜不到的那条
两条通道都是纯 HTTP,不花模型钱。
小众 tag 分:一条视频的 tag 在池子里越罕见,这一项越高(取最罕见的三个 tag 平均)。目的是别让「必剪创作 / 高能」这种大标签把长尾内容挤下去。
预设
装好就有,不用配:
类型 · 自带
兴趣轴 · 30 根:游戏 / 音乐 / 舞蹈 / 动画 / 知识 / 科技 / 影视 / 娱乐 / 生活 / 美食 / 运动 / 汽车 / 时尚 / 动物 / 鬼畜 / 纪录片 / 搞笑 / 学习 / 手工 / 摄影 / 历史 / 哲学 / 心理学 / 编程 / 数学 / 物理 / 军事 / 财经 / 职场 / 育儿
子簇 · 68 个,比如「游戏 → 沙盒游戏 / 游戏推荐 / 独立游戏」
语气 · 三套:鲸鱼女仆 / 正经简报 / 损友吐槽
头像 · 五张:睡觉 / 看电视 / 探险 / 哦鲸鲸 / 走路(唯一会动的一张)
清单在 [docs/presets.md](docs/presets.md)。设置页点「+ 游戏」就把整根轴连子簇加进来。
轴树会长。 如果预设里没有你要的,或者不够细,点「看建议」:
1. 从你池子里的 tag 挖候选(DF + 两两共现 PMI;跟谁都不特别的高频词会被当泛标签丢掉)
2. 模型再过一遍:判是不是真细分方向、是不是别的轴的词、起个能当标签用的名字、说一句为什么
3. 你点一下才写进自己的树(存在 ~/.dsh/bili-jar/axis-tree.json,不碰出厂值)
实跑过的例子:历史 挖出「人文历史档案馆 / 人文 / 美国」,模型全否了,理由是「UP 主品牌不是分类」「太泛」「属于时政轴」;deepseek 留了三个,把 ai编程 改成 AI 编程,把 claude 当作别轴的词丢掉。
记账
三层:单次 / 今天 / 累计。按 DeepSeek 官方规则算钱 —— 北京时间工作日 09:00–12:00、14:00–18:00 是峰时,其余(含周末和法定节假日)半价。
元 / 百万 token · 缓存命中 · 未命中 · 输出
峰时 · 0.04 · 2 · 8
谷时 · 0.02 · 1 · 4
历史记录按每条自己的时间戳重算,改规则会把旧账一起修正。
装
桌面版的 desktop profile 不让 CLI 装插件,只能手改依赖:
// ~/.dsh/profiles/desktop/package.json
{
"dependencies": { "dsh-bili-jar": "link:D:/你的路径/电子榨菜罐" },
"dsh": { "profile": { "bundles": ["@deepseek-ai/dsh-base", "dsh-bili-jar"] } }
}
cd ~/.dsh/profiles/desktop && pnpm install
其他 profile:
dsh plugin --profile web add dsh-bili-jar
装完重启 dsh,再刷新页面。
更新
npm 上的最新版看这里:<https://www.npmjs.com/package/dsh-bili-jar>
# 走 npm 装的 pnpm up dsh-bili-jar@latest # 走 GitHub 装的(会重新拉默认分支) pnpm up dsh-bili-jar # 桌面版(依赖写死在 profile 里时) # 把 package.json 里的版本改成 ^0.3.0,或者直接写 @latest,再 pnpm install
装完重启 dsh,然后 Ctrl+Shift+R 硬刷新页面 —— 客户端脚本会被浏览器缓存,光点刷新不够。
怎么确认版本对不对:开一次面板,设置 页底部有版本号;或者直接看接口:
curl -s http://127.0.0.1:你的端口/api/bili-jar/ping | head -c 120
第一次用
1. 点罐子 → 设置 → 填 API Key(DeepSeek 官方)
2. 改兴趣轴。默认那四根是我的口味,换成你的
3. 回「推荐」,点换一批
第一批装好之后,以后每次点开罐子都是立刻有东西(上一次那批),后台再慢慢换。
熟人名单是空着起步的:👍 攒到 3 次、或者同一个人的视频点开过 3 次,他就转正了。头几天名单是空的,属于正常。
B 站登录是可选的,只用来取 AI 字幕。二维码是插件自己画的(lib/qr.mjs,零依赖),凭证落在自己的目录里。
不过「关注」页(固定 UP)和熟人投稿都依赖它 —— 没登录时拉不到投稿,登录过期了「关注」页会提示你重新扫码。
数据都在哪
~/.dsh/bili-jar/
文件 · 内容
config.json · 面板里的设置 + 语气预设(含明文 API Key)
feed.json / `
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:10,最后更新 2026-10-28