Skip to content

Releases: Mrslippe/DDToolkit

v1.3.0

Choose a tag to compare

@Mrslippe Mrslippe released this 14 Oct 15:57

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

Choose a tag to compare

@Mrslippe Mrslippe released this 07 Oct 17:56

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

Choose a tag to compare

@Mrslippe Mrslippe released this 06 Oct 08:07

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 test 67)。

📦 资产

  • 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

Choose a tag to compare

@Mrslippe Mrslippe released this 06 Oct 07:00

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"那类看不见焦点的写法。

🐛 真机实测抓出来的四个问题(都留了机器判据)

  1. 抖音「所有播放源都失败」 = 签名地址过期(l= 参数就是签名时刻)→ 现在自动重取一次;
    重取撞上自己的限速就排队等(devlog/363 / 366);
  2. 扩展"DevTools 里看得见、就是读不到" → 真凶是 host permission 的 scheme:
    https:// 权限读不到非 Secure 的 cookie,而 a1 / s_v_web_id 这些页面 JS 铸的指纹键
    正好是非 Secure ⇒ 改成 *:// + 裸域(三趟弯路记在 extension/README.md);
  3. 「点了同意进不去」 → POST /settings/agreement 少了 Content-Type: application/json,
    FastAPI 回 422,而错误提示把数组 detail 渲染成了 [object Object] —— 两处都修了,
    并补了"请求形状"用例(devlog/370);
  4. 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 test 64 条 /
    扩展 node --test 25 条;
  • 一条踩过的坑记在这: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

Choose a tag to compare

@Mrslippe Mrslippe released this 16 Sep 12:27

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 test 27 条。

📦 资产

  • 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

Choose a tag to compare

@Mrslippe Mrslippe released this 15 Sep 09:51

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

Choose a tag to compare

@Mrslippe Mrslippe released this 14 Sep 05:03

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

Choose a tag to compare

@Mrslippe Mrslippe released this 13 Sep 05:33

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

Choose a tag to compare

@Mrslippe Mrslippe released this 08 Sep 18:52

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

Choose a tag to compare

@Mrslippe Mrslippe released this 08 Sep 15:00

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)+ 阿里妈妈方圆体(官方许可免费商用+嵌入)。