BiliTools 拆解:Tauri v2 如何把 B 站解析、下载与登录装进一个桌面应用
BiliTools 拆解Tauri v2 如何把 B 站解析、下载与登录装进一个桌面应用【免费下载链接】BiliTools本项目已停止维护。项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliToolsBiliTools 是一个基于 Tauri v2 的哔哩哔哩资源下载桌面工具箱覆盖视频、音乐、弹幕、字幕等资源的解析与本地落盘。下文沿源码主线拆解它的前后端分工、队列调度、WBI 签名与登录态刷新读完你可以逐条对照 src/ 与 src-tauri/src/ 验证。架构速览前端发请求Rust 只管文件和进程BiliTools 的分工与常见 Tauri 项目恰好相反所有 B 站 API 请求都在前端 WebView 里发出Rust 后端不碰业务接口只负责 Cookie 持久化、文件 IO 和三个侧车进程sidecar的拉起。原因是 WBI 签名与风控指纹依赖canvas、WebGL 等浏览器能力见 src/services/auth.ts 的getWebGLFingerPrint这些在 Rust 侧无法复现。层技术职责前端Vue 3 TypeScriptsrc/媒体解析、WBI 签名、登录、下载队列编排后端Rust Tauri 2.9.5src-tauri/src/Cargo.toml版本 1.4.7Cookie/配置/任务持久化SQLite、进程管理侧车aria2c / ffmpeg / DanmakuFactory下载、合流与转封装、弹幕 XML→ASS持久化sqlx sea-query SQLite配置、Cookie、队列、调度器三个侧车二进制按平台放在 src-tauri/binaries/路径解析与用户自定义覆盖逻辑在 src-tauri/src/storage/config.rs 的SettingsSidecar。WBI 签名与风控每个带 wbi 的接口都过了同一道关前端统一走 src/services/utils.ts 的tryFetch发起请求auth: wbi时调用 src/services/auth.ts 的wbi从/x/web-interface/nav取wbi_img的img_key/sub_key按内置 64 值排列表重排取前 32 位生成mixinKey再对参数外加wts时间戳与dm_img_str等指纹字段做 MD5 得到w_rid。播放地址、弹幕分段、观看历史等接口均带此签名。风控回退内嵌在同一循环里接口返回code -352时tryFetch用v_voucher调/x/gaia-vgate/v1/register领取极验验证通过后取grisk_id作为gaia_vtoken重试最多三次。指纹侧则在后端 src-tauri/src/services/login.rsget_uuid生成infoc结尾的_uuidget_buvid抓取 buvid3/4get_bili_ticket用 HMAC-SHA256 对时间戳签名后换取票据前端 src/services/login.ts 的activateCookies再把这些指纹打包 POST 到/x/internal/gaia-gateway/ExClimbWuzhi。下载队列backlog 到 complete 的四段式状态机提交任务时前端 src/services/queue.ts 的submit把勾选项拆成子任务selectToSubTasksvideo/audio/audioVideo/nfo/danmaku/subtitles 等processQueue再调planScheduler把整个 backlog 打包成一个 Scheduler进入后端manager.rs的backlog → pending → doing → complete队列。src-tauri/src/services/queue/scheduler.rs 的dispatch里每个任务先拿信号量许可并发数取配置max_conc默认 3才置为 Active完成或失败后统一回写前端事件与 SQLiteschedulers::update_state。单个任务执行时Rust 侧handle_tasksrc-tauri/src/services/queue/handlers.rs并不自己解析 B 站接口而是通过frontend::request把PrepareTask、GetFilename、GetDanmaku等动作反向抛给前端由前端的handleTask应答——这是前端做业务、后端做落盘分工最直接的体现。暂停/取消则由 src-tauri/src/services/queue/runtime.rs 的CtrlHandlebroadcast 事件 CancellationToken在各子任务间广播取消时统一执行注册的 cleaner 清理 aria2 任务与临时目录。侧车生命周期aria2c 跑在随机端口上ffmpeg 收尾aria2c 的启动在 src-tauri/src/services/aria2c.rs 的init先 bind 一个127.0.0.1:0拿到空闲端口配 8 位随机 token 以--enable-rpc --rpc-secret拉起侧车并固定--refererhttps://www.bilibili.com/与Origin头绕过防盗链--input-file/--save-session指向数据目录下的aria2.session每 5 秒落盘实现重启续传限速来自配置的speed_limit--max-download-limit。下载主循环用addUri提交gid 即子任务 id按秒轮询tellStatuspause/unpause/forceRemove对应界面暂停、恢复与取消。下载完成后进入后处理handle_media把音视频分别下完handle_merge调 src-tauri/src/services/ffmpeg.rs 的merge用-c copy -shortest无重编码合流mp4 附加faststartpost_media再按开关执行convert_mp3、convert_mp4与add_metaeac3跳过元数据。扩展名由get_ext按音质 id 决定30250 是eac330251/30252 是flac合流则映射到mkv/mp4。衍生资源弹幕分段、SRT、NFO 与 AI 摘要弹幕src/services/media/extras.ts 的getDanmaku按Math.ceil(duration/360)把时长切成 6 分钟段循环请求/x/v2/dm/wbi/web/seg.so并逐段解析二进制事件为 XMLDanmakuEventToXML段间随机 100–500ms 延时直播弹幕走history/seg.so单次请求。后端handle_danmaku检查convert.danmaku开关默认开启开启则把 XML 喂给 DanmakuFactory 侧车转 ASS关闭则直接存.xml。字幕getSubtitle从/x/player/wbi/v2取字幕列表按所选语言下载 JSON 体并重排为from -- to时间轴落盘为{filename}.{lang}.srt。NFOgetNfo按媒体类型生成movie/episodedetails/tvshow三种 XML写入标题、简介、演职员、标签、premiered及bili:aid/bvid/cid/epid/ssid自定义字段季度模式同时抓取poster.jpgplot字段会优先嵌入 AI 摘要内容。AI 摘要getAISummary调/x/web-interface/view/conclusion/get把 B 站 AI 助手的model_result组装成带时间锚点的 Markdown 落盘失败返回 -1 时该子任务跳过。三种登录方式与登录态自动刷新扫码src/services/login.ts 的genQrcode调/x/passport-login/web/qrcode/generate并在 canvas 上渲染 160×160 二维码scanLogin通过 TauriChannel把后端 src-tauri/src/services/login.rs 中每秒一次的qrcode/poll结果推回前端code 0时写入 Cookie 与refresh_token。密码先取/x/passport-login/web/key的 RSA 公钥前端用 JSEncrypt 加密hash 密码连同极验三件套challenge/validate/seccode交给后端pwd_login提交/x/passport-login/web/login。短信sendSmsCode先过极验拿captcha_key后端sms_login完成/web/login/sms提交。刷新链路最值得一看checkRefresh发现/x/passport-login/web/cookie/info的refresh标志为真后用correspondPathauth.tsRSA-OAEP 加密refresh_{timestamp}拼出/correspond/1/{hex}页面DOMParser 提取refresh_csrf再由后端refresh_cookie依次调用/cookie/refresh与/confirm/refresh换发新 Cookie。命中风控时switch_cookiesource: risk负责用风控页返回的 code 换回登录态。数据落盘位置与各平台目录WORKING_PATH取 Tauri 的app_data_dir应用 id 为com.btjawa.bilitools见 tauri.conf.jsonsrc-tauri/src/shared.rs 在其下挂Storage子目录放 SQLitearia2.session、DanmakuFactory.json与 aria2 日志同在该目录内。平台数据目录Windows%AppData%\com.btjawa.bilitoolsmacOS$HOME/Library/Application Support/com.btjawa.bilitoolsLinux$HOME/.local/share/com.btjawa.bilitools边界与合规[!IMPORTANT] BiliTools 仅面向 B 站大陆站不支持 bilibili.tvVIP/付费内容需对应订阅账号才能访问工具不绕过鉴权。项目按 README 声明在1.4.0发布后进入稳定期、暂停更新当前仓库版本 1.4.7 处于稳定维护状态。[!IMPORTANT] 项目以 GPL-3.0-or-later 开源再分发必须保持开源、沿用同一许可证并保留全部版权信息仅限学习与测试用途不得用于盗版或未授权再分发后果由使用者自行承担。哔哩哔哩/Bilibili为上海幻电商标项目与其无隶属或授权关系。最短上手路径安装与使用教程见 docs/guide/install.md 与 docs/guide/download.md想改代码先读 CONTRIBUTING.md问题反馈走仓库 Issue 并在提交时附足复现信息。【免费下载链接】BiliTools本项目已停止维护。项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

