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

B站直播助手 Deiael/dsh-live-vibeCoding

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

让智能体在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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 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.com
    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)
  • 发起网络请求
    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.com
    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
  • 发起网络请求
    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.com
    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: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.org
    lib/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.org
    lib/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.com
    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_
  • 发起网络请求
    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.com
    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
  • 发起网络请求
    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.com
    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) });
  • 发起网络请求
    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.com
    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-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.com
    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
  • 发起网络请求
    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.com
    lib/chunks/chunk-TDP4TOGQ.js:8873
    const res = await fetch(`https://api.bilibili.com/x/v1/dm/list.so?oid=${cid}`, {
  • 请求外部主机api.vc.bilibili.com
    lib/chunks/chunk-TDP4TOGQ.js:9200
    const res = await fetch("https://api.vc.bilibili.com/session_svr/v1/session_svr/update_ack", {
  • 请求外部主机api.bilibili.com
    lib/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.com
    lib/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.com
    lib/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.org
    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
  • 请求外部主机www.w3.org
    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: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。
预览分享卡片长什么样 ↓Deiael/dsh-live-vibeCoding
分享 · DeepSeek Harness Hub
Deiael/dsh-live-vibeCoding

让智能体在B站开播,读弹幕谢礼物并播放观众点播视频

这是你的仓库?认领条目

回到顶部