资讯动态

BiliTools 拆解:Tauri v2 如何把 B 站解析、下载与登录装进一个桌面应用

发布时间:2026/10/17 11:33:28 来源:尧图企业网站定制
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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