Saltar al contenido principal
S

dsh-bili-wallpaper

st21a1/dsh-bili-wallpaper

Play a Bilibili live room or video behind the DeepSeek Harness Web GUI. Scan-login with your own account, paste a live-room link or video URL, pick the quality tier — with adjustable blur, scrim and panel opacity.

Instalar

dsh plugin --profile web add github:st21a1/dsh-bili-wallpaper

README

dsh-bili-wallpaper

English · 简体中文

把 B 站直播间实时画面 或 任意视频 当作 DeepSeek Harness Web GUI 的背景。扫码登录你自己的 B 站账号 → 粘一个直播 / 视频地址 → 选清晰度,画面就在聊天窗口背后播放。

A DeepSeek Harness plugin that plays a Bilibili live room or video behind the chat UI. Scan-login with your own account, paste a live/video link, pick the quality tier — with adjustable blur, scrim and panel opacity.

dsh-bili-wallpaper icon


它能做什么

能力说明
直播背景输入直播间链接或房号(https://live.bilibili.com/6 / 6),实时画面铺在聊天背后
视频背景输入视频链接、BV 号或 av 号;支持分 P
扫码登录二维码直接画在设置页里,手机 B 站扫一扫即可;登录后直播可选「原画」
清晰度选择「自动」= 能拿到的最好一档;也可手动指定原画 / 蓝光 / 超清…
画面调节铺满 / 完整、背景模糊、压暗遮罩、面板不透明度、静音 / 音量 / 播放速度
省电切到后台自动暂停(可关)
半透明 UI前端面板、侧栏、气泡自动变成能透出画面的玻璃面,文字仍可读
开播自愈直播地址过期或主播下播后重开,会自动重新解析接上
播完动作视频播完可:播下一P(默认)/ 重头循环 / 停在最后一帧 / 关闭背景
分P 切换多P 录播可任选一P,也能上一P / 下一P 跳转
进度条视频可拖动跳到任意时间点,实时显示「当前 / 总时长」
记住进度再打开同一个视频(同一P)从上次位置继续,不用重看已经看过的地方

界面

设置页在 设置 → B站背景,五块:开启背景 / 来源 / 清晰度 / 画面 / 账号。

设置页:来源、清晰度、画面与扫码登录

直播画面作为聊天背景的效果


安装

npm license

方式一:从 npm 装(最省事,推荐)

dsh plugin --profile web add dsh-bili-wallpaper

包在 npmjs.com/package/dsh-bili-wallpaper,运行时依赖已随包 vendor,不会再拉任何 npm 包。

桌面版把 --profile web 换成 --profile desktop(桌面版默认 profile 叫 desktop)。

方式二:从 GitHub 装

# 一条命令,直接从仓库装
dsh plugin --profile web add github:st21a1/dsh-bili-wallpaper

# 或者先克隆再装
git clone https://github.com/st21a1/dsh-bili-wallpaper.git
cd dsh-bili-wallpaper
dsh plugin --profile web add .

方式三:直接用目录路径装

dsh plugin --profile web add "C:\path\to\dsh-bili-wallpaper"

方式四:在 Harness 里让 Agent 装

把仓库地址或包名交给 Agent,说「把这个插件装进当前 profile」即可(它会调用 plugin_manager install_bundle)。

装完要做的事

  1. 重启 Harness(Host 半端 index.js 需要重启才加载)
  2. 打开 设置 → B站背景
  3. 粘一个直播或视频地址,点「使用这个来源」
  4. 想拿原画就点「扫码登录」

只改 client.js(界面部分)时不需要重启,刷新页面即可(走 client HMR)。

卸载

dsh plugin --profile desktop remove dsh-bili-wallpaper

配置和登录凭证在 $DSH_HOME/bili-wallpaper/,卸载不会自动删除,需要的话手动删掉。


支持的 profile

Profile支持说明
desktop✅ 完整桌面版默认 profile,开发和验证都在这里做
web✅ 完整dsh web 启动,浏览器访问;背景层是纯 DOM,不依赖 Electron
tui / headless❌ 无意义没有 Web GUI,装了也不会有画面

插件声明了硬依赖 webServer:没有 HTTP 服务的 profile 不会加载这一行,不会报错也不会拖慢启动。


权限与数据

只读你自己的数据,只连 B 站。

项目详情
网络仅访问 api.bilibili.com、api.live.bilibili.com、passport.bilibili.com(登录)、以及 B 站 CDN 取流
账号凭证扫码后从 Set-Cookie 取 SESSDATA / bili_jct / DedeUserID / buvid3,存 $DSH_HOME/bili-wallpaper/bili_credential.json(尝试 chmod 600)
本地配置$DSH_HOME/bili-wallpaper/config.json
不上传凭证、观看记录、任何数据都不会发到第三方;没有遥测
HTTP 路由仅 127.0.0.1 同源;带签名校验
媒体代理只放行 B 站 CDN 域名白名单,不是开放代理
文件系统只读写上面两个文件,不碰工作区
子进程无(不调用 ffmpeg / python / 外部二进制)

为什么必须有 Host 端代理

不是选择,是必需:

  1. 防盗链:B 站视频 CDN 不带 Referer: https://www.bilibili.com/ 直接返回 403(实测)。
  2. HLS 清单改写:m3u8 里的分片是相对路径,浏览器直连既跨域又带不了 Referer。
  3. 签名:每个代理地址带 HMAC-SHA256(进程内随机密钥, 目标 URL),重启即失效。
  4. 直播地址时效:URL 里的 expires 一般几十分钟,客户端在 hls.js 报致命错误时会让 Host 重新解析。

兼容性

项版本
DeepSeek Harness^0.2.0-rc.1(开发与验证于 0.2.1-rc.3)
Node.js>=22.12.0
平台Windows / macOS / Linux(验证环境:Windows 11 + DSH Desktop)
浏览器支持 MediaSource Extensions 的现代浏览器(Chrome / Edge / Firefox / Safari 14+)
与其它插件与 dsh-plugin-wallpaper-engine 功能重叠:两个都开时会提示,建议只开一个
需要 Web GUI是(desktop / web profile)

依赖

运行时依赖已随包 vendor,不需要联网安装任何 npm 包:


已知限制

  • 直播只走 HLS(ts / fmp4)。只提供 FLV 的直播间会明确报「暂不支持」,不会黑屏。
  • 视频走 durl(MP4 整段);被 B 站切成多段的视频只播放第一段,页面上会写明。
  • 进度记忆按「视频 + 分P」分别保存;播完会自动清掉该P的进度,否则下次打开会「续播」到片尾。
  • 直播没有进度条(本来就是实时的),分P 与进度控件只在视频上出现。
  • 未登录时视频一般最高 720P、直播一般「超清」;「原画」需要登录。
  • 直播以 ts 优先:AAC 音轨直接混在分片里,音画天然同步(实测 Audio: aac (LC), 48000 Hz, stereo)。
  • 浏览器可能拦截带声音的自动播放 → 先静音放起来并在页面提示,点一下即恢复。

开发

node build.mjs                     # 把 hls.js 内联进 client.js(改完 client.src.js 必须跑)
node test/test-client.mjs          # 假 window 里跑一遍注册,确认 slot 与 hls 清理
node test/test-hls-inline.mjs      # 确认内联的 hls.js 真的挂上 globalThis.Hls
node test/test-audio.mjs           # 声音回归:配置迁移 / 音量兜底 / 直播必须选 ts
node test/test-host.mjs            # 假 ctx 起 Host,真打 B 站接口与代理
node test/test-absolute-media-url.mjs  # 媒体地址必须是绝对 http://,且跨源可取、签名仍生效
node test/test-playback.mjs        # 分P / 进度读写 / 键隔离(打真实接口)
node test/test-next-part.mjs       # 播完只换源一次(不多重建 video)
node test/test-seek-ui.mjs         # 进度条状态机:松手不回弹、切P 重置
node test/test-docs-bilingual.mjs  # 中英双语文档:编码、互链、章节与版本一致

test/test-host.mjs 会用临时 DSH_HOME,不碰真实配置和凭证。 完整清单见 test/,共 17 个套件。

结构

index.js            Host:路由、扫码登录、来源解析、媒体代理、配置存储
client.src.js       浏览器半端源码(含 /*__HLS_INLINE__*/ 占位)
client.js           产物(build.mjs 生成,勿手改)
build.mjs           node build.mjs → 把 hls.js 内联进 client.js
cordis.patch.yml    bundle patch(一行 Host 插件)
locale/{zh,en}.json 插件管理器里显示的名字 / 说明
icon.svg            图标
vendor/             hls.js、qrcode、dijkstrajs(均为宽松许可证)
test/               离线自测

架构

浏览器                          Host(Node)                       B 站
  │  设置页 / 背景层                │                               │
  ├── GET  /api/bili-wallpaper/state ─────► 配置 + 账号快照
  ├── POST /api/bili-wallpaper/config ────► 写 config.json
  ├── POST /api/bili-wallpaper/login/start ─► passport 二维码 ───────►
  ├── POST /api/bili-wallpaper/login/poll ──► 轮询 + 取 SESSDATA
  ├── GET  /api/bili-wallpaper/resolve ────► 解析来源 ──► getRoomPlayInfo / playurl
  └── GET  /api/bili-wallpaper/proxy?u=… ──► 带 Referer 取流 ────────►

关键技术点:

  • 背景层是挂在 body 上的普通元素(z-index: -2),遮罩 z-index: -1 —— 不在 React 树里,换页不丢。
  • 面板靠覆盖宿主声明的令牌(--dsw-alias-bg-base / --dsw-alias-bg-layer-* / --dsw-specific-sidebar-fill)变半透明,不碰第三方插件的私有类名;选择器叠到 (0,2,1) 并用 !important 压住后置样式表。
  • hls.js 构建期内联,运行时临时挂 globalThis.Hls 用完即删,不与其它插件抢全局。

遇到「-351 受到神秘力量干扰」怎么办

-351 是 B 站的风控码,不是地址写错,也不是登录失效。插件做了三件事:

  • 登录时不带 buvid3:实测 SESSDATA + buvid3 会被判为「同一账号 + 陌生设备指纹」,playurl 直接 -351;同一次请求去掉 buvid3 立刻 code=0。所以登录态只带 SESSDATA / bili_jct / DedeUserID。
  • 匿名时带 buvid3:未登录反而是加分项(来自 finger/spi,进程内缓存)。
  • 自动退避重试:-351 / -352 / -412 / -509 按 0.6s → 1.6s → 3.2s 重试 3 次;网络抖动也重试。

仍然失败,按这个顺序排查:

  1. 设置页点「退出登录」再试 —— 账号被风控时,匿名反而能通(这是最快的一招)
  2. 重新扫码登录,拿一套全新的凭证
  3. 等 5–10 分钟(风控窗口通常几分钟到十几分钟)
  4. 换个网络(切热点 / 重启路由器)
  5. 别对同一个视频反复点刷新 —— 每次「刷新」都真打一次 B 站接口,会加重限流

插件会在错误提示里直接说明是风控而不是解析失败,别对着地址反复改。


更新日志

每个版本改了什么、修了哪些 bug,见 CHANGELOG.md 与 GitHub Releases。

许可证

MIT © 2026 st21a1

第三方组件许可见 NOTICE.md:hls.js(Apache-2.0)、qrcode(MIT)、dijkstrajs(MIT)。

本插件与哔哩哔哩(bilibili)官方无关,仅通过其公开接口获取内容,供个人本地使用。请遵守 B 站用户协议与相关法律法规,不要用于转载、再分发或商业用途。

Plugins relacionados