Repository navigation
Releases: Mrslippe/DDToolkit
Release list
v1.3.0
DDtoolkit v1.3.0
个人向 VTuber 帖子 / 账号证据归档工具 —— 定时抓取 B 站、微博、小红书与抖音的帖子与账号统计并归档到本地 SQLite,桌面端浏览与管理。
v1.2.0 → v1.3.0 是一个功能版(
devlog/447–494,46 篇):正文表情包、
录播在应用内播放、直播场次类型、日期时刻选择器换成项目日历、多平台按名字搜人,
外加日历性能与一批手感修复。
⚠️ 本版有数据库迁移(f012→f017,五条):首次启动自动迁移,迁移前会自动备份到
<数据目录>/backups/。覆盖安装即可,不需要手动做任何事。
💬 正文表情包:真的画出图来了(需求 5)
- 解析换源:原先从上游载荷里只能认出约 28% 的表情,改成读 B 站自己那份表情清单 ⇒ 99%
(devlog/483)。认不出来的仍按原文显示方括号,不会变成破图; - 两类大小:与 B 站一致 —— 官方小表情与文字同高,大表情(贴纸)默认 40px,
判据用载荷自带的size字段(不是"官方还是自定义",实测那条例外有 812 个,devlog/485); - 可调:设置 → 外观 → **「大表情大小」**滑杆(24–64px,默认 40),下方给了一段图文混排示例;
- 不只正文:帖子卡片标题、纯文字封面、详情窗标题也画表情(三处共用同一个渲染器);
- 表情图统一走图片代理(直连会被图床 403)—— 这条路径的坑修过三次(
devlog/484)。
📺 录播:入口搬到封面,能直接在应用里看(需求 3)
- 「找录播」先给候选、命中率是先量过的(
devlog/464),不再猜; - 入口从右列那行文字搬到封面(hover 出现 ▶ / +),封面点开是灯箱(
devlog/478); - 点 ▶ 在应用内播放:按 BV 号取流 + 播放器(
devlog/479); - 也可以在独立的无边框播放器窗里播(设置 → 外观 → 「录播用独立播放器窗」,默认关 ——
不改变主窗播放这条老路,devlog/480)。
🗓️ 直播日历:类型、性能、以及一个能用的日期选择器
- 场次类型落库(迁移
f016/f017):写这一行就定稿这一行,按类型查询/统计改直查索引
(devlog/467/471);类型体系里**「健身」换成「助眠」**(真机上那类几乎没有证据,devlog/468);
数据视图多了「场次类型」卡、日历支持按类型筛; - 手动记录场次与场次录播地址(
devlog/454);数据视图多了「直播收益」卡
(每日收益 / 舰长数曲线 —— 数据早就在库里,这次把它画出来,devlog/452); - 性能:第一次打开日历要等的那一下(读端点不该写库,
devlog/473)、切视图那 150ms
(退场窗口里抢跑一发,devlog/474)、启动期那 485ms(只在真需要补时才扫,devlog/475); - 日期时刻选择器:原生弹层换成项目自己的日历(滚轮列,
devlog/477); - 修掉「日历弹窗只有遮罩、看不见小窗」(
devlog/476)与详情窗头部的编辑铅笔被挤到正中央、
词云 hover 提示与鼠标对不上(devlog/491)。
🔍 找人:一次搜四家
「添加 V」除了池内检索,还能按名字去四个平台搜(B 站 / 微博 / 小红书 / 抖音,devlog/463);
候选池刷新到 vdb 名册(含企划 uuid 与跨平台账号,devlog/457)。
🏷️ 企划徽章:名单、口径、以及一枚开关
- 没有企划的 V 统一显示「个人势」(用户口径,
devlog/481),筛选弹窗里它是一枚正常选项; ⚠️ 左栏那枚徽章现在默认不显示(devlog/494):设置 → 外观 → 「显示企划徽章」,默认关 ——
打开后才恢复「有图标画图标、没有画企划名」那套。图标素材保持空缺(三条来源路线都试过/看过、
都不采用,devlog/489/490)。
🐛 其它修复
- B 站登录为什么失效(
devlog/455)与登录浮窗溢出;截图暴露的四处(说明条比面板宽 / Tab 标签 /
能力闸门 / 扩展缺弹窗,devlog/456); - 数据卡片加载八秒的根因(
devlog/459);左栏不滚、切 V 背景闪、打开原文被拒(devlog/448/449)、
切 V 背景第一帧偏左(devlog/449);单推新入口连点十次(devlog/450); - 弹幕数到底该信哪个:各录制版本取最大(
devlog/462);通知里写账号昵称而不是 ID; - 通知面板:排序键打平时两行会换位(
devlog/493,退场那条被拼到活着的后面); - 词云词典空闲卸载(
devlog/447)。
⚡ 省盘:B 站封面取数加图床规格(devlog/492)
封面固化时按图床规格取图(@672w_378h.webp,不带裁剪)—— 本机真库实测同一张封面降到
0.1%–14%(14 MB 的降到 13.8 KB、3.27 MB 的降到 30 KB)。已固化的旧封面不会自动变小,
新抓到的从此都是小的;动图(.gif,占 6.7%)会变成单帧。
🔧 维护者侧(不影响使用)
- 文档体检:删掉 13 份已落地的计划文档、
design/专题归位、19 处悬空引用改正;
文档门禁 40 份 / 0 超预算(devlog/488);待办清单收敛到「只有未完成项」(用户侧那一组清空); - 自审两轮:端点耗时仪器 + 一致性扫描(7 处"同概念两字段"分歧,
devlog/460/461);
清掉 4 处"写了没人调"的死代码(devlog/465); - 人工标注集第一次出数 0% → 70.6%(
devlog/470),并先把「类型列不可用」量清楚再动手(devlog/471)。
📦 资产
DDtoolkit_1.3.0_x64-setup.exe— Windows NSIS 安装包(用户级安装,含extension\)DDtoolkit-portable-win64.zip— 便携版(解压即用,含后端 onedir 与extension\)latest.json+ 安装包的.sig— 应用内更新的载体与清单(手工下载请用上面两项)
⚠️ 升级说明
- 数据库有迁移:
f012→f017(五条:场次录播地址 / 企划归属 / 录播账号 / 场次类型 /
场次身份键)。首次启动自动迁移,迁移前自动备份到<数据目录>/backups/;
迁移失败会把坏库隔离并用空库继续启动(状态见/healthz与「设置 → 关于」的体检);
不放心的话可以先手动复制整个数据目录再升级; - 使用须知不会再让你确认一次:本版没有改声明正文(
NOTICE_VERSION仍是2026-10-06); - 数据目录与 v1.2.0 相同:默认
%APPDATA%\com.ddtoolkit.app,也可以在「设置 → 关于」里迁移到其他盘; - v1.2.0 的行为都保留:单推模式、背景取景与背景视频、左栏自定义排序、浏览器扩展随包、MSE 播放内核、
抖音总开关默认关、轻资产固化等。
🔧 技术栈
- 后端:Python 3.14 + FastAPI + SQLAlchemy 2.0 + SQLite(WAL) + APScheduler + Alembic(迁移链 f017)
- 前端:Vite + React 18 + TypeScript + Tailwind v4 + ECharts 6 + Radix
- 桌面壳:Tauri v2(托盘 + 拉起后端 + 注入空闲端口 + Job Object 进程看门狗)
- 浏览器扩展:MV3(纯 JS +
chrome.cookies,无构建步骤,随安装包/便携版一起分发)
⚖️ 许可
MIT License(见 LICENSE)。嵌入字体:阿里妈妈方圆体(官方许可免费商用 + 允许嵌入)。
抖音签名实现移植自 Douyin_TikTok_Download_API
(Apache-2.0:许可原文与上游 NOTICE 随仓库 app/services/platforms/vendor/dtksign/ 一起分发)。
v1.2.0
DDtoolkit v1.2.0
个人向 VTuber 帖子 / 账号证据归档工具 —— 定时抓取 B 站、微博、小红书与抖音的帖子与账号统计并归档到本地 SQLite,桌面端浏览与管理。
v1.1.1 → v1.2.0 是一个功能版(
devlog/377–445):单推模式、背景取景与背景视频、
左栏自定义排序、播放器全屏卡顿定案,外加「小 V 加不上」等一批修复。
⚠️ 本版有数据库迁移(f009→f012):首次启动自动迁移,迁移前会自动备份到
<数据目录>/backups/。覆盖安装即可,不需要手动做任何事。
🎬 单推模式:只剩背景图,鼠标一动就回来(需求 6)
图标栏上多了一颗 单推 开关(一个 V 都没进时不可用)。打开它是固定的分段收起动画
(左栏 → 左侧工具栏 → 顶栏);全部收起后停手 5 秒 ⇒ 页面元素下滑渐隐、白纱罩一起撤掉
(只在卡片视图生效),背景图完整露出来;鼠标一动,界面元素上滑渐显、遮罩回来。
单推中顶栏与左侧工具栏仍可贴边唤出(顶部一条 12px 的带子、左缘是工具栏整宽),
唤出时界面元素立刻恢复;唤出的两栏一定压在面板的浮层之上(这类"按钮被顶掉"的层级问题
在本版修过两轮)。
左栏的收起 / 展开现在是常驻功能:不管在哪种模式,鼠标移到左栏右缘(收起后是内容区
左缘)那条窄边上,拉手才会现身,点一下即可收起 / 展开,偏好跨启动记住。
🖼️ 背景:能调位置,也能放视频(需求 7 / 9)
- 背景视频:上传一段视频当背景(与背景图共用同一条流式落盘与内容校验纪律),可单独清除;
- 取景(调位置):预览框里 拖 = 平移、滚轮 = 缩放,松手才存;口径是「图片锚点」
(保铺满、锚点守恒,与object-position同向); - 图片与视频的取景互不相干,一个按钮切换在调哪一份;调视频时用首帧当预览;
- 播放器一开始播放,背景就自动让位(不再和视频抢注意力)。
📺 播放器:全屏卡顿定案 + 键盘与焦点(需求 2 / 3)
- 全屏卡顿(长时间全屏播放掉帧)定案到元凶:硬件视频解码器。壳里关掉
--disable-accelerated-video-decode之后实测全屏丢帧 10.8% → 0.1%(devlog/403/404);
排查期间加的诊断开关与权宜改动全部撤掉,窗口恢复分层透明(devlog/407–411); - 键盘改由「指针移入」接管:指针进入播放器才响应
/、k、←→↑↓、m、f,移出交回页面;
并且播放器移出 Tab 序(需求 3); - 进出全屏加了一段过渡(不再"生硬地跳");切 V 时背景不再闪白 —— 改成双层交叉淡入 +
预加载,任何一帧都至少有一层是不透明的(devlog/378)。
🗂️ 左栏:按住拖动排序 + 排序栏(需求 4 / 5)
- 左栏按住 350ms 进入拖动、按落点重排(乐观渲染,失败回退);拿起/松手是双向缓动;
- 筛选浮窗里新增排序栏六档,与拖动排序共用同一份顺序数据(迁移
f010)。
🐛 其它修复
- 小 V 加不上:B 站给新账号发的 mid 是 16 位,旧判据卡在 12 位 ⇒ 库里约四分之一的
「池外新 V」搜得到、点添加却没反应。前后端判据一起放宽到 20 位(devlog/378); - 通知「已读」的让位时机改为滑出 60%–80% 之后再顶上来(需求 10);
- 单推模式下「唤出的工具栏被面板浮层盖住按钮」「正常模式收起左栏时工具栏一起消失」
「收起/展开有延迟」等一串视觉与手感问题。
🔧 维护者侧(不影响使用)
- CI 两条腿的四处根因收口(干净 clone 上的资源 glob、文档路径引用、补装
build组的顺序); - 单推那批代码里 16 处指向
devlog/430/434的悬空指针修正(那两个编号从未存在); UI-MAP的图标栏那一行按代码重写,并立下一条:文档里只写旋钮的名字与真源、不写它的现值。
📦 资产
DDtoolkit_1.2.0_x64-setup.exe— Windows NSIS 安装包(用户级安装,含extension\)DDtoolkit-portable-win64.zip— 便携版(解压即用,含后端 onedir 与extension\)latest.json+ 安装包的.sig— 应用内更新的载体与清单(手工下载请用上面两项)
⚠️ 升级说明
- 数据库有迁移:
f009→f012(三条:左栏自定义排序 / 背景取景 + 背景视频 /
视频取景与图片取景分开)。首次启动自动迁移,迁移前自动备份到<数据目录>/backups/;
迁移失败会把坏库隔离并用空库继续启动(状态见/healthz与「设置 → 关于」的体检);
不放心的话可以先手动复制整个数据目录再升级; - 使用须知不会再让你确认一次:本版没有改声明正文(
NOTICE_VERSION仍是2026-10-06); - 数据目录与 v1.1.1 相同:默认
%APPDATA%\com.ddtoolkit.app,也可以在「设置 → 关于」里
迁移到其他盘; - v1.1.1 的行为都保留:浏览器扩展随包分发、MSE 播放内核、抖音总开关默认关、通知中心、轻资产固化等。
🔧 技术栈
- 后端:Python 3.14 + FastAPI + SQLAlchemy 2.0 + SQLite(WAL) + APScheduler + Alembic(迁移链 f012)
- 前端:Vite + React 18 + TypeScript + Tailwind v4 + ECharts 6 + Radix
- 桌面壳:Tauri v2(托盘 + 拉起后端 + 注入空闲端口 + Job Object 进程看门狗)
- 浏览器扩展:MV3(纯 JS +
chrome.cookies,无构建步骤,随安装包/便携版一起分发)
⚖️ 许可
MIT License(见 LICENSE)。嵌入字体:阿里妈妈方圆体(官方许可免费商用 + 允许嵌入)。
抖音签名实现移植自 Douyin_TikTok_Download_API
(Apache-2.0:许可原文与上游 NOTICE 随仓库 app/services/platforms/vendor/dtksign/ 一起分发)。
v1.1.1
DDtoolkit v1.1.1
个人向 VTuber 帖子 / 账号证据归档工具 —— 定时抓取 B 站、微博、小红书与抖音的帖子与账号统计并归档到本地 SQLite,桌面端浏览与管理。
v1.1.0 → v1.1.1 是一个小补丁版(
devlog/375、devlog/376)。用户能看到的只有一件:
浏览器扩展随应用一起安装 —— 直装版在<安装目录>\extension\、便携版在DDtoolkit\extension\,
应用里「设置 → 登录 → 浏览器扩展」把路径显示出来并给一个「打开目录」+ 装法三步。
其余是发布工具链与文档的自查修补(不影响使用)。数据库无迁移(仍是 f009),覆盖安装即可。
🧩 浏览器扩展现在随应用一起安装
v1.1.0 的扩展只活在仓库里 ⇒ 只下载 Release 的新用户根本装不上(浏览器只接受"商店"或
"本地目录 + 开发人员模式"两种来源,双击 .crx 从 Chrome 75 / Edge 起就被禁)。现在:
- 直装版:安装目录里的
extension\(卸载时一并删除); - 便携版:解压目录里的
DDtoolkit\extension\; - 应用里「设置 → 登录 → 浏览器扩展」新增一行 扩展目录:显示绝对路径、「打开目录」按钮、
以及装法三步(edge://extensions→ 开发人员模式 →「加载解压缩的扩展」→ 选那个目录); - 扩展本体没变(同一份
manifest.json/src/icons,图标与桌面图标同源),
产物里不含test/(那是node --test的用例,不该进安装包)。
⚠️ 仍然需要"开发人员模式":Edge 可能提示"请停用开发人员模式扩展"。
要彻底去掉这一步只有上架商店(Edge Add-ons / Chrome Web Store)—— 那件事仍在待定
(设计案 P4:需要开发者账号、隐私政策与cookies权限用途说明,且以后每次更新都走审核)。
⚠️ 如果你此前是从仓库目录加载的扩展,改从安装目录加载后扩展 id 会变(id 由载入路径推出)
⇒ 需要在扩展设置里重贴一次配对 token(应用数据目录里的凭据不受影响,不用重新扫码/登录)。
🔧 维护者侧(不影响使用)
- 发货链补齐四条机器判据:NSIS 脚本里必须有
oname=extension\…的行、便携 zip 里必须有
DDtoolkit/extension/manifest.json、npm run tauri:build必须先跑stage:extension、
壳能解析出扩展目录(并且"空目录不算扩展"——判据是manifest.json在不在); - 发布脚本三处修补:打包前的一致性复核带上
build组(否则发布机上 preflight 与打包互相
打架、必停)、日志/回显里的 token 一律抹成***、缺更新签名私钥时开跑前就停
(原先要等 7 分钟构建跑完才报); collect:release只收本次版本的安装包(tauri build的产物目录不自清,上次的旧包曾被一起
收进dist-release/,verify 判"旧版本残留",发布停在最后一公里);- 顺带订正 README 与
docs/ops/PERF.md里已漂的测量值(版本表 1.0.2 → 1.1.x、
安装包 45 MB / 便携 53 MB、pytest 1233 / vitest 1076 /cargo test67)。
📦 资产
DDtoolkit_1.1.1_x64-setup.exe— Windows NSIS 安装包(用户级安装,含extension\)DDtoolkit-portable-win64.zip— 便携版(解压即用,含后端 onedir 与extension\)latest.json+ 安装包的.sig— 应用内更新的载体与清单(手工下载请用上面两项)
数据目录与 v1.1.0 相同:默认 %APPDATA%\com.ddtoolkit.app,也可以在「设置 → 关于」里迁移到其他盘。
⚠️ 升级说明
- 数据库无迁移(仍是 f009),覆盖安装即可;
- 使用须知按"声明版本"判断 —— 本版不会再让你确认一次(本版没有改声明正文);
- 装完这一版,安装目录里就会出现
extension\;扩展的装法与排查见那个目录里的README.md; - v1.1.0 的行为都保留:MSE 播放内核、抖音总开关默认关、通知中心、轻资产固化等。
🔧 技术栈
- 后端:Python 3.14 + FastAPI + SQLAlchemy 2.0 + SQLite(WAL) + APScheduler + Alembic(迁移链 f009)
- 前端:Vite + React 18 + TypeScript + Tailwind v4 + ECharts 6 + Radix
- 桌面壳:Tauri v2(托盘 + 拉起后端 + 注入空闲端口 + Job Object 进程看门狗)
- 浏览器扩展:MV3(纯 JS +
chrome.cookies,无构建步骤,随安装包/便携版一起分发)
⚖️ 许可
MIT License(见 LICENSE)。嵌入字体:阿里妈妈方圆体(官方许可免费商用 + 允许嵌入)。
抖音签名实现移植自 Douyin_TikTok_Download_API
(Apache-2.0:许可原文与上游 NOTICE 随仓库 app/services/platforms/vendor/dtksign/ 一起分发)。
v1.1.0
DDtoolkit v1.1.0
个人向 VTuber 帖子 / 账号证据归档工具 —— 定时抓取 B 站、微博、小红书与抖音的帖子与账号统计并归档到本地 SQLite,桌面端浏览与管理。
从 v1.0.2 到 v1.1.0 共 248 篇 devlog(119–373),主线是八件事:
① 两个新平台(小红书全链路;抖音端到端,合规总开关默认关、风险自担);
② 播放内核换成 MSE(B 站 DASH 双轨 + 清晰度 + 分P,拖动不再冻帧,地址过期自动重取);
③ 浏览器扩展(一键把四个平台的登录态同步进应用,含 HttpOnly 键与抖音 UA);
④ 使用须知闸门(首启 / 声明正文更新时读完点同意才进得去;应用版本升级不再打扰);
⑤ 通知中心(推送通道替代前端轮询 + 已读语义 + 调测页);
⑥ 界面重做一批(工具条、状态胶囊、数据视图牌堆……;档案视图本版暂时隐藏);
⑦ 轻资产(头像与封面固化到本地、缓存上限与淘汰、归档自动清理、历次头像账本);
⑧ 工程与安全(CI 落地、本机会话 token、HTML 净化、外链白名单、依赖只认锁文件)。
数据库迁移 f004 → f009(置顶动态 / 档案卡布局 / 事件图标 / 头像账本 / 轻资产索引),
首次启动会自动迁移,比以前多等一会儿。
🧾 使用须知闸门(本版所有用户都会被问一次)
启动时盖一层不可关闭的《DDToolkit 使用须知与免责声明》:读完滚到底、点「我已知悉并同意」
才进得去(不点只能退出应用;Esc、点窗外、✕ 都不生效)。
- 正文按开源软件的写法:MIT 开源、按「现状」提供;作者仅出于学习与研究目的分享,
不支持也未授权商业用途或违法用途;只用你自己合法持有的凭据;与第三方平台无任何关联;
抓取内容仅供个人留存,权利人可要求移除;使用风险与后果由你自行承担(十三节全文); - 确认口径是"声明版本",不是"应用版本":应用从 1.1.0 升到 1.2.0 不会再问;只有须知正文改了
(app/services/legal_notice.py的NOTICE_VERSION)才会再要求所有人确认一次; - 平时随时能在「设置 → 关于 → 用户协议」看全文、以及"你同意到哪一版、什么时候同意的";
「查看全文」是只读的 —— 能关、绝不写库(同意只发生在启动那道闸门); - 本版是第一次引入须知,所以所有人都会遇到这一次;之后只有新装的用户才会看到。
🆕 新平台:小红书 与 抖音
小红书:收录走 uid 主页复核、笔记详情(标题 / 正文 / 图片 / 视频 / 可打开的原始链接)、
签名器与字段映射、外链守卫(只有白名单域能跳系统浏览器)、cookie 录入与失效判定。
抖音:适配器 + 媒体链路端到端(收录 → 首屏落库 → 图片固化 → 详情页能看 → 视频能播),
签名在本地做(浏览器只负责"铸身份"),播放走应用内代理并带 Referer。
⚠️ 抖音合规总开关默认关:要在「设置 → 抓取设置 → 平台抓取」里打开才会发请求;
关着时界面如实说"未启用"而不是"需要登录"(这一条曾被误判成"抓不到数据",devlog/338);- 已知限制(诚实清单):小红书不做在线探活(回执标「未在线验证」);
抖音视频不固化到本地(每次回源取流);抖音签名需要 UA(浏览器扩展会一起同步)。
▶️ 播放:MSE 成为默认内核
- 边下边解、按需取段(默认内核;「设置 → 外观 → 视频播放」可退回渐进式;
取不到段表或宿主不支持时自动退,不会把播放器卡死); - B 站 DASH 音视频双轨 + 清晰度菜单(含会员清晰度徽标)+ 分P 菜单(以前只播第一 P);
- 拖动 seek 不再冻帧 —— 修掉一串只在真机复现的问题:段表把四舍五入的段长累加、
endOfStream之后 seek 失效、防打转计数器把音轨冻死、段表时刻比媒体tfdt偏晚几十毫秒、
同一段连取两次把一条轨永久冻死、缓冲末尾落在表内偏差容差里……(七次复现一次收敛,形状一致); - 按实测吞吐自动降一档(ABR),日志里给"实测 / 需要"两个数,链路喂得饱时一次都不报;
- 地址过期自动重取一次并换上新地址;重取撞上自己的令牌桶就排队等(最多 12 秒),
不假装失败也不空转刷请求; - 手感:按住
→250ms = 3× 快进(松手回原速)、短按仍是快进 5 秒;全屏控件、
hover 浮层、缓冲转圈、封面暂停键、播放意图与图标横跳都重排过; - 日志量收敛:httpx 的逐请求 INFO 关掉、播放诊断只留两行。
🧩 浏览器扩展(Edge / Chrome,MV3)
一键把四个平台已登录的 cookie 发给本机应用 —— 含 document.cookie 读不到的 HttpOnly 键
(SESSDATA / web_session),抖音的 UA 一起带过来,不用再"打开 DevTools 抄整条 cookie"。
- 只发
127.0.0.1;用配对 token 认领(应用「设置 → 登录 → 浏览器扩展」里复制,
持久化 —— 关掉应用再开不用重贴);端口在8765–8769自动探测;
cookie 只在内存里过一手就发走,chrome.storage.local里只有端口与 token; - 与"应用里已有那份"合并:同名以浏览器为准、已有键只增不删(浏览器铸不出的指纹键
由应用补上,回执会写清是哪个键补的); - 扩展图标与桌面图标同源(同一份 LOGO 生成,32/128 两档逐字节相同);
- 装法(一次性,详见
extension/README.md):edge://extensions→ 开发人员模式 →
「加载解压缩的扩展」→ 选本仓库extension/目录 → 在应用里复制配对 token 粘进扩展设置; - 诚实清单:popup 只能手工验(自动化的那半是
node --test extension/test/与
scripts/extension_smoke.py,popup 本身无头驱动不了);抖音只带 UA、不带sec-ch-ua;
cookie 过期仍要你点一下(不做后台自动同步);扩展 id 由载入路径推出、换机器会变。
🔔 通知中心:推送通道 + 已读
- 消息(开播边沿 / 任务进度 / 完成报告 / 第三方同步 / 风控冷却)改由后端推送通道送到界面
(text/event-stream,前端用fetch+ReadableStream读 —— token 不进 URL),轮询逐步退场; - 规则层分三组 + 倒计时;投递进度由推送"推着走";客户端事实也进面板(渠道收敛到一处);
- 已读语义收口:瞬时消息与服务端环形缓冲里的条目在"确实送达"之后真的删掉,
而不是只记一个已读位(drop_ring),同一个账号下次开播照样出现; - 面板交互重排(滑出同拍、逐条退场、分组标题常驻);另有
ui_probe --notice-lab与调测页。
🖼️ 轻资产:头像与封面固化到本地
- 头像:抓取时落盘 +
local_assets索引(稳定键 = 去掉签名参数的 URL)——
微博头像签名只有约 3 小时有效,固化后不再每轮回源;抓不到时用已存的那份兜底; - 封面:每轮固化一部分(默认 20 张上限,高级设置可调),只固化未归档帖,
归档后由自动清理回收; - 历次头像账本(哪次抓取换成了哪张图、本地文件还在不在)+ 多版本选择器;
- 设置里那一屏:按类型的读数 / 先预览再确认真删 / 长留标记(pin 过的一律不淘汰);
- 图片缓存仍有容量上限与"最久没用"淘汰。
🗂️ 界面
- 档案视图本版暂时隐藏(还没开发完,按你的要求先收起来):按钮不渲染,
深链接?view=profile与深休眠恢复也一起收敛;代码与数据(卡片布局表)保留,
把那个常量翻回true就能放出来; - 页面工具条变成按需浮片:向下滚让它让位、向上滚回来,换 V 时自动闪一次(告诉你它在那儿);
- 状态胶囊形变动效、顶栏光条(毛玻璃 / 选中块粉底 / 亮点指示器)、日期面板年份双箭头、
数据视图牌堆与圆点自动隐藏; - list / archive / card 视图左上角大标题的字色跟着底图明暗走;批量任务浮窗不再横向溢出;
- 键盘可达性:焦点环令牌化,摘掉"全局
outline-none"那类看不见焦点的写法。
🐛 真机实测抓出来的四个问题(都留了机器判据)
- 抖音「所有播放源都失败」 = 签名地址过期(
l=参数就是签名时刻)→ 现在自动重取一次;
重取撞上自己的限速就排队等(devlog/363/366); - 扩展"DevTools 里看得见、就是读不到" → 真凶是 host permission 的 scheme:
https://权限读不到非 Secure 的 cookie,而a1/s_v_web_id这些页面 JS 铸的指纹键
正好是非 Secure ⇒ 改成*://+ 裸域(三趟弯路记在extension/README.md); - 「点了同意进不去」 →
POST /settings/agreement少了Content-Type: application/json,
FastAPI 回 422,而错误提示把数组 detail 渲染成了[object Object]—— 两处都修了,
并补了"请求形状"用例(devlog/370); ui_probe --toolbar「向下滚工具条没让位」红了很久 → 尺子挑到了面板外面
(侧栏也有.os-scroll):产品无辜,探针修好后进了 A 档门禁(devlog/367)。
🔒 工程、安全与验证(维护者)
- CI 落地(GitHub Actions):Linux 上后端(
uv sync --frozen+ pytest + 文档漂移门禁)
与前端(tsc / eslint / vitest),Windows 上 Rust 单测 + sidecar 冒烟; - 安全:本机会话 token(壳生成 → 注入后端与前端,"开发态工具漏带 token"也一并堵上);
平台 HTML 白名单净化后才进详情;命令准入与外链白名单;启动红框改成可导出的问题报告;
数据目录迁移可回滚、旧目录全程不动,并给了安全删除入口;依赖只认锁文件; - 后端:平台适配层(
BasePlatform+ cursor 语义 + 四类失败语义 + 端点熔断 + 身份级限速)、
调度生命周期可停止、事务边界的五条失败路径、文件与 SQLite 并发面收敛、
消息由领域事件改走推送; - 前端:工具条显隐 / 筛选 / 分页 / 选定账号身份机 / 迁移编排都抽成了可注入的函数或 hook
(迁移编排带四条回滚判据:任何一步失败都回退到原目录); - 门禁:A 档 15 步(含 5 个 UI 探针模式与扩展冒烟);
scripts/release.py一键发布; - 实测:后端 1229 条 / 前端单测 1073 条(81 个文件)/ 桌面壳
cargo test64 条 /
扩展node --test25 条; - 一条踩过的坑记在这:
with TestClient(app, client=…) as c:会跑 lifespan,
把进程级"外部任务在跑"的状态泄漏给别的用例(8 条无关用例变红)——
现在按仓库约定用yield TestClient(app, client=("127.0.0.1", 51234))。
🚫 下线
- 桌面悬浮胶囊小窗整条线(含"原生 Rust 重建"的方案与代码):2026-10-03 由你拍板彻底放弃,
为什么放弃与当时的实测数据见devlog/274。
📦 资产
DDtoolkit_1.1.0_x64-setup.exe— Windows NSIS 安装包(用户级安装)DDtoolkit-portable-win64.zip— 便携版(解压即用,含后端 onedir)latest.json+ 安装包的.sig— 应用内更新的载体与清单(手工下载请用上面两项)
数据目录:安装版默认 %APPDATA%\com.ddtoolkit.app;设了 DDTOOLKIT_DATA_DIR 就用它
(便携/自定义安装),也可以在「设置 → 关于」里迁移到其他盘。
⚠️ 升级说明
- 数据库自动迁移 f004 → f009(置顶动态 / 档案卡布局 / 事件图标 / 头像账本 / 轻资产索引),
首次启动会多等一会儿;覆盖安装即可,不需要手工操作; - 本版第一次引入使用须知 ⇒ 所有人都会在启动时遇到那一次确认;之后只有声明正文更新
或新装才要确认; - 抖音默认关着:想抓抖音去「设置 → 抓取设置 → 平台抓取」打开(风险自担);
- 档案视图暂时隐藏(没开发完),按钮与深链接一起收起来了;
- 浏览器扩展要手工装一次(加载解压缩的扩展),装完在应用里复制配对 token;
- v1.0.2 的行为不变:关闭窗口 = 隐藏到系统托盘、深休眠释放界面内存、数据目录迁移、
应用内更新(签名校验 / 便携版不自动覆盖)。
🔧 技术栈
- 后端:Python 3.14 + FastAPI + SQLAlchemy 2.0 + SQLite(WAL) + APScheduler + Alembic(迁移链 f009)
- 前端:Vite + React 18 + TypeScript + Tailwind v4 + ECharts 6 + Radix
- 桌面壳:Tauri v2(托盘 + 拉起后端 + 注入空闲端口 + Job Object 进程看门狗)
- 浏览器扩展:MV3(纯 JS +
chrome.cookies,无构建步骤)
⚖️ 许可
MIT License(见 LICENSE)。嵌入字体:阿里妈妈方圆体(官方许可免费商用 + 允许嵌入)。
抖音签名实现移植自 Douyin_TikTok_Download_API
(Apache-2.0:许可原文与上游 NOTICE 随仓库 app/services/platforms/vendor/dtksign/ 一起分发)。
v1.0.2
DDtoolkit v1.0.2
个人向 VTuber 帖子 / 账号证据归档工具 —— 定时抓取 B 站与微博动态、账号统计并归档到本地 SQLite,桌面端浏览与管理。
从 v1.0.1 到 v1.0.2 共 34 篇 devlog(085–118),主线是五件事:
① 未登录也能用起来(检索 / 账号信息 / 粉丝数 / 直播状态 / 第三方历史可用,
内容抓取如实标注"需要登录");② 顶栏与设置窗口的重做(状态岛 + 两栏设置 +
主题偏好);③ 关闭窗口 = 隐藏到系统托盘(后台抓取照常、界面停止渲染与轮询);
④ 数据目录看得见、也搬得走(占用体检 + 图片缓存上限 + 库维护 + 一键迁移到别的盘);
⑤ 应用内更新(设置里检查 → 下载 → 重启安装,安装包带签名校验)。
另有若干界面打磨与一处功能下线(空闲语录轮播,等库中真有条目再上线)。
数据库无迁移(仍是 f004),覆盖安装即可。
🔓 未登录可用范围(不再"必须登录才能用")
实测澄清了一条长期口径:匿名也能拿到 B 站的签名密钥(nav 接口本身不要求登录),
所以下面这些未登录就能用:本地浏览与归档、候选检索、B 站检索与 uid 直查、
账号信息与粉丝数、直播状态、第三方历史(日历/弹幕索引)。
内容抓取(投稿 / 动态)与微博必须登录 —— 匿名请求会被平台按 IP 拦(-412),
所以应用改成未登录时不发这类请求,并在界面上只标不藏(功能照常可见,
点下去说明"需要登录",顶栏给一个「未登录 · N 项受限」的入口,说明窗先列"现在能做什么")。
✨ 顶栏:一个状态岛收编所有信息
原来顶栏是"三套并存"(轮询胶囊 + 瞬时消息覆写 + 完成报告弹窗),风控冷却只在日志里。现在统一成一个控件:
- 六类信息按优先级
告警 > 进行中 > 已完成 > 提示汇总:任务进度、第三方同步、
完成报告、登录失效、风控冷却(带剩余秒数,到点自动消失)、操作结果; - 完成报告不再自动弹窗 —— 变成通知里一条常驻条目,点「查看详情」才打开原来的对话框;
- 自动节拍不占顶栏(动态流轮询这类"没有终局"的任务不再刷顶栏),这条从散落判断
变成了具名规则 + 反向用例; - 面板是浮层(不挤动右栏),Esc 收起,条目可点。
⚙️ 设置:齿轮 → 两栏设置窗口
- IconRail 底端齿轮打开独立设置窗口(左分类 + 右内容):外观 / 抓取设置 / 数据源 / 关于;
- 抓取设置按用途分小组(风控与节流、开播信息抓取、定期动态轮询、每日定时任务、收录首屏),
只把关键项摆在明面上;调优类的收进页尾「高级设置(默认收起)」(19 项一个没少,只是不挡路); - 排版与控件也重做了一遍:字段名加粗放大、说明与行距拉开层次;数字项改成左减右加的整行
步进条(键盘照样能直接输入,到上下界箭头自动置灰);开关改成不带外框的浮动滑块
(与项目其它浮片按钮同一套质感); - 抓取参数改完下一轮生效、不用重启(账号间隔、风控冷却、开播状态刷新间隔、动态更新最快间隔、
账号信息刷新周期、收录首屏页数、第三方源开关…),每项都写明取值范围与生效时机,
越界会被后端拒绝并给出中文原因; - 「关于」页如实列出"哪些不能改、为什么"(数据目录、端口、迁移版本、日志等 ——
它们改了要重启,放进"可保存"的界面就是骗人); - 主题:浅色 / 跟随系统(立即生效)。深色主题尚未实现,界面照实说明,
不做一个"点了没反应"的开关。
📌 直播预约进日历
动态里的直播预约会落到直播日历:有预约的日子格子上出现「预约」徽章、时刻与标题
(有场次时压成一行小字),悬停浮层里单独列出预约条目与预约人数。
🖥️ 关闭窗口 = 隐藏到系统托盘(后台照抓)
- 点 ✕ 不再退出:窗口隐藏到系统托盘,后台抓取照常进行,界面停止刷新与轮询
(这就是"不用渲染前端"的实处); - 首次点 ✕ 会问一次(最小化到托盘 / 直接退出)+「记住我的选择」,之后按选择执行;
想改可以到「设置 → 外观 → 关闭窗口时」; - 隐藏 10 分钟后自动释放界面内存(销毁 WebView),唤回时自动恢复到你离开的位置与视图;
- 托盘:左键单击唤回,右键菜单「显示主界面 / 后台运行中 / 退出」;
- 再点一次程序图标 = 唤回已隐藏的窗口(不会开出第二个实例)。
- 后台照抓是刻意的:隐藏期间后端保持尽可能快的抓取节奏(不降频)——这是为后续
「把消息推送到其他平台」留的前提; - 托盘挂起时的资源占用也压过一轮:深休眠看门狗不再每秒唤醒(离 10 分钟还早时 30 秒看一眼),
分词词典不再开机预热(省约 56MB 常驻内存,代价是首次用词云多等约 0.7 秒)。
🗂️ 数据目录:看得见占用、也能搬到别的盘
- 「设置 → 关于」新增存储占用面板:数据库 / 图片缓存(带上限)/ 日志 / 合计 / 磁盘剩余,
可用空间偏紧时挂一枚「空间偏紧」徽章;手工留下的旧备份也会单独提示; - 两个当场能动手的按钮:「清理图片缓存」(全清,缓存可再生)·「整理数据库」
(回收 WAL + 把空闲页还给系统); - 图片缓存现在有容量上限(默认 300MB,按"最久没用"淘汰)——以前只管时间不管体积,
它是数据目录里涨得最快的一块; - 数据目录可以搬到其他盘:「关于 → 迁移到其他盘…」选个目录即可。迁移是可回滚的:
复制 → 逐文件校验 → 切换 → 用新目录启动后端并探活;任何一步失败都会自动回退到原目录,
而且旧目录全程不动(成功后由你决定要不要删)。迁移过程写在<数据目录>\logs\shell.log里; - 启动时的数据目录优先级:环境变量
DDTOOLKIT_DATA_DIR> 应用内迁移记录 > 默认位置。
用环境变量指定即视为"便携/自定义安装",此时不提供应用内迁移入口(整个文件夹搬走即可)。
🔄 应用内更新(不用再手动下载)
- 「设置 → 关于 → 应用更新」有**「检查更新」:会显示最新版本、更新说明,并支持
下载完直接重启安装;启动后也会静默检查一次**,发现新版本时顶栏给一条提示
(不会自动下载,更新与否由你决定); - 更新包有签名校验:签名不对的包不会被安装;
- 连不上 GitHub 时会给明确原因 + 「打开发布页」手动下载;如果检测到本机有代理在监听,
会自动改用该代理重试一次; - 便携版不自动覆盖:只提示有新版本并打开下载页,由你解压替换整个目录。
🐛 修掉两个实测问题(发布前由你实测发现)
- 选了「最小化到托盘」后,托盘右键「退出」退不掉 —— 根因是托盘退出只发了一个事件等
前端确认,而前端并没有监听它(深休眠唤醒后更收不到)。现在托盘退出不再依赖前端:
没任务在跑就直接退出(并清理后端子进程),只有真有抓取任务在跑时才唤回窗口让你确认
(退出=中断本轮 / 最小化到托盘=让它跑完)。 - 设置窗口的排版与文案 —— 选项胶囊不再被挤成竖排单字(说明一行、选项一整行);
文案里误写的 Markdown 标记(**粗体**)已清掉,并加了一条用例专门扫这类文案。
🎨 界面打磨
- 顶栏标题加粗;列表页筛选钮的文字真正居中且与左栏那枚样式统一;
- 展示页药丸的平台徽标「+」不 hover 时不占位(徽章紧贴下方分割线,hover 才展开);
- 设置窗口改版为左侧分类 + 右侧内容(导航由后端的参数分组自动生成)。
🔧 工程与验证(维护者)
- 一键发布
scripts/release.py:预检 → 版本号六处同步 → 门禁 → 构建 → 产物校验 →
提交/tag → 推送 → Release → 报告,失败即停、可续跑; - 常驻上游冒烟(含冷进程 + 空数据目录)、真实产物 fixtures、文档漂移门禁;
- UI 探针扩到 14 条(含"隐藏后是否真的停表""迁移入口只在桌面端出现"这类行为断言);
- 后端用例 461 条 / 前端单测 260 条 / 桌面壳
cargo test27 条。
📦 资产
DDtoolkit_1.0.2_x64-setup.exe— Windows NSIS 安装包(用户级安装)DDtoolkit-portable-win64.zip— 便携版(解压即用,含后端 onedir)DDtoolkit_1.0.2_x64-setup.nsis.zip+latest.json— 应用内更新的载体与清单
(签名已内嵌在latest.json里;手工下载请用上面两项)
数据目录:安装版默认 %APPDATA%\com.ddtoolkit.app;设了 DDTOOLKIT_DATA_DIR 就用它
(便携/自定义安装),也可以在「设置 → 关于」里迁移到其他盘。
可直接覆盖安装(后端目录层级自 v0.9.2 起已修正)。
⚠️ 升级说明
- 数据库无迁移:仍是 f004,首次启动不需要额外等待;
- 关闭窗口的行为变了:以前点 ✕ 是退出,现在默认问一次(可记住为"最小化到托盘")。
想让它恢复"直接退出",在设置 → 外观里改成「直接退出」即可;
托盘右键「退出」任何时候都能退出应用(有抓取任务在跑时会先问一句); - 空闲语录轮播暂时下线:顶栏空置时只显示「数据服务运行中」,不再轮换那几句占位语录
(等库中有真实条目——弹幕热词 / 名场面 / 倒计时——再接回来); - 内容抓取与微博仍需登录态;未登录时相关按钮会说明原因,而不是静默失败。
🔧 技术栈
- 后端: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)。字体:阿里妈妈方圆体(官方许可免费商用 + 允许嵌入)。
v1.0.1
DDtoolkit v1.0.1
个人向 VTuber 帖子 / 账号证据归档工具 —— 定时抓取 B 站与微博动态、账号统计并归档到本地 SQLite,桌面端浏览与管理。
从 v1.0.0 到 v1.0.1 共 2 个批次(devlog 083–084),两件事:
① 添加 V 不再受候选池名单限制 —— 可以直接从 B 站按 uid 或名称加人,
并在落地过程中修掉两个"点一下就报错"的真问题(都由用户实测发现);
② 发布链自动化 —— 打版/推送/建 Release 收敛成一条命令,产物形态有了机器判据。
数据库无迁移(仍是 f004),覆盖安装即可。
✨ 添加 V:候选池 + B 站直查双来源
原来只能从离线候选池(vtubers.csv 快照)里加人,池子里没有的新 V 就无从添加。现在:
- 本地候选即时匹配:候选池 + 弹幕站索引(
thirdparty_vtubers)两个来源合并去重,
输入即搜(不打上游),带粉丝数 / 企划 / 来源徽标; - B 站直查(显式触发):输入名字后回车或点「搜索 B 站」才请求 B 站 ——
纯数字≥5 位按 UID 精确查,其余按名称模糊搜索(每页 20 条,可加载更多,最多 3 页);
结果带粉丝数 / 认证说明 / 是否直播中 / 是否已订阅,点一行即收录; - 风控预算:0.8 秒串行间隔 + 每分钟 20 次上限 + 5 分钟结果缓存,
敲键不会消耗上游请求; - 已订阅的行置灰、上游失败原样显示原因(不是含糊的"没有这个人")。
池外收录的名称一律以服务端实查 B 站的结果为准,客户端传什么都不作数。
🐛 修掉两个真问题(都由实测发现,建议升级)
- 候选池里没有的新 V 点不动 —— 本地检索合并进来的"弹幕索引来源"条目被错误地
当成"候选池内条目"提交,后端查不到就报「候选池中不存在该 platform_uid」。
实测同一关键词的 37 条候选里有 19 条都是这种"点一下就红字"。
现在索引来源走池外通道(服务端实查后建库),索引里的非 B 站条目则明确置灰并说明原因。 - 未登录时的失败口径 —— B 站检索与 UID 直查都需要 WBI 签名密钥(该接口要求登录),
未登录时旧写法直接抛错(界面弹一段程序异常),池外收录还会把"你没登录"报成
"B 站没有这个 UID"。现在:未登录 → 明确提示"请先在顶栏登录 B 站";
"确实没这个人"是 404,"没问到"(未登录 / 网络 / 风控)是 503。
🔍 验证基建
- 新增 UI 探针
--add-v:断言"敲键只打本地检索、B 站请求为 0 次"(显式触发这条决策的
机器判据)、结果行可命中(看得见就点得着)、纯数字输入换成「按 UID 添加」、
来源→收录路径分流(索引来源绝不能走池内路径); - 顺手修掉两处"判据自己不可靠":① 顶栏断言把外部数据同步误判成"自动节拍占了顶栏"
(三档宽度一起假失败);② NSIS「后端目录被打平」的判据样本形状写错、正则永不命中 ——
现在有一条直接量真实installer.nsi的用例兜住它; - 用例:后端 362 条、前端 138 条。
🚀 发布链(维护者)
- 新增
scripts/release.py:一条命令跑完预检 → 版本号六处同步 → 门禁 →
整包构建 → 产物校验(资产大小 / 旧版本残留 / 安装包_internal层级 / 便携包结构 /
主程序版本号)→ 提交与 tag → 推送 → 建 Release 传资产 → 发布报告;
失败即停且不写文件,可按--from <步骤>续跑,--dry-run可预演; scripts/upload_release_assets.py改为幂等:Release 已存在则复用并覆盖描述,
同名同大小的资产跳过、变了的重传 —— 发布中途失败重跑不再撞 422 或落下半份资产。
📦 资产
DDtoolkit_1.0.1_x64-setup.exe— Windows NSIS 安装包(用户级安装)DDtoolkit-portable-win64.zip— 便携版(解压即用,含后端 onedir)
数据目录:安装版 %APPDATA%\com.ddtoolkit.app;便携版可设 DDTOOLKIT_DATA_DIR 自定义。
可直接覆盖安装(后端目录层级自 v0.9.2 起已修正)。
⚠️ 升级说明
- 数据库无迁移:仍是 f004,首次启动不需要额外等待;
- 添加 V 的 B 站直查需要 B 站登录态(WBI 签名密钥要求登录)—— 本应用为抓取动态
本来就需要扫码登录,所以正常情况下不受影响;未登录时界面会明确提示去登录; - 候选池(
vtubers.csv)仍是快照:本次给的是"绕过名单"的通道,
池子本身不会自动更新; - 微博取数同样需要登录态:未登录时其动态名单整条跳过,重新扫码后自动恢复。
🔧 技术栈
- 后端: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)。字体:阿里妈妈方圆体(官方许可免费商用 + 允许嵌入)。
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)。字体:阿里妈妈方圆体(官方许可免费商用 + 允许嵌入)。
v0.9.9
DDtoolkit v0.9.9
个人向 VTuber 帖子 / 账号证据归档工具 —— 定时抓取 B 站与微博动态、账号统计并归档到本地 SQLite,桌面端浏览与管理。
本版把 v0.9.4 → v0.9.9 六个批次的改进一次性放出:收录链路提速、动态流自适应节拍、
几处数据正确性修复(直播场次重复、投稿与投稿动态重复、增量漏帖),以及列表页筛选与
双月历区间选择器。同时清掉了一批「静默失败」隐患(调度线程可能整个停摆、旧库结构校验缺失)。
🐛 数据正确性(建议所有用户升级)
- 增量抓取漏帖 —— 平台会把置顶帖插在流首且可多条,打乱时间序;旧规则「遇到第一条已入库帖就停」会漏掉同页靠后的新帖(实测微博一次补回 29 条)。改为整页扫完才停 + 置顶帖豁免。
- 直播场次重复计 —— self 快照与 danmakus 同场被算作两场(实测 4/20 条)。合并判据由「起点相差 ≤90 分钟」改为区间重叠优先,并处理「两端都还没落 end」的开放式区间(跨 40 小时的伪场次)。
- 投稿与投稿动态重复 —— 实测 322 个 bvid 同时存在两条。合并为一条,动态附言写入新增的
posts.note(详情页以「UP 主附言」标注);历史数据由scripts/merge_video_dynamics.py归并(实测删重复 323 条、补附言 31 条)。 - 近期场次详情打不开内容 —— 合并后对外
live_id取的是 B 站数字 id,而弹幕接口只认 danmakus uuid(HTTP 400)。改为按源优先级定权(danmakus > feed > self),不再由入库顺序决定。 - 微博自动发帖单列 —— 会员升级 / 签到 / 推广这类平台自发的帖子归入新的
system类型,不再混进正文类型筛选。
⚡ 收录与抓取调度
- 收录新 V 大幅提速 —— 账号信息与首屏内容并发(原来串行),头像延后下载,去掉末尾 3~5 秒空转,WBI 密钥启动预热。实测账号信息可见 6.0s → 0.9s,首屏入库 0 → 33 条。
- 动态流自适应节拍 —— 由固定 15 分钟改为按平台速率预算(12 req·min⁻¹,轮间至少 30s ± 抖动),一轮接一轮跑;风控按平台单独冷却。实测 8 个主账号一轮 8 请求 / 33s,相邻轮 80s。
- 启动时补抓第三方数据 —— 启动后对每个 V 的主账号补一次粉丝历史与直播场次(<24h 跳过),直播日历与粉丝趋势不再等下一次每日批次。
- 抢锁失败不再丢任务 —— 收录/加账号时若手动任务在跑导致抢锁失败,改为入队,由综合档在锁空闲时补抓。
🎨 界面
- 列表页筛选收纳为单钮 —— 原先「搜索 + 时间 + 已删 + 已归档」四件并排,窄窗口下会把类型胶囊挤到换行;现在收敛为「搜索浮片 + 筛选 ▾」一个弹窗,内含状态 / 归档三态 / 时间范围三分区 + 重置。
- 时间筛选换双月历区间选择器 —— 左右月份面板各自翻月、区间连续色带、今天环+点、六个预设(含今天口径)、草稿制(点「确认」才生效)。
- 顶栏只显示"有起点有终点"的任务 —— 常态轮询(动态流、自动账号流)不再常驻顶栏,也不再把手动按钮禁掉(此前自动节拍期间按钮点不动,而后端其实是受理的)。
- 档案设置窗口 —— 背景 / 名称 / 企划 / 生日 / 出道日 / 设定 / 头像 / 签名 / 账号管理集中一处;新增字段锁定(手改的昵称·签名·头像不会被下次抓取覆盖)。
- card 视图平台徽章 —— 可点击打开账号主页、hover 尾部「+」快速加账号、长按拖动重排(顺序落库)。
🛡️ 稳定性
- 修掉一个会让抓取整体停摆的隐患 —— 动态流速率预算在「单平台主账号数 > 每分钟预算」且窗口为空时越界抛错,而抛出点没有任何兜底,会让整条调度线程死掉(动态流与账号流一起停,且界面看不出异常)。现已修正为等待一个窗口。当前 7 个主账号不会触发,但继续收录就会踩到。
- 旧库结构校验 —— 历史
create_all时代的库在补列后会直接标记为"已是最新",但唯一约束补不了(SQLite 限制)。若posts还停留在旧的全局唯一键,联合投稿会被拒并当作重复静默丢弃。现在启动前会校验,不一致就明确报错而不是写下一个假的"已最新"。 - 迁移链与 ORM 结构一致性用例 —— 两条建库路径(迁移 /
create_all)从此逐表比对,并顺手对齐了 5 处可空性差异。 - 布局探针加固 —— 「跑通了」不再等于「量到了」:量测段数不足、落到空置页、选择器踩空都会判失败(此前这些情况会静默打印"全部通过")。
📚 文档
- 架构 / 术语表 / 数据层 / 抓取链路四份文档对齐到现行实现(迁移链补 f001–f003、表与端点计数修正、动态流周期与增量停止规则的错误描述改正)。
docs/DEV-LOOP.md的探针断言表更新为八组不变量。
📦 资产
DDtoolkit_0.9.9_x64-setup.exe— Windows NSIS 安装包(用户级安装)DDtoolkit-portable-win64.zip— 便携版(解压即用,含后端 onedir)
数据目录:安装版 %APPDATA%\com.ddtoolkit.app;便携版可设 DDTOOLKIT_DATA_DIR 自定义。
升级建议:从 v0.9.3 可直接覆盖安装(后端目录层级自 v0.9.2 起已修正)。
🔧 技术栈
- 后端:Python 3.14 + FastAPI + SQLAlchemy 2.0 + SQLite(WAL) + APScheduler + Alembic(迁移链 f003)
- 前端:Vite + React 18 + TypeScript + Tailwind v4 + ECharts 6 + Radix
- 桌面壳:Tauri v2(拉起后端 + 注入空闲端口 + Job Object 进程看门狗)
⚖️ 许可
MIT License(见 LICENSE)。字体:阿里妈妈方圆体(官方许可免费商用 + 允许嵌入)。
v0.9.3
DDtoolkit v0.9.3
个人向 VTuber 帖子 / 账号证据归档工具 —— 定时抓取 B 站与微博动态、账号统计并归档到本地 SQLite,桌面端浏览与管理。
本版主线是抓取调度重构(更省请求、更快拿到数据)与一批长期存在的正确性修复
(解除订阅删不掉、列表卡片宽度乱跳、账号信息抓不到),并补齐了界面细节与工程文档。
🐛 关键修复
- 解除订阅一直失败 —— 账号之下 4 张子表(统计快照/直播场次/礼物日/分类校正)挂外键但 ORM 未级联,
foreign_keys=ON下DELETE FROM accounts被挡回、整次事务回滚(接口 500、V 删不掉)。改为统一的services/purge.py清理清单,两个删除端点共用;测试库同步开启外键校验,这类问题以后跑测试就会红。 - 收录新 V 后账号信息抓不到 —— 启动链自动档占着锁时,手动任务只能"抢锁失败→跳过"。新增「手动任务优先」协议:自动档起跑见手动即跳过、持锁见手动请求则在轮次断点交还锁并等其跑完再续跑(两把锁独立、按平台隔离)。
- 右栏帖子宽度不对(有的宽有的窄) —— 一条 CSS 规则因滚动组件插层而静默失效,列表列宽退化成"内容多宽就多宽"(短标题页缩到 566px、含长串的页被撑到 1350px 并裁掉封面)。改为后代选择器 + 正文
min-width:0+ 长串折行,并把「列表卡片列宽契约」写进 UI 探针(改回去立刻报错)。 - 添加平台账号后并不抓取 —— 前端提示"正在后台抓取"却要等下一轮定时档。现在加完账号立刻后台抓该 V 账号信息,并回填新账号的第三方历史。
- 只改图标不触发重建 —— Tauri 构建脚本未声明图标依赖,改图标后 cargo 认为"无事发生"。
build.rs补rerun-if-changed。
⚡ 抓取调度重构
- 三个定时档合并为一个「综合档」:动态流(每 V 主账号 1 页 + 限 2 帖,15 分钟)与账号流(全量账号信息)同档并发,墙钟 ≈ max(两条流) 而不是相加(实测 66s → 36s)。
- 账号信息改为数据驱动:不再每 5/15 分钟刷(账号字段变化慢),按
accounts.last_fetched_at判定,超过 24 小时才抓;启动时同样按此判断,重启/休眠后行为一致。 - 双粒度并发:任务级(动态流 ∥ 账号流)+ 平台级(bilibili ∥ weibo,平台内部串行)——单平台请求速率不变,某平台风控只冷却该平台。
- 外部数据批次排队而非跳过:T4 被手动任务挡下时等待其结束(最多 30 分钟)再执行,不再当天丢数据。
🎨 界面
- 顶栏状态行:浮片材质 + 深玫瑰徽章(A2 定稿),容器"只在有事时出现",字号 13px。
- 标题字体统一阿里妈妈方圆体(移除已删字体残留);滚动条粉色只属于指针悬停。
- 帖子详情抽屉单图去重、关闭钮补焦点环。
- 任务栏 LOGO 不再模糊:ICO 目录首项改为 48px 任务栏专用层,小尺寸(≤48px)用专用稿(
docs/design/svg/LOGO-small.svg),并按尺寸补偿描边。
📚 文档
- 新增
docs/GLOSSARY.md(术语表:名词 → 含义 → 代码路径 → 依赖,含"需求→代码入口"速查)与docs/ARCHITECTURE.md(运行时形态 / 9 表 ER / 抓取分层 / 数据来源地图)。 - 数据层与抓取文档全面对齐到 v0.9.x;
docs/目录整理(新增索引docs/README.md,发布说明归档docs/releases/)。
📦 资产
DDtoolkit_0.9.3_x64-setup.exe— Windows NSIS 安装包(用户级安装)DDtoolkit-portable-win64.zip— 便携版(解压即用,含后端 onedir)
数据目录:安装版 %APPDATA%\com.ddtoolkit.app;便携版可设 DDTOOLKIT_DATA_DIR 自定义。
⚠️ 从 v0.9.1 升级请先卸载旧版再安装(旧安装目录残留了被打平的后端文件);从 v0.9.2 起可直接覆盖安装。
🔧 技术栈
- 后端:Python 3.14 + FastAPI + SQLAlchemy 2.0 + SQLite(WAL) + APScheduler + Alembic(迁移链 e007)
- 前端:Vite + React 18 + TypeScript + Tailwind v4 + ECharts 6 + Radix
- 桌面壳:Tauri v2(拉起后端 + 注入空闲端口 + 进程看门狗)
⚖️ 许可
MIT License(见 LICENSE)。字体:思源黑体(Noto Sans SC,OFL 1.1)+ 阿里妈妈方圆体(官方许可免费商用+嵌入)。
v0.9.2
DDtoolkit v0.9.2
个人向 VTuber 帖子 / 账号证据归档工具 —— 定时抓取 B 站与微博动态、账号统计并归档到本地 SQLite,桌面端浏览与管理。
本版是 v0.9.1 的修复版:修掉了「直装版首次运行卡在启动幕」「B 站扫码登录确认后无反应」两个阻断级问题,并完成一轮界面反馈整改。
🐛 关键修复
- 直装版(NSIS)首次运行卡在启动幕 —— 安装包把后端 onedir 的
_internal/目录打平,exe 找不到 Python 运行时即静默退出。改为 Tauri 资源的数组形式(保留目录层级),安装包布局与新校验步骤写入发布手册。 - B 站扫码登录:手机确认后应用无反应 —— 轮询读的是响应外层
code(恒为 0),把「未扫码」误判成「已确认」→ 拿空回调地址 → 取不到凭据 →nav返回 -101。改读data.code(86101 未扫码 / 86090 待确认 / 0 已确认 / 86038 已失效),并补上回调 URL 查询串 + 重定向链 + cookie jar 三路凭据提取(含同名多域SESSDATA冲突)。 - 首启失败不再无声:启动幕显示等待秒数、
tauriBootstrap失败落错误态;后端 uvicorn 的 bind 失败等异常连 traceback 写入sidecar.log;首次运行的迁移日志不再被 alembic 的日志配置吞掉。 - 顶栏轮询链在开发态 StrictMode 双挂载下断裂(左栏直播徽标永不刷新)—— 轮询自愈。
🎨 界面
- 窗口右缘滚动条 / 宽度跳动 / 滚轮位移:展示页滚动层改用 OverlayScroll、文档层禁止滚动;直播日历与粉丝趋势卡片
min(870px, 100%)自适应(网格列宽改minmax(0,1fr));列表页工具行允许换行。 - 首次启动自动弹出登录浮窗,并明确说明「账号凭据仅保存在本机
.env,不上传任何服务器,也不接触账号密码」。 - 接入用户设计 LOGO(猫脸):顶栏 / 启动幕 / 站点图标 / 桌面端图标(含安装包、任务栏、多尺寸 ICO)。
- 视图定序:卡片 → 列表 → 档案 → 档案卡(四个同级视图);移除左栏与右栏光条中未接线的占位图标。
- 直播日历 / 粉丝趋势卡片标注数据来源(收录时自动回填 + 定时同步,无需手动触发)。
📦 资产
DDtoolkit_0.9.2_x64-setup.exe— Windows NSIS 安装包(用户级安装)DDtoolkit-portable-win64.zip— 便携版(解压即用,含后端 onedir)
数据目录:安装版 %APPDATA%\com.ddtoolkit.app;便携版可设 DDTOOLKIT_DATA_DIR 自定义。
⚠️ 从 v0.9.1 升级请先卸载旧版再安装(旧安装目录残留了被打平的后端文件)。
🔧 技术栈
- 后端:Python 3.14 + FastAPI + SQLAlchemy 2.0 + SQLite(WAL) + APScheduler + Alembic(迁移链 e007)
- 前端:Vite + React 18 + TypeScript + Tailwind v4 + ECharts 6 + Radix
- 桌面壳:Tauri v2(拉起后端 + 注入空闲端口 + Job Object 看门狗杀进程树)
⚖️ 许可
MIT License(见 LICENSE)。字体:思源黑体(Noto Sans SC,OFL 1.1)+ 阿里妈妈方圆体(官方许可免费商用+嵌入)。