Repository navigation
v1.0.0
DDtoolkit v1.0.0
个人向 VTuber 帖子 / 账号证据归档工具 —— 定时抓取 B 站与微博动态、账号统计并归档到本地 SQLite,桌面端浏览与管理。
从 v0.9.9 到 1.0.0 共 22 个批次(devlog 060–081),主题是"档案可信":
把"抓没抓到、抓到的是不是真的、删没删"三件事各自补上机器判据,并把一处会让动态流
每轮空转的线上故障修掉。数据库迁移新增 f004。
1.0 的含义不是功能变多,而是数据链路与验证基建都收敛了:307→315 条后端用例、
119→131 条前端用例、4 条位级/结构探针(含新增的场景切换与账号信息历史)。
🐛 修掉三个真问题(建议所有用户升级)
- 动态流静默停摆(v0.9.9 引入的回归) —— R6 给动态流加的"平台级起跑闸门"把
asyncio.Lock存在模块级对象上,而综合档是每轮一个新事件循环:锁在首次 await 时绑死旧循环,
第二轮起bound to a different event loop直接抛错,每一轮动态流什么都没抓
(日志里每 60s 一条 ERROR,而顶栏一切正常)。改为"占时隙"(线程锁 + 锁外 sleep),
不再持有任何 loop-bound 原语;ARCHITECTURE增补不变量:模块级对象不得持有 asyncio 原语。 - 弹幕"这场没有数据"是误报 —— 上游会间歇性变慢(实测 1.1s ↔ 15.6s),旧代码 12s 就放弃,
于是"有 13857 条弹幕的场次"被报成没有弹幕。超时放宽到 30s + 3 次重试,并把上游取数拆出独立请求
(详情弹窗秒开、弹幕/动态两格各自 loading、可就地重试);一次取数只打一轮上游(同场次单飞)。 - 删掉"字段锁定"这个错误设计 —— 它让手改的昵称/签名不被抓取覆盖,却没有任何历史可查;
现在平台签名只读、允许被抓取更新,旧值进vtuber_field_history记账并在
「账号信息历史」里查看(手改不入账)。
✨ 新增能力
- 签名来源与覆盖(A3) —— 卡片签名 = 自定义覆盖 → 指定平台账号 → 主账号 → 空。
平台下拉里点某个平台只是换来源,不改任何平台的签名(此前点一下会把主账号签名改掉);
输入框打字 = 覆盖,清空 = 撤销覆盖。 - 账号信息历史 —— 档案设置里每个账号多一个历史入口:曾用名 / 曾用签名(平台侧旧值)
- 抓取快照(粉丝数 / 直播状态 / 开播标题 / 来源标注,最近 60 条)。
- 动态抓取按平台名单 —— 库里所有 V 的所有平台账号按平台分组,名单之间并行、
名单内部串行;名单内间隔按长度自适应摊平,一轮 ≈50s,周期下限 60s(按轮开始计时)。
实测(7 个 V / 10 个账号):一轮 40~44s、{bilibili: 8, weibo: 2}请求、0 风控。 - 日志按天轮转 ——
logs/app.log+logs/app.log.YYYY-MM-DD(保留 7 份)。
此前单文件长到 5.2MB / 33963 行、跨数月,排查前得先手工切分。 - 档案设置全面实时化 —— 无保存钮,失焦/点击即写库;签名候选下拉(内嵌 chevron、
浮层不裁剪、长签名 hover 自动横滚 + 渐隐)。
🔍 验证基建(本版的另一半)
- UI 探针扩到四条:布局/三档宽度(原有)+ 档案设置几何与可点性(29 项,
含elementFromPoint命中测试与"点一行不会关弹窗")+ 场景切换机(切 V 的
预取→退场→提交是否走完)+ 位级签名(hero 药丸 / 日历格)。 - 踩坑教训写进文档:① 几何断言看不见
pointer-events(面板"点不动"却全绿);
② 只在单个事件循环里跑的测试对"跨循环"无感;③ 探针读了点击前的旧 DOM 节点,
把正常的场景机误判成"永久卡死"。三条都是同一句话:测试量错了轴,全绿或全红都没意义。 - 后端 315 条 / 前端 131 条用例;
scripts/dev_check.py一把梭。
📦 资产
DDtoolkit_1.0.0_x64-setup.exe— Windows NSIS 安装包(用户级安装)DDtoolkit-portable-win64.zip— 便携版(解压即用,含后端 onedir)
数据目录:安装版 %APPDATA%\com.ddtoolkit.app;便携版可设 DDTOOLKIT_DATA_DIR 自定义。
从 v0.9.3 起可直接覆盖安装(后端目录层级自 v0.9.2 起已修正)。
⚠️ 升级说明
- 数据库自动迁移到 f004(新增
vtubers.sign_override/sign_source_account_id、
建vtuber_field_history、删除accounts.locked_fields)。首次启动比平时稍慢,属正常。 - "字段锁定"入口消失是预期:改昵称/签名不再被"锁"保护,而是被抓取覆盖时留下曾用值。
- 若你曾用旧版手改过账号昵称/签名,那些改动仍在新版库里(只是不再被特殊保护)。
- 微博取数需要登录态:未登录/失效时动态流的微博名单会整条跳过并在日志说明;
重新扫码后下一轮自动恢复,不用重启。
🔧 技术栈
- 后端:Python 3.14 + FastAPI + SQLAlchemy 2.0 + SQLite(WAL) + APScheduler + Alembic(迁移链 f004)
- 前端:Vite + React 18 + TypeScript + Tailwind v4 + ECharts 6 + Radix
- 桌面壳:Tauri v2(拉起后端 + 注入空闲端口 + Job Object 进程看门狗)
⚖️ 许可
MIT License(见 LICENSE)。字体:阿里妈妈方圆体(官方许可免费商用 + 允许嵌入)。