让本地小模型自己挑视频、读字幕并发出评论
30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add aba3345/dsh-bili-see该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · platform
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 8 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 67 处,展示前 50 条)
- 读取本地文件index.js:279
try { cur = readFileSync(SEE_CFG_FILE, 'utf8') } catch { } - 读取本地文件index.js:299
if (existsSync(WRITE_BLOCK_FILE)) unlinkSync(WRITE_BLOCK_FILE) - 删除本地文件index.js:299
if (existsSync(WRITE_BLOCK_FILE)) unlinkSync(WRITE_BLOCK_FILE) - 读取本地文件index.js:300
} else if (!existsSync(WRITE_BLOCK_FILE)) { - 写入本地文件index.js:301
writeFileSync(WRITE_BLOCK_FILE, new Date().toISOString(), 'utf8') - 读取本地文件index.js:418
if (!existsSync(server)) throw new Error(`找不到 B站 服务端:${server}`) - 读取本地文件index.js:480
if (!existsSync(join(ENGINE_DIR, 'bili_autopilot', 'server.py'))) { - 发起网络请求index.js:551
const res = await fetch(`${base}/api/tags`, { signal: ac.signal }) - 读取本地文件index.js:601
const text = readFileSync(join(RUNS_DIR, runId, 'digest.md'), 'utf8') - 发起网络请求client.js:31
const jget = async (p) => asJson(await fetch(API + p, { credentials: 'same-origin' })) - 发起网络请求client.js:32
const jpost = async (p, body) => asJson(await fetch(API + p, { - 写入剪贴板client.js:269
await navigator.clipboard.writeText(text) - 执行外部命令来自配置/变量lib/mcp-client.mjs:56
const proc = spawn(this.opts.command, this.opts.args || [], { - 发起网络请求lib/mcp-client.mjs:103
const init = await this.request('initialize', { - 发起网络请求lib/mcp-client.mjs:158
const r = await this.request('tools/list', {}, timeoutMs) - 发起网络请求lib/mcp-client.mjs:169
const r = await this.request('tools/call', { name, arguments: args }, timeoutMs) - 读取本地文件lib/python-env.mjs:49
if (!isBare && !existsSync(pyPath)) return null - 执行外部命令来自配置/变量lib/python-env.mjs:70
const r = spawnSync(pyPath, ['-c', code, outFile], { - 读取本地文件lib/python-env.mjs:87
if (existsSync(outFile)) info = JSON.parse(readFileSync(outFile, 'utf8')) - 读取本地文件lib/python-env.mjs:87
if (existsSync(outFile)) info = JSON.parse(readFileSync(outFile, 'utf8')) - 读取本地文件lib/python-env.mjs:89
try { if (existsSync(outFile)) rmSync(outFile) } catch { } - 删除本地文件lib/python-env.mjs:89
try { if (existsSync(outFile)) rmSync(outFile) } catch { } - 读取本地文件lib/python-env.mjs:126
for (const prof of readdirSync(join(home, 'profiles'))) { - 读取本地文件lib/python-env.mjs:129
for (const pkg of readdirSync(base)) { - 读取本地文件lib/hostdeps.mjs:55
for (const n of readdirSync(join(npm, '@deepseek-ai'))) { - 读取本地文件lib/hostdeps.mjs:68
for (const p of readdirSync(join(dshHome, 'profiles'))) { - 读取本地文件lib/hostdeps.mjs:97
if (!existsSync(pkgFile)) return null - 读取本地文件lib/hostdeps.mjs:98
const pkg = JSON.parse(readFileSync(pkgFile, 'utf8')) - 读取本地文件lib/hostdeps.mjs:105
return existsSync(file) ? pathToFileURL(file).href : null - 写入本地文件lib/state.mjs:54
mkdirSync(h, { recursive: true }) - 写入本地文件lib/state.mjs:67
for (const d of Object.values(dirs)) mkdirSync(d, { recursive: true }) - 读取本地文件lib/state.mjs:75
return JSON.parse(readFileSync(file, 'utf8')) ?? fallback - 写入本地文件lib/state.mjs:88
writeFileSync(tmp, JSON.stringify(value, null, 2), 'utf8') - 写入本地文件lib/state.mjs:90
renameSync(tmp, file) - 写入本地文件lib/state.mjs:92
try { writeFileSync(file, JSON.stringify(value, null, 2), 'utf8') } catch { } - 读取本地文件lib/state.mjs:93
try { if (existsSync(tmp)) unlinkSync(tmp) } catch { } - 删除本地文件lib/state.mjs:93
try { if (existsSync(tmp)) unlinkSync(tmp) } catch { } - 读取本地文件lib/state.mjs:116
names = readdirSync(src).filter((n) => n.endsWith('.py') && !n.startsWith('_')) - 读取本地文件lib/state.mjs:125
if (existsSync(apSrc)) { - 读取本地文件lib/state.mjs:134
if (existsSync(personaSrc)) { - 读取本地文件lib/state.mjs:135
if (existsSync(personaDst)) out.skipped.push('persona.yaml(家目录已有,保留用户的)') - 写入本地文件lib/state.mjs:154
copyFileSync(from, to) - 读取本地文件selfcheck.mjs:51
const missing = required.filter((f) => !existsSync(join(PKG_ROOT, f))) - 读取本地文件selfcheck.mjs:64
check('家目录铺好(mcp_server.py 平铺)', existsSync(join(HOME, 'mcp_server.py')), - 读取本地文件selfcheck.mjs:67
existsSync(join(HOME, 'autopilot', 'bili_autopilot', 'server.py')), - 读取本地文件selfcheck.mjs:69
check('人设文件在位', existsSync(join(HOME, 'persona.yaml'))) - 执行外部命令来自配置/变量selfcheck.mjs:73
const r = spawnSync(py.path, ['-c', 'import bili_autopilot.server as s; print("ok")'], { - 发起网络请求selfcheck.mjs:91
const res = await fetch(`${String(cfg.ollamaUrl).replace(/ +$/, '')}/api/tags`, { signal: ac.signal }) - 读取本地文件selfcheck.mjs:111
const cred = existsSync(own) ? own : borrowed.find((p) => existsSync(p)) - 读取本地文件selfcheck.mjs:120
const runs = readdirSync(join(HOME, 'autopilot-home', 'runs'))
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成dsh-bili-see
把本地小模型接进 B 站:让它自己挑视频、读字幕、看热评、判断值不值得说一句,再把评论发出去。
一个跑在 DeepSeek Harness 上的插件。
dsh-bili-see 漫画:50M 预算、4B 小模型干活、最后余额 49.5M
四格漫画就是这个项目的结构:云端模型只负责说话,本地模型负责跑腿。
部署
需要 DSH(支持 dsh.bundle 与 settings)、Node ≥ 20、Python ≥ 3.10、Ollama + 一个能调工具的模型(4B 起)。
1. 拿代码、装依赖
git clone https://github.com/aba3345/dsh-bili-see.git
cd dsh-bili-see
python -m venv .venv
.venv/Scripts/python.exe -m pip install -r requirements.txt # macOS/Linux: .venv/bin/python
mcp 必须 < 2,Python 必须 ≥ 3.10(mcp 1.x 的要求)。
展开完整文档(README 剩余 1 节)
dsh-bili-see
把本地小模型接进 B 站:让它自己挑视频、读字幕、看热评、判断值不值得说一句,再把评论发出去。
一个跑在 DeepSeek Harness 上的插件。
dsh-bili-see 漫画:50M 预算、4B 小模型干活、最后余额 49.5M
四格漫画就是这个项目的结构:云端模型只负责说话,本地模型负责跑腿。
部署
需要 DSH(支持 dsh.bundle 与 settings)、Node ≥ 20、Python ≥ 3.10、Ollama + 一个能调工具的模型(4B 起)。
1. 拿代码、装依赖
git clone https://github.com/aba3345/dsh-bili-see.git
cd dsh-bili-see
python -m venv .venv
.venv/Scripts/python.exe -m pip install -r requirements.txt # macOS/Linux: .venv/bin/python
mcp 必须 < 2,Python 必须 ≥ 3.10(mcp 1.x 的要求)。
2. 挂进配置档 —— $DSH_HOME/profiles/desktop/package.json:
{
"dependencies": { "dsh-bili-see": "link:<克隆路径>" },
"dsh": { "profile": { "bundles": ["...", "dsh-bili-see"] } }
}
3. 打开定时能力 —— 同一个配置档的 cordis.patch.yml 末尾:
- insert:
- id: schedule
name: "@deepseek-ai/dsh-schedule"
4. 重启 DSH —— 左侧出现「B站视频评论设置」,node selfcheck.mjs 全绿后扫码登录。
第一次跑保持「允许发评论」关闭。
让智能体帮你装
把下面这段整段丢给编码智能体(WorkBuddy / Claude Code / Cursor 都行),或者让它读 install.prompt.md:
帮我部署 dsh-bili-see:https://github.com/aba3345/dsh-bili-see
1. clone 到我指定的目录(默认 ~/tools/dsh-bili-see),在仓库根建 .venv,pip install -r requirements.txt(mcp 必须 < 2,Python ≥ 3.10);
2. 在 $DSH_HOME/profiles/desktop/package.json 的 dependencies 里加 "dsh-bili-see": "link:<克隆路径>",并把 dsh-bili-see 加进 dsh.profile.bundles;
3. 在配置档的 cordis.patch.yml 末尾插入 @deepseek-ai/dsh-schedule;
4. 跑 node selfcheck.mjs,把没过的项和修法告诉我;
5. 重启 DSH,等我扫码登录。
不要改我的 config.json、bili_credential.json 和 bili_plus.db。
配置
最常改的几个(其余都在设置页里):
| 项 | 默认 | 说明 |
| 模型 | qwen3.5:4b | 换成你 ollama list 里任意支持工具调用的模型 |
| 温度 | 0.35 | 写评论 0.3~0.5 最像一个正常人 |
| 一天最多浏览 | 6 | 跨轮累计的硬闸,用完当天不开新视频 |
| 每轮看几条 | 2 | 每条 40~90 秒,2 条比较舒服 |
| 只看最近几天 | 2 | 填 0 表示不限新旧 |
| 每日发布上限 / 最小间隔 | 3 / 60 分钟 | 与冷却、去重共同生效 |
| 允许发评论 | 关 | 总开关,关闭时写工具不注册 |
| 内容配额 | AI科技 / AI二创 / 其他 | 一行一条;没填满的额度变成「自主浏览」,从热门里挑非 AI 视频补位 |
人设就在 config/persona.yaml,直接改,下一轮生效,不用重启。实际生效的是家目录那份(设置页的「人设」编辑器写的就是它,升级不会覆盖);仓库这份是开箱默认值,不含任何真实账号信息。
安全与边界
- 两道写闸:设置页开关 → 环境变量 BILI_PLUS_WRITE。任一为假,写工具不注册。
- 发布前重跑 safety_check + style_check(文案可能被人改过);draft_id 必须属于本轮。
- 限流:每日上限 + 最小间隔 + 同视频同楼去重 + 同 UP 主 7 天去重。
- 政治、经济、社会站队、色情、血腥 → no_reply;辱骂、外链、冒充真人经历 → block。
⚠️ 自动化互动可能违反 B 站用户协议与社区规则。 限流、折叠、禁言、封号的风险由使用者自行承担。
项目面向个人学习:研究小模型如何在有限上下文里做多步决策、如何被安全策略约束。
请勿用于刷量、营销或任何形式的虚假互动;每一条发出去的评论都由你负责。
数据都在 $DSH_HOME/bili-see/(config.json、see-config.json、bili_credential.json、bili_plus.db、autopilot-home/runs/<run_id>/)。升级不丢凭证和数据库,删掉等于恢复出厂设置。
开发
node selfcheck.mjs # 不启动宿主也能跑的自检
node tests/test-apply.mjs # 假宿主跑 apply():工具 + HTTP 路由
node tests/test-client.mjs # 真渲染一遍设置页,检查文案
node tests/test-tool-run.mjs # 全链路:tick → 轮询 → summary
PYTHONPATH=python/autopilot python tests/test_engine_v2.py # 引擎单测(85 项,不联网不跑模型)
tests/workbuddy-live.mjs 只用本机 Ollama,加 --write 才会真发。欢迎 PR,见 CONTRIBUTING.md。
已知限制
4B 级别模型会犯错(重复调工具、把工具返回值当用户说话、写坏 JSON),代码里有一批兜底但不能保证每轮成功;只支持单账号;关键帧依赖视频可访问性,无 cid 或已下架时自动降级;Windows 验证最充分,macOS / Linux 的 Python 探测路径已覆盖但未经长时间实跑。
免责声明
本项目与哔哩哔哩(bilibili)及 DeepSeek 官方无任何关联,未获授权或背书。所有接口调用基于公开 Web 端行为,可能随平台变更失效。
它是一个娱乐 / 学习性质的作品:作者不承诺可用性,也不对使用本软件产生的任何后果负责。请自行遵守所在地法律法规与平台用户协议。
MIT © 2026 dsh-bili-see contributors预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
aba3345/dsh-bili-see
让本地小模型自己挑视频、读字幕并发出评论
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,792已汉化Cordis
71.4
失败经验库Ikalus1988/MisakaNet
📚 零依赖、由 git 支撑的微课程库,让 AI 智能体异步分享并检索经过验证的调试经验。| https://misakanet.org
★ 550已汉化DSH
71.2
桌面智能体工作区freestylefly/wesight
WeSight 是开源桌面控制台,面向本地 AI 智能体。它帮你安装或复用 Claude…
★ 933已汉化MCP
71
IM 机器人接入xmanrui/dsh-im
让 DeepSeek Harness 触手可及 Connecting DeepSeek Harness
★ 3,110已汉化DeepSeek 客户端
70.9
中国平台研究引擎Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30…
★ 2,031已汉化DSH
70.7
这是你的仓库?认领条目