如何快速上手A.X-K2-Raon-Speech-21B-A3B:从零加载到生成第一句语音的10分钟入门指南

如何快速上手A.X-K2-Raon-Speech-21B-A3B:从零加载到生成第一句语音的10分钟入门指南

人工智能大模型语音音频多模态 【免费下载链接】A.X-K2-Raon-Speech-21B-A3B 项目地址: https://ai.gitcode.com/hf_mirrors/KRAFTON/A.X-K2-Raon-Speech-21B-A3B 点击查看 免费下载 A.X-K2-Raon-Speech-21B-A3B 是 KRAFTON AI 开源的双语(英文/韩文&am…

2026/10/17 11:33:28 阅读更多 →
Argon架构解析:面向毫秒级SLA的AI服务三层解耦设计

Argon架构解析:面向毫秒级SLA的AI服务三层解耦设计

1. 项目概述:这不是一次简单的模型调用,而是一次系统级工程重构“Google 用 Gemini 4 Argon 构建案例”——这个标题乍看像一则新闻简报,但作为在AI基础设施一线摸爬滚打十多年的从业者,我第一反应是:这根本不是在讲“…

2026/10/17 11:32:28 阅读更多 →
n8n集成Gemini 4 Argon与MCP协议构建真Agent工作流

n8n集成Gemini 4 Argon与MCP协议构建真Agent工作流

