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

B站直播助手 kirako1/dsh-bili-live

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

B站直播助手DD版:自动巡场看直播、听声音看画面、写直播笔记、给主播打分

30.4/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add kirako1/dsh-bili-live
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · platform
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/10/21·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 12 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 51 处,展示前 48 条)
  • 写入本地文件
    index.js:66
    mkdirSync(dir, { recursive: true })
  • 读取本地文件
    index.js:71
    try { return JSON.parse(readFileSync(file, 'utf8')) } catch { return fallback }
  • 写入本地文件
    index.js:75
    try { writeFileSync(file, JSON.stringify(value, null, 2), 'utf8') } catch { }
  • 读取本地文件
    index.js:115
    try { version = JSON.parse(readFileSync(join(pluginDir, 'package.json'), 'utf8')).version || '' } catch { version = '' }
  • 写入本地文件
    index.js:135
    try { appendFileSync(logFile, line + '\n', 'utf8') } catch { }
  • 读取本地文件
    index.js:153
    const isLoggedOut = () => existsSync(loggedOutFile)
  • 读取本地文件
    index.js:161
    try { if (existsSync(loggedOutFile)) unlinkSync(loggedOutFile) } catch { }
  • 删除本地文件
    index.js:161
    try { if (existsSync(loggedOutFile)) unlinkSync(loggedOutFile) } catch { }
  • 读取本地文件
    index.js:288
    const data = readFileSync(s.file)
  • 写入本地文件
    index.js:602
    try { mkdirSync(audioDir, { recursive: true }) } catch { }
  • 读取本地文件
    index.js:646
    if (!existsSync(script)) return resolve({ ok: false, error: `缺脚本 ${script}` })
  • 执行外部命令来自配置/变量
    index.js:647
    const p = spawn(py, [script], {
  • 删除本地文件
    index.js:653
    const done = (r) => { try { unlinkSync(flv) } catch { } ; resolve(r) }
  • 写入本地文件
    index.js:664
    writeFileSync(jpg, buf)
  • 写入本地文件
    index.js:687
    try { mkdirSync(shotDir, { recursive: true }) } catch { }
  • 删除本地文件
    index.js:703
    if (!v || v.roomId !== roomId) { try { unlinkSync(s.file) } catch { } ; return }
  • 删除本地文件
    index.js:705
    try { unlinkSync(s.file) } catch { }
  • 删除本地文件
    index.js:720
    try { unlinkSync(seg.file) } catch { }
  • 删除本地文件
    index.js:764
    if (!cfg.audioKeepFiles) { try { unlinkSync(seg.file) } catch { } }
  • 执行外部命令来自配置/变量
    index.js:1408
    const p = spawn(bin, [dir], { detached: true, stdio: 'ignore' })
  • 发起网络请求
    client.js:26
    const jget = async (p) => asJson(await fetch(API + p, { credentials: 'same-origin' }))
  • 发起网络请求
    client.js:27
    const jpost = async (p, body) => asJson(await fetch(API + p, {
  • 发起网络请求
    lib/live.mjs:41
    const r = await fetch(url, { headers: headersOf(cred, referer) })
  • 请求外部主机api.live.bilibili.com
    lib/live.mjs:320
    const r = await fetch('https://api.live.bilibili.com/msg/send', {
  • 发起网络请求
    lib/live.mjs:320
    const r = await fetch('https://api.live.bilibili.com/msg/send', {
  • 请求外部主机api.vc.bilibili.com
    lib/live.mjs:380
    const r = await fetch('https://api.vc.bilibili.com/web_im/v1/web_im/send_msg', {
  • 发起网络请求
    lib/live.mjs:380
    const r = await fetch('https://api.vc.bilibili.com/web_im/v1/web_im/send_msg', {
  • 读取本地文件
    lib/auth.mjs:37
    const src = readFileSync(file, 'utf8')
  • 发起网络请求
    lib/auth.mjs:59
    const r = await fetch(url, { ...init, headers: { ...HDRS, ...(init?.headers || {}) } })
  • 写入本地文件
    lib/recap.mjs:352
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    lib/recap.mjs:372
    writeFileSync(path, recorder.toText(summary, extra), 'utf8')
  • 读取本地文件
    lib/recap.mjs:378
    return statSync(p).isFile()
  • 读取本地文件
    lib/recap.mjs:388
    return readdirSync(dir)
  • 读取本地文件
    lib/recap.mjs:392
    const st = statSync(full)
  • 发起网络请求
    lib/audio.mjs:28
    const r = await fetch(url, { headers: headersOf(cred) })
  • 发起网络请求
    lib/audio.mjs:195
    const r = await fetch(url, { headers: headersOf(null), signal: ac.signal })
  • 发起网络请求
    lib/vision.mjs:74
    const r = await fetch(url, { headers: headersOf(null), signal: ac.signal })
  • 读取本地文件
    lib/asr.mjs:32
    if (c && existsSync(c)) return c
  • 读取本地文件
    lib/asr.mjs:41
    return existsSync(shared) ? shared : own
  • 读取本地文件
    lib/asr.mjs:66
    return !!this.python && existsSync(WORKER)
  • 执行外部命令来自配置/变量
    lib/asr.mjs:93
    proc = spawn(this.python, [WORKER, this.model], {
  • 读取本地文件
    lib/cleanup.mjs:24
    names = readdirSync(dir)
  • 读取本地文件
    lib/cleanup.mjs:31
    const st = statSync(p)
  • 删除本地文件
    lib/cleanup.mjs:49
    rmSync(p, { force: true })
  • 删除本地文件
    lib/cleanup.mjs:68
    rmSync(p, { force: true })
  • 发起网络请求
    lib/rating.mjs:35
    const r = await fetch(url, { headers: headers(cred), signal: AbortSignal.timeout(ms) })
  • 请求外部主机api.bilibili.com
    lib/rating.mjs:58
    const r = await fetch('https://api.bilibili.com/x/web-interface/nav', {
  • 发起网络请求
    lib/rating.mjs:58
    const r = await fetch('https://api.bilibili.com/x/web-interface/nav', {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:api.live.bilibili.com、api.vc.bilibili.com、api.bilibili.com

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-bili-live · 直播助手(DD版) 挂在你自己的 B站 账号上,安静地看直播,离场时留一张笔记,顺手给主播打个分。 守几个主播,或者按喜好关键词自己巡场。进房后三路一起采:弹幕长连接、音频切片转写、定时抽帧看画面;看满设定的时长就走,走之前算一次分、写一张笔记,分数够好的推给你另一个账号。 平时一句话不说,只有被叫到、或者听到你设的关键词才接一句。 适用于 DeepSeek Harness(DSH)桌面版 / Web 版。 它能做什么 | | 能力 | 说明 | | 👀 | 看弹幕 | 长连接接收弹幕,只读不发。守指定主播(行序即优先级),或按喜好关键词自动巡场。 | | 👂 | 听声音 | 拉直播音频流切片,本机 faster-whisper 转写。不花 token、不联网。听到关键词会接话,也会写进笔记。 | | 🖼 | 看画面 | 定时从视频流里抽一帧(PyAV 解码,不落临时视频),总结时把画面一起交给模型。 | | ⭐ | 给主播打分 | 十维评分(另有一项恶意的隐藏扣分),权重自己调。守的主播和巡场遇到的都会打;看不满 60 秒不打分。 | | 📝 | 写笔记 | 一场直播一张 txt:评分明细、发生了什么、大肥鱼的评价、最热闹的一分钟、弹幕摘录、主播原话。
展开完整文档(README 剩余 1 节)
dsh-bili-live · 直播助手(DD版)

挂在你自己的 B站 账号上,安静地看直播,离场时留一张笔记,顺手给主播打个分。

守几个主播,或者按喜好关键词自己巡场。进房后三路一起采:弹幕长连接、音频切片转写、定时抽帧看画面;看满设定的时长就走,走之前算一次分、写一张笔记,分数够好的推给你另一个账号。
平时一句话不说,只有被叫到、或者听到你设的关键词才接一句。

适用于 DeepSeek Harness(DSH)桌面版 / Web 版。

它能做什么

| | 能力 | 说明 |
| 👀 | 看弹幕 | 长连接接收弹幕,只读不发。守指定主播(行序即优先级),或按喜好关键词自动巡场。 |
| 👂 | 听声音 | 拉直播音频流切片,本机 faster-whisper 转写。不花 token、不联网。听到关键词会接话,也会写进笔记。 |
| 🖼 | 看画面 | 定时从视频流里抽一帧(PyAV 解码,不落临时视频),总结时把画面一起交给模型。 |
| ⭐ | 给主播打分 | 十维评分(另有一项恶意的隐藏扣分),权重自己调。守的主播和巡场遇到的都会打;看不满 60 秒不打分。 |
| 📝 | 写笔记 | 一场直播一张 txt:评分明细、发生了什么、大肥鱼的评价、最热闹的一分钟、弹幕摘录、主播原话。 |
| 🎛 | 手动切台 | 设置页顶上:「换个随机直播间」立刻换一个(不用等看满时长);也可以填房间号或主播 UID 直接进指定直播间。手动切进去的算随机巡场——照样打分,看满设定时长照样换台。 |
| 📬 | 高分推送 | 分数过线时把这场推给指定的 B站 账号(B站 不允许发给自己,要填另一个 UID)。只推随机巡场遇到的,守的主播分数只留在笔记里。 |

一场直播的流程

进房(守名单或随机巡场) ↓ 三路同时采:弹幕长连接 / 15 秒音频切片 / 每 2 分钟一张画面 ↓ 离场(主播下播、被更高优先级顶掉、看满巡场时长、你点了停止) ↓ 算分 → 模型写笔记 → 过线推送 → 删掉这一场的切片与截图

随机巡场

关注名单留空(或关掉「启用关注名单」)时,插件自己挑台:

1. 没看过的、命中喜好关键词的房间优先
2. 没命中但也没看过的
3. 实在没得挑才回到最近看过的(记最近 12 间)

还有一种情况也会随机逛:开着关注名单、但名单上的主播一个都没在播。默认就会按上面的顺序随机进一个直播间(设置页「名单里全都没在播时,也去随机逛」可关掉;关掉就只在名单里干等,绝不进别人的直播间)。他们一开播,下一轮检查就会切回优先级更高的那位。

默认每间看 30 分钟就换;看不满 60 秒被切走的那一场不打分、不推送。

评分怎么算

十个维度,评的是这个主播的水平,不是「这场热不热闹」。每项先按各自满分线归一(跨数量级的走对数,比率走线性),再按权重加权,满分 10 分:

| 维度 | 默认权重 | 满分线 | 归一 |
| 粉丝付费率(挂牌付费者 ÷ 本场出场人数) | 19% | 10% | 线性 |
| 直播互动(每百人每分钟弹幕) | 16% | 12 条 | 对数 |
| 观众参与(发言人数 ÷ 本场出场人数) | 12% | 25% | 线性 |
| 粉丝浓度(挂牌人数 ÷ 本场出场人数) | 12% | 15% | 线性 |
| 作品获赞(每稿获赞) | 10% | 随粉丝数浮动,见下表 | 对数 |
| 更新频率(月投稿) | 8% | 5 稿/月 | 线性 |
| 路人付费率(未挂牌付费者 ÷ 本场出场人数) | 8% | 25% | 线性 |
| 弹幕热度(条/分) | 7% | 6 | 对数 |
| 人气规模(同接) | 5% | 30 人 | 对数 |
| 路人转化率(新增粉丝团 ÷ 本场出场人数) | 3% | 10% | 线性 |

作品获赞的满分线按粉丝数浮动(获赞是作品数据,跟今晚来了多少人没关系:237 人房的果宝 33882 赞/稿,10097 人房的大东彦只有 5279):

| 粉丝数 | 1万 | 5万 | 20万 | 50万 | 100万 | 200万 | 500万 | 1000万+ |
| 满分线 | 300/稿 | 600 | 1500 | 3000 | 6000 | 12000 | 30000 | 60000 |

锚点之间线性插值;粉丝数拿不到时退回 600,不连累主播。

权重在设置页自己填百分数,不用凑满 100(算分时按合计归一),填 0 就是完全不看那一项。

分母分两套:crowd = max(同接, 30) 只给「每百人弹幕」用,防止个位数房间算出「每百人 125 条」这种鬼数字;heads = max(同接, 5) 给其余所有「人数 ÷ 同接」的指标(参与、浓度、两个付费率、转化),只防 1~4 人的极端比例。付费率以前误用了 30 人兜底,30 人以下的小房间会被整体腰斩(15 人的房 3 个路人付费本来是 20%,除以 30 只剩 10%)。

档位

| 分数 | 档位 |
| ≥ 9 | S · 顶尖 |
| ≥ 8 | A · 很强 |
| ≥ 6 | B · 中上 |
| ≥ 4 | C · 一般 |
| ≥ 2 | D · 偏弱 |
| < 2 | E · 很弱 |

恶意内容扣分(隐藏项)

弹幕里出现带节奏、网络暴力、粗鄙语言时,结算会额外问一次模型:恶意弹幕条数超过阈值(默认 10 条)才扣分,最多扣 5 分,扣到 0 为止。本场只要有封禁(房管或主播封过人,系统自动封也算),就一律不扣分——现场已经制止过了。判定前会先分清是开玩笑(熟人互损、玩梗、跟风复读)还是真恶意,拿不准的一律不算。

接口只告诉你「谁被封了」,不告诉你为什么封,所以没法区分「封恶意弹幕」和「封广告刷屏」——一律按免责处理,宁可少扣,不冤枉已经管过场的主播。碰到「弹幕确实脏、但有人封过」这种分不清的情况,大肥鱼会在评价里如实交代一句:看到了一些不干净的弹幕,但现场已经封禁处理,分不清封的是不是这些,这次先不扣分。

只审弹幕,不审语音——转写有错字、分不清主播和连麦者,拿它扣分容易冤。

这一项不出现在直播助手正文里,只在评分日志和笔记的评分行后面挂一段算式:

评分:6.5/10(B 档 · 中上)|8.5 − 2 = 6.5

同接取的是 getOnlineGoldRank 返回的真实在线人数,不是页面上那个虚高几百倍的「人气值」。

直播笔记长什么样

2026-10-17 · 某主播 的直播直播间:https://live.bilibili.com/00000 开播标题:今天随便聊聊观看时段:20:01 ~ 21:20(1 小时 19 分)弹幕:共 1234 条,89 人发言语音:转写出 210 段主播说的话同接峰值:76 人在看评分:7.6/10(B 档 · 还行)同接 76(13.2 分) · 发言人数 30(14.8 分) · 弹幕 10(13.7 分) · 月投稿 50(20 分)付费 10(10 分) · 大航海 0(0 分) · 获赞率 507(5 分) · 互动率 13(2.4 分)

【这场直播大概发生了什么】(模型写的 100~180 字现场笔记)

【大肥鱼的评价】(模型写的 60~120 字主观看法:值不值得看、什么路数)

【最热闹的一分钟】 21:03 前后(12 条)

【弹幕摘录】 21:03 观众A:……

模型不可用时不会整张空白,会退化成「本地统计版」(时长、条数、最热闹的一分钟、高频词)。

安装

从 GitHub
dsh plugin --profile desktop add github:你的用户名/dsh-bili-live

或从本地目录
dsh plugin --profile desktop add link:/绝对路径/bili-live

装完重启 DSH,侧边栏「设置 → 直播助手(DD版)」就是它的设置页。

听声音需要本机 ASR 环境(可选)

语音转写用本机 Python + faster-whisper,两部分都要有:

1. 建 venv 并装依赖
python -m venv ~/.dsh/bili-live/.venv-asr
~/.dsh/bili-live/.venv-asr/Scripts/pip install faster-whisper

2. 下载模型(首次转写会自动下,也可手动预热)默认 medium,约 1.5 GB;机器吃力可在设置页切 small

找不到 Python 时插件只是「听不到声音」,弹幕、画面、评分、笔记照常工作。
抽帧只需要 av(PyAV)与 Pillow:

~/.dsh/bili-live/.venv-asr/Scripts/pip install av Pillow

隐私

- 凭证只认自己扫的:插件自带扫码登录,不借用其它插件的登录态;没扫码就显示「还没有登录」。凭证存在插件家目录 ~/.dsh/bili-live/credential.json,每 10 分钟校验一次,过期自动掉线。
- 语音转写在本机跑:音频不出本机,不花 token。只有「接一句话」和「写一张笔记」会调用模型。
- 不采集你的账号信息:插件只读直播间的公开数据(房间信息、弹幕、音频流)。

成本

| 动作 | token |
| 听声音、抽画面 | 0(本机计算) |
| 接一句话 | 约 800 |
| 写一张笔记 | 约 8k ~ 9.5k(含 3 张画面) |

一场 3 分钟的小直播约 9k token;长时间挂机时,也可以把「总结参考画面」关掉来省。

边界与注意事项

- 弹幕发送受 B站 风控约束:需要登录 cookie 与 buvid3;冷却与每日上限是为了不刷屏被封,别调得太激进。
- @ 识别是文本层面:B站 弹幕里的 @ 不一定带结构化字段,按「文本里出现名字/别名」判断,可能偶尔误判。
- 部分直播间有发言等级限制:发不出去时日志里有报错,插件照常观看,只是说不了话。
- 弹幕与语音记录只在内存里:进程中途退出,这一场就没了(只在正常离场时落盘)。
- 跟随 DSH 进程:关掉 DSH 就停止守候,插件不常驻后台。
- B站 不允许给自己发私信:高分推送要填另一个账号的 UID,留空则分数只写进笔记。

目录结构

index.js 宿主端:轮询开播、进退房间、读弹幕、触发回复、算分、写笔记(含 /api/bili-live/* 路由) client.js 浏览器端:设置页那一页(自注册模块) lib/live.mjs 与 B站 直播接口打交道(房间信息 / 弹幕长连接 / 发弹幕 / 拉流地址 / 随机房间) lib/audio.mjs 音频拉流与切片(FLV 增量解析,只留音频 tag) lib/asr.mjs 常驻转写进程的宿主侧封装(faster-whisper) lib/vision.mjs 画面抽样(FLV 切片 → 抽帧) lib/rating.mjs 十维评分:采集、归一、加权 lib/moderation.mjs 恶意内容审核(隐藏扣分,只审弹幕) lib/recap.mjs 直播记录器 + txt 笔记落盘 lib/auth.mjs 扫码登录 lib/llm.mjs 借宿主 llm 服务生成回复与总结(失败静默降级) lib/config.mjs 配置默认值与归一化 lib/cleanup.mjs 离场清理(切片、截图) tools/asr_worker.py 转写工作进程(stdin/stdout 一行一条 JSON) tools/grab_frame.py 抽帧进程(stdin 送 FLV,stdout 回 JPEG) vendor/qrcode.js 二维码生成(MIT,qrcode-generator 1.4.4) cordis.patch.yml 告诉 DSH:这个插件要跑起来

License

MIT
预览分享卡片长什么样 ↓kirako1/dsh-bili-live
分享 · DeepSeek Harness Hub
kirako1/dsh-bili-live

B站直播助手DD版:自动巡场看直播、听声音看画面、写直播笔记、给主播打分

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部