让智能体在B站开播,读弹幕谢礼物并播放观众点播视频
31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Deiael/dsh-live-vibeCoding该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · tool
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 2 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 182 处,展示前 80 条)
- 读取本地文件lib/agent.js:58
if (existsSync(file) && statSync(file).size > 1024) return file; - 读取本地文件lib/agent.js:58
if (existsSync(file) && statSync(file).size > 1024) return file; - 写入本地文件lib/agent.js:59
mkdirSync(dir, { recursive: true }); - 发起网络请求lib/agent.js:62
const res = await fetch(url, { - 写入本地文件lib/agent.js:68
const out = createWriteStream(tmp); - 读取本地文件lib/agent.js:86
if (!existsSync(tmp) || statSync(tmp).size < 1024) { - 读取本地文件lib/agent.js:86
if (!existsSync(tmp) || statSync(tmp).size < 1024) { - 读取本地文件lib/agent.js:87
if (existsSync(tmp)) unlinkSync(tmp); - 删除本地文件lib/agent.js:87
if (existsSync(tmp)) unlinkSync(tmp); - 读取本地文件lib/agent.js:90
if (total > 0 && Math.abs(statSync(tmp).size - total) > Math.max(2048, total * 5e-3)) { - 删除本地文件lib/agent.js:91
unlinkSync(tmp); - 写入本地文件lib/agent.js:94
renameSync(tmp, file); - 删除本地文件lib/agent.js:98
if (existsSync(tmp)) unlinkSync(tmp); - 删除本地文件lib/agent.js:108
for (const old of files.slice(keep)) unlinkSync(join(dir, old.f)); - 请求外部主机api.live.bilibili.comlib/agent.js:942
const info = await fetch(`https://api.live.bilibili.com/room/v1/Room/get_info?room_id=${id}`, { headers, signal: AbortSignal.timeout(15e3) }).then((r) - 发起网络请求lib/agent.js:942
const info = await fetch(`https://api.live.bilibili.com/room/v1/Room/get_info?room_id=${id}`, { headers, signal: AbortSignal.timeout(15e3) }).then((r) - 请求外部主机api.live.bilibili.comlib/agent.js:948
const more = await fetch(`https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=${id}`, { headers, signal: AbortSignal.timeout(1 - 发起网络请求lib/agent.js:948
const more = await fetch(`https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=${id}`, { headers, signal: AbortSignal.timeout(1 - 请求外部主机api.live.bilibili.comlib/agent.js:955
const hist = await fetch(`https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid=${id}&room_type=0`, { headers, signal: AbortSignal.time - 发起网络请求lib/agent.js:955
const hist = await fetch(`https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid=${id}&room_type=0`, { headers, signal: AbortSignal.time - 发起网络请求lib/agent.js:963
const pu = await fetch( - 请求外部主机www.gutenberg.orglib/agent.js:1146
const search = await fetch(`https://www.gutenberg.org/ebooks/search/?query=${encodeURIComponent(query)}`, { - 发起网络请求lib/agent.js:1146
const search = await fetch(`https://www.gutenberg.org/ebooks/search/?query=${encodeURIComponent(query)}`, { - 请求外部主机www.gutenberg.orglib/agent.js:1155
const txt = await fetch(`https://www.gutenberg.org/cache/epub/${id}/pg${id}.txt`, { - 发起网络请求lib/client.js:9
`;return typeof o=="function"&&o(null,b),b}});var vn=w(ce=>{var Dr=kt(),et=fn(),xn=mn(),_r=wn();function tt(n,e,t,o,a){let i=[].slice.call(arguments,1 - 写入剪贴板lib/client.js:9
`;return typeof o=="function"&&o(null,b),b}});var vn=w(ce=>{var Dr=kt(),et=fn(),xn=mn(),_r=wn();function tt(n,e,t,o,a){let i=[].slice.call(arguments,1 - 读取本地文件lib/repair.js:22
if (!existsSync(dir)) return null; - 读取本地文件lib/repair.js:23
const files = readdirSync(dir).filter((f) => f.endsWith(".txt")).map((f) => ({ f, t: statSync(join(dir, f)).mtimeMs })).sort((a, b) => b.t - a.t); - 读取本地文件lib/repair.js:23
const files = readdirSync(dir).filter((f) => f.endsWith(".txt")).map((f) => ({ f, t: statSync(join(dir, f)).mtimeMs })).sort((a, b) => b.t - a.t); - 读取本地文件lib/repair.js:73
let lines = readFileSync(path, "utf8").split(/ ? /); - 请求外部主机passport.bilibili.comlib/chunks/chunk-4A2ZZR7B.js:8
const res = await fetch("https://passport.bilibili.com/x/passport-login/web/qrcode/generate", { headers: HEADERS, signal: AbortSignal.timeout(TIMEOUT_ - 发起网络请求lib/chunks/chunk-4A2ZZR7B.js:8
const res = await fetch("https://passport.bilibili.com/x/passport-login/web/qrcode/generate", { headers: HEADERS, signal: AbortSignal.timeout(TIMEOUT_ - 请求外部主机passport.bilibili.comlib/chunks/chunk-4A2ZZR7B.js:14
const res = await fetch(`https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key=${encodeURIComponent(key)}`, { headers: HEADERS, si - 发起网络请求lib/chunks/chunk-4A2ZZR7B.js:14
const res = await fetch(`https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key=${encodeURIComponent(key)}`, { headers: HEADERS, si - 请求外部主机api.bilibili.comlib/chunks/chunk-4A2ZZR7B.js:30
const spi = await fetch("https://api.bilibili.com/x/frontend/finger/spi", { headers: HEADERS, signal: AbortSignal.timeout(TIMEOUT_MS) }); - 发起网络请求lib/chunks/chunk-4A2ZZR7B.js:30
const spi = await fetch("https://api.bilibili.com/x/frontend/finger/spi", { headers: HEADERS, signal: AbortSignal.timeout(TIMEOUT_MS) }); - 请求外部主机api.bilibili.comlib/chunks/chunk-4A2ZZR7B.js:41
const res = await fetch("https://api.bilibili.com/x/web-interface/nav", { headers: { ...HEADERS, Cookie: cookie }, signal: AbortSignal.timeout(TIMEOUT - 发起网络请求lib/chunks/chunk-4A2ZZR7B.js:41
const res = await fetch("https://api.bilibili.com/x/web-interface/nav", { headers: { ...HEADERS, Cookie: cookie }, signal: AbortSignal.timeout(TIMEOUT - 执行外部命令固定命令lib/chunks/chunk-TDP4TOGQ.js:3660
const out = execFileSync("reg.exe", ["query", key, "/ve"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }); - 读取本地文件lib/chunks/chunk-TDP4TOGQ.js:3671
return candidates.find((c) => existsSync(c)) ?? null; - 读取本地文件lib/chunks/chunk-TDP4TOGQ.js:3674
return existsSync("C:\\Windows\\System32\\nvEncodeAPI64.dll") || existsSync("C:\\Windows\\System32\\nvidia-smi.exe"); - 读取本地文件lib/chunks/chunk-TDP4TOGQ.js:3677
return existsSync("C:\\Windows\\System32\\igd10iumd64.dll") || existsSync("C:\\Windows\\System32\\igfxcmrt64.dll"); - 读取本地文件lib/chunks/chunk-TDP4TOGQ.js:3682
const files = readdirSync(dir).filter((f) => f.endsWith(".txt")).map((f) => ({ f, at: statSync(join(dir, f)).mtimeMs })).sort((a, b) => b.at - a.at); - 读取本地文件lib/chunks/chunk-TDP4TOGQ.js:3682
const files = readdirSync(dir).filter((f) => f.endsWith(".txt")).map((f) => ({ f, at: statSync(join(dir, f)).mtimeMs })).sort((a, b) => b.at - a.at); - 读取本地文件lib/chunks/chunk-TDP4TOGQ.js:3684
return readFileSync(join(dir, files[0].f), "utf8"); - 执行外部命令来自配置/变量lib/chunks/chunk-TDP4TOGQ.js:3784
spawn(exe, ["--disable-shutdown-check", "--disable-updater"], { cwd: join(exe, ".."), detached: true, stdio: "ignore" }).unref(); - 写入本地文件lib/chunks/chunk-TDP4TOGQ.js:3852
writeFileSync(file, wanted); - 发起网络请求lib/chunks/chunk-TDP4TOGQ.js:4795
const res = await fetch(url, { - 写入本地文件lib/chunks/chunk-TDP4TOGQ.js:6775
mkdirSync(options.dataDir, { recursive: true }); - 写入本地文件lib/chunks/chunk-TDP4TOGQ.js:7495
mkdirSync(dir, { recursive: true }); - 写入本地文件lib/chunks/chunk-TDP4TOGQ.js:7496
writeFileSync2(join2(dir, `${stamp}.md`), md, "utf8"); - 写入本地文件lib/chunks/chunk-TDP4TOGQ.js:8289
mkdirSync(dir, { recursive: true }); - 写入本地文件lib/chunks/chunk-TDP4TOGQ.js:8297
appendFileSync(this.logFile, JSON.stringify({ t: Date.now(), ...entry }) + "\n"); - 执行外部命令固定命令lib/chunks/chunk-TDP4TOGQ.js:8522
spawnSync("powershell", ["-NoProfile", "-Command", `Expand-Archive -LiteralPath '${zip}' -DestinationPath '${out}' -Force`], { timeout: 6e4 }); - 删除本地文件递归lib/chunks/chunk-TDP4TOGQ.js:8527
rmSync(tmp, { recursive: true, force: true }); - 发起网络请求lib/chunks/chunk-TDP4TOGQ.js:8561
const res = await fetch(url, { - 发起网络请求lib/chunks/chunk-TDP4TOGQ.js:8708
const res = await fetch(url, { headers, signal: AbortSignal.timeout(TIMEOUT_MS2) }); - 发起网络请求lib/chunks/chunk-TDP4TOGQ.js:8732
const res = await fetch(short.startsWith("http") ? short : `https://${short}`, { redirect: "manual", headers: { "User-Agent": UA3 }, signal: AbortSign - 发起网络请求lib/chunks/chunk-TDP4TOGQ.js:8829
const res = await fetch(url, { headers: { "User-Agent": UA3 }, signal: AbortSignal.timeout(TIMEOUT_MS2) }); - 请求外部主机www.bilibili.comlib/chunks/chunk-TDP4TOGQ.js:8863
const res = await fetch(url, { headers: { "User-Agent": UA3, Referer: "https://www.bilibili.com/", Range: "bytes=0-1" }, signal: AbortSignal.timeout(8 - 发起网络请求lib/chunks/chunk-TDP4TOGQ.js:8863
const res = await fetch(url, { headers: { "User-Agent": UA3, Referer: "https://www.bilibili.com/", Range: "bytes=0-1" }, signal: AbortSignal.timeout(8 - 请求外部主机api.bilibili.comlib/chunks/chunk-TDP4TOGQ.js:8873
const res = await fetch(`https://api.bilibili.com/x/v1/dm/list.so?oid=${cid}`, { - 请求外部主机api.vc.bilibili.comlib/chunks/chunk-TDP4TOGQ.js:9200
const res = await fetch("https://api.vc.bilibili.com/session_svr/v1/session_svr/update_ack", { - 请求外部主机api.bilibili.comlib/chunks/chunk-TDP4TOGQ.js:9223
const check = await (await fetch(`https://api.bilibili.com/x/dynamic/feed/create/submit_check?csrf=${encodeURIComponent(csrf)}`, { - 请求外部主机api.bilibili.comlib/chunks/chunk-TDP4TOGQ.js:9230
const res = await (await fetch(`https://api.bilibili.com/x/dynamic/feed/create/dyn?platform=web&csrf=${encodeURIComponent(csrf)}`, { - 请求外部主机api.bilibili.comlib/chunks/chunk-TDP4TOGQ.js:9717
const res = await fetch(`https://api.bilibili.com/x/upload/web/image?csrf=${this.csrf}`, { - 执行外部命令来自配置/变量lib/chunks/chunk-TDP4TOGQ.js:9981
const child = spawn2(python, [this.options.script, "--model", this.options.model(), "--models-dir", join6(this.options.dataDir, "models")], { - 删除本地文件lib/chunks/chunk-TDP4TOGQ.js:11379
if (!snapshot) rmSync2(LIVE_FILE, { force: true }); - 删除本地文件lib/chunks/chunk-TDP4TOGQ.js:11393
rmSync2(LIVE_FILE, { force: true }); - 发起网络请求lib/chunks/chunk-3TTXC623.js:4230
const outcome = await approval.approver.request({ - 发起网络请求lib/chunks/chunk-3TTXC623.js:6997
const outcome = await approval.request({ - 读取本地文件build.mjs:16
const chunks = readdirSync('lib/chunks').filter((f) => f.endsWith('.js')); - 读取本地文件build.mjs:19
const text = readFileSync(p, 'utf8'); - 写入本地文件build.mjs:21
if (next !== text) writeFileSync(p, next, 'utf8'); - 删除本地文件递归build.mjs:29
await rm('lib', { recursive: true, force: true }); - 写入本地文件build.mjs:30
await mkdir('lib', { recursive: true }); - 请求外部主机www.w3.orglib/stage.js:8
`+i.stack}return{value:e,source:t,stack:l,digest:null}}function Fi(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function So(e,t){tr - 请求外部主机www.w3.orglib/stage.js:8
`+i.stack}return{value:e,source:t,stack:l,digest:null}}function Fi(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function So(e,t){tr - 发起网络请求lib/stage.js:8
`+i.stack}return{value:e,source:t,stack:l,digest:null}}function Fi(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function So(e,t){tr - 发起网络请求lib/stage.js:9
`).map(f=>f.trim()).filter(Boolean)).filter(c=>c.length),[t]),[r,l]=(0,C.useState)(0),i=Number(e?.seconds??12);if((0,C.useEffect)(()=>{if(l(0),n.lengt
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:api.live.bilibili.com、www.gutenberg.org、passport.bilibili.com、api.bilibili.com、www.bilibili.com 等 8 个
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成dsh-live-vibecoding
让 DeepSeek Harness 智能体在 B 站开直播:读弹幕、谢礼物、欢迎新观众、记住常客,把观众点的视频排进队列放到舞台上,用自己的 TTS 音色说话,画面经 OBS 推到 B 站。
一个插件,让 DeepSeek Harness 在 B 站当主播:读弹幕、谢礼物、欢迎新观众、记住常客,把观众点的视频排进队列放到舞台上,用自己的 TTS 音色说话,画面经 OBS 推到 B 站。
Screenshots / 界面预览
Livestream console / 直播控制台 — 观众看到的舞台(角色、公告板、弹幕、礼物榜、点播队列),外加 OBS 浏览器源地址和主题选择器。
Livestream console
Settings / 设置 — B 站房间号、推流到 B 站(检查 OBS、直播标题、分区、编码器和码率),以及角色在舞台上念出的公告板文字。
Settings
Features / 功能
- 弹幕与礼物 — 回复弹幕、醒目留言、礼物、关注和新观众;跨场次记住常客。
- 舞台 — 浏览器源舞台,含角色、字幕、聊天、公告板、提醒、终端,以及一个点播队列,多位观众排队时自动翻页。
- 视频点播 — 观众点一个 B 站视频,插件去搜索、在舞台上播放;如果已有视频在播,就进队列等着(一次一个,不打断)。
展开完整文档(README 剩余 1 节)
dsh-live-vibecoding 让 DeepSeek Harness 智能体在 B 站开直播:读弹幕、谢礼物、欢迎新观众、记住常客,把观众点的视频排进队列放到舞台上,用自己的 TTS 音色说话,画面经 OBS 推到 B 站。 一个插件,让 DeepSeek Harness 在 B 站当主播:读弹幕、谢礼物、欢迎新观众、记住常客,把观众点的视频排进队列放到舞台上,用自己的 TTS 音色说话,画面经 OBS 推到 B 站。 Screenshots / 界面预览 Livestream console / 直播控制台 — 观众看到的舞台(角色、公告板、弹幕、礼物榜、点播队列),外加 OBS 浏览器源地址和主题选择器。 Livestream console Settings / 设置 — B 站房间号、推流到 B 站(检查 OBS、直播标题、分区、编码器和码率),以及角色在舞台上念出的公告板文字。 Settings Features / 功能 - 弹幕与礼物 — 回复弹幕、醒目留言、礼物、关注和新观众;跨场次记住常客。 - 舞台 — 浏览器源舞台,含角色、字幕、聊天、公告板、提醒、终端,以及一个点播队列,多位观众排队时自动翻页。 - 视频点播 — 观众点一个 B 站视频,插件去搜索、在舞台上播放;如果已有视频在播,就进队列等着(一次一个,不打断)。 - 语音 — 豆包(字节跳动)TTS,2.0 音色,字幕按词对齐音频时间。 - OBS 集成 — 自建 OBS 配置档和场景集合,自动挑编码器(NVIDIA NVENC → Intel QSV → x264),通过 API 打开 B 站 websocket 服务,开播、停播。 - B 站 — 扫码登录、房间设置、直播标题/分区、上传封面,SRT 地址与 OBS 不兼容时回退到 RTMP,B 站要求身份验证时给出看得懂的报错。 - 角色 / 主题 — 角色包(Live2D 风格片段或静态图)和舞台模板就是 assets/ 下的文件夹,放进去就能用。 Requirements / 环境要求 - DeepSeek Harness,带桌面/网页配置档。 - 已安装 OBS Studio 28+。插件会自己打开 OBS → 工具 → WebSocket Server Settings,不用手动设置。 - 一个开通了直播间的 B 站账号(插件可以帮你创建)。 - 一个豆包 TTS API key(新控制台,seed-tts-2.0),用来发声。没有它智能体照样跑,只是不出声。 - 可选:一个装了 faster-whisper 的 Python,用来转写没有字幕的视频。 Install / 安装 从 npm 安装: dsh plugin --profile desktop add dsh-live-vibecoding 从 GitHub 安装: dsh plugin --profile desktop add github:Deiael/dsh-live-vibeCoding 然后把 dsh-live-vibecoding 加进你配置档的 dsh.profile.bundles 列表,重启 DeepSeek Harness。 First run / 第一次使用 1. 在 DSH 里打开直播控制台。 2. 设置 → 开播账号 → 扫码登录(用 B 站 App 扫码)。 3. 输入你的房间 id(留空则新开一个)。 4. 点 检查 OBS,让插件创建自己的 OBS 配置档和暂存场景。 5. 点 开播(本地彩排、不推流则点 开始彩排)。 所有设置存放在 ~/.dsh/dsh-live-farben/settings.json;密钥(Bilibili cookie、Doubao key)放在 DSH 的凭据存储里,绝不写进这个包。 Encoder / 编码器 encoder 默认是 auto:检测到 NVIDIA 驱动就用 NVENC,Intel 核显就用 Intel QSV,否则用 x264。如果自动检测选错了,在 settings.json 里用 "encoder": "nvenc" | "qsv" | "x264" 覆盖。 Themes & characters / 皮肤与角色 - 角色:assets/characters/<id>/(character.json + 片段/图片)。 - 模板:assets/templates/<id>/(template.json + style.css + 预览图)。 内置的 dafeiyu 角色是作者本人的画作(见 assets/characters/dafeiyu/),作为演示附带。发布 fork 前请换成你自己的。 Credits / 致谢 本插件是 dsh-livestream(MIT)的 fork/衍生作品。感谢原作者提供最初的架构、OBS/Bilibili 集成和舞台运行时。 内置角色美术的授权见角色包内说明(CC BY-NC-SA 4.0),不属于 MIT 许可的代码部分。 License MIT — 见 LICENSE。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Deiael/dsh-live-vibeCoding
让智能体在B站开播,读弹幕谢礼物并播放观众点播视频
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,330已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,311已汉化DSH
71.4
智能体运行框架路由HarnessRouter/harnessrouter
智能体 harness 的统一接口。
★ 3,984已汉化DSH
71.3
这是你的仓库?认领条目