1. 这不是“又一个AI工作流”,而是n8n生态里首次真正打通MCP协议的Gemini原生集成 我第一次在某跨平台自动化实验室看到这个标题时,下意识点开想确认是不是标题党——毕竟过去两年里,“用XX模型接入n8n”这类文章我至少扫过四十多篇&#xff…

2026/10/17 11:32:28 阅读更多 →

最新新闻

2025人工智能指数报告解读:从趋势数据到工程决策

2025人工智能指数报告解读:从趋势数据到工程决策

简介:这份2025年人工智能指数报告由斯坦福大学人类中心人工智能研究所发布,是第八版AI指数报告,旨在为政策制定者、研究人员、企业高管、记者及公众提供关于全球AI发展态势的权威数据参考。压缩包内为1个PDF文件,大小29.46MB&…

2026/10/17 13:29:34 阅读更多 →
C++扫雷实战:三层架构与状态机驱动的游戏开发

C++扫雷实战:三层架构与状态机驱动的游戏开发

1. 这不是教科书里的扫雷,是能真正跑起来、改得动、看得懂的C实战项目“C小游戏——扫雷”,这八个字在初学编程的圈子里,几乎和“Hello World”一样自带入门仪式感。但现实很骨感:翻遍网上教程,90%的代码要么是阉割版—…

2026/10/17 13:29:34 阅读更多 →
用PIXI引擎复刻经典坦克大战:从瓦片地图到完整战斗系统的HTML5游戏开发实践

用PIXI引擎复刻经典坦克大战:从瓦片地图到完整战斗系统的HTML5游戏开发实践

从PIXI引擎搭建到完整玩法,这里记录了把经典坦克射击游戏搬到HTML5的完整过程。没有华丽的包装,只有一步步可执行的思路和能直接用的代码。1. 项目拆解:从游戏玩法到技术清单1.1 经典坦克大战的核心玩法元素先抛开代码,想想坦克大…

2026/10/17 13:29:34 阅读更多 →
基于栈式自编码器的以图搜图实战:CIFAR-10特征提取与检索

基于栈式自编码器的以图搜图实战:CIFAR-10特征提取与检索

1. 从“以图搜图”说起:为什么选栈式自编码器这条路以图搜图这件事,听起来像是大厂才玩得转的东西,但真动手做一遍就会发现,核心逻辑其实很朴素:把图片变成一串有意义的数字向量,然后比谁跟谁更像。问题在于…

2026/10/17 13:29:34 阅读更多 →
CosineAnnealingWarmRestarts 学习率调度器原理与实战指南

CosineAnnealingWarmRestarts 学习率调度器原理与实战指南

去年我在做一个图像分类项目时,模型结构、数据增强、优化器都调了个遍,训练曲线始终在一个不高不低的位置徘徊。后来把一个不起眼的学习率调度器换成了torch.optim.lr_scheduler.CosineAnnealingWarmRestarts,收敛速度和最终精度都有了肉眼可…

2026/10/17 13:29:34 阅读更多 →
packet-pro 详解:Java 可编程数据包捕获与解析框架

packet-pro 详解:Java 可编程数据包捕获与解析框架

简介:packet-pro 是一份面向 Java 与网络数据面开发者的 DPDK 数据包处理框架源码包,适合学习高性能收包、多线程处理及 DPDK 与 Java 互操作的读者。压缩包共 1910 个文件、44.17MB,以 c/h 原生代码、java 业务与框架代码、makefile 构建脚本…

2026/10/17 13:28:34 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →