新世代 Beanfun 第三方啟動器
原版 Beanfun 啟動器 使用多年,但底層架構已經老舊 — .NET WinForms,不易維護也難以擴充。MapleLink 是從零開始的全新重寫,為長期維護而設計:
- Rust 後端 — 所有業務邏輯都在 Rust 中處理,包含 session 管理、OTP、帳號解析、DLL 注入、程序控制,沒有捷徑。
- Tauri v2 + WebView2 — 輕量原生殼層,執行檔體積小、記憶體佔用低、啟動速度快。
- React 19 + Tailwind — 簡潔現代的前端,完整的樣式自由度。
- Clean Architecture —
commands/→core/→services/→models/,功能增長時仍保持可維護性。 - 單一設定檔 — 一個
config.ini,HK / TW 通用。
- 登入方式:帳號密碼、TOTP、QR Code、GamePass、進階驗證
- 多帳號管理,依地區記住密碼
- 多 Session 同時登入 — 同一視窗內可同時登入多個帳號(支援跨地區)
- OTP 一鍵取得、自動貼入遊戲視窗
- 免登入啟動遊戲 — 登入頁面直接啟動,無需先登入帳號
- 完整支援 HK + TW 地區
- 深色 / 淺色 / 跟隨系統主題,三語介面(EN、繁中、简中)
- 自動更新 — 透過 GitHub Releases 檢查更新,自動偵測 GitHub 連線並 fallback 至鏡像加速(ghproxy.vip / ghproxy.net / ghfast.top)
- 下載進度條 — 顯示速度、百分比、下載方式,支援背景下載與稍後重啟
- 阻止遊戲自動更新 — 可選擇自動關閉 Patcher.exe
- 除錯主控台 — 即時查看 log,敏感資料自動遮蔽,支援篩選/搜尋/複製
- 相容遊戲加速器(UU 等)— 輸出檔名為 Beanfun.exe,SSL 容錯
- 透過 Locale Remulator 自動進行區域模擬啟動
系統需求: Windows 10 以上、WebView2 Runtime(Win11 已內建)
- 前往 Releases 下載最新版本
- 安裝後直接執行即可
%APPDATA%中的EBWebView資料夾是 WebView2 的快取,屬於正常現象。若不想保留 GamePass 的登入狀態,可在設定中開啟「GamePass 無痕模式」。
| 層級 | 技術 |
|---|---|
| 後端 | Rust + Tauri v2 |
| 前端 | React 19 + TypeScript |
| 樣式 | Tailwind CSS v4 |
| 狀態管理 | Zustand + TanStack Query |
| 區域模擬 | Locale Remulator |
架構設計
Rust 後端負責所有業務邏輯、副作用與資料管理;React/TypeScript 前端僅負責 UI 呈現與呼叫 Tauri commands。
- 所有邏輯都在 Rust — 驗證、認證、設定解析、DLL 注入、程序管理由後端統一處理,前端只負責畫面
- 分層架構 —
commands/→core/→services/→models/,依照 Clean Architecture 劃分職責 - 設定檔讀寫一致 — INI 設定檔寫入後再讀取,內容保持不變
- 憑證不落地 — Session token 與密碼只存在記憶體中,登出或關閉程式時立即清除
- DLL 注入前先驗證 — 注入 Locale_Remulator 前會以 SHA-256 比對已知雜湊值,確保檔案未被竄改
graph TB
subgraph 前端 ["前端(React 19 + TypeScript)"]
UI[UI 元件]
Zustand[Zustand 狀態管理]
TQ[TanStack Query]
Invoker[Tauri 型別化呼叫器]
end
subgraph 後端 ["後端(Rust / Tauri v2)"]
Commands[commands/ 指令層]
Core[core/ 核心邏輯]
Services[services/ 服務層]
Models[models/ 資料模型]
end
subgraph 外部 ["外部服務"]
Beanfun[Beanfun API]
FS[檔案系統]
Process[OS 程序]
Updater[GitHub Releases]
end
UI --> Zustand
UI --> TQ
TQ --> Invoker
Zustand --> Invoker
Invoker -->|IPC| Commands
Commands --> Core
Commands --> Services
Core --> Models
Services --> Models
Services --> Beanfun
Services --> FS
Services --> Process
Services --> Updater
sequenceDiagram
participant 前端 as 前端
participant 指令 as commands/
participant 核心 as core/
participant 服務 as services/
participant 外部 as 外部服務
前端->>指令: invoke("login", {account, password})
指令->>指令: 驗證並反序列化參數
指令->>核心: auth::authenticate(credentials)
核心->>服務: BeanfunService::login(credentials)
服務->>外部: HTTPS POST 至 Beanfun
外部-->>服務: 回應
服務-->>核心: Session | Error
核心-->>指令: Result<Session, AuthError>
指令->>指令: 轉換為可序列化回應
指令-->>前端: Ok(SessionDto) | Err(ErrorDto)
src-tauri/src/
├── commands/
│ ├── auth.rs # 登入、登出、QR、TOTP、GamePass、session 管理
│ ├── account.rs # 遊戲帳號、OTP 取得、帳號刷新
│ ├── launcher.rs # 啟動遊戲、免登入啟動、程序狀態
│ ├── config.rs # 設定讀寫、重設
│ ├── update.rs # 更新檢查、串流下載、重啟
│ └── system.rs # 檔案對話框、版本、日誌、彈出視窗
├── core/ # 純業務邏輯(auth、config parser、DLL injector、error)
├── services/ # 副作用封裝(HTTP、檔案 I/O、程序管理、更新、代理偵測)
├── models/ # DTO 與領域結構(含 SessionState 多 session 支援)
└── utils/ # 工具函式(SHA-256 等)
src/
├── features/
│ ├── login/ # 登入頁面(帳密、QR、TOTP、驗證)
│ ├── launcher/ # 主頁面(帳號列表、OTP、啟動)
│ ├── toolbox/ # 工具箱(設定、帳號管理、關於)
│ └── shared/ # 標題列、狀態列、錯誤提示
├── lib/ # Tauri invoker、i18n、Zustand stores、hooks
├── styles/ # Tailwind + CSS variables
└── locales/ # en-US / zh-TW / zh-CN
| 頁面 | 尺寸(邏輯像素) | 說明 |
|---|---|---|
| Login | 340 × 520 | 登入表單 |
| Main | 750 × 520 | 帳號列表、OTP、啟動按鈕 |
| Toolbox | 740 × 480 | 工具、設定、帳號管理、關於 |
npm install # 安裝前端相依套件
cargo tauri dev # 開發模式(熱重載)
cargo tauri build # 正式建置# Rust
cargo fmt --all --check # 格式檢查
cargo clippy --all-targets -- -D warnings # 靜態分析
cargo test # 單元測試 + 屬性測試
# TypeScript
npm run lint # ESLint 檢查
npx prettier --check "src/**/*.{ts,tsx,css,json}" # 格式檢查
npx tsc -b # 型別檢查
npm run format # Prettier 格式化
# Git commit 遵循 Conventional Commits
# feat: / fix: / refactor: / chore: ...Fork → 建立分支 → 測試 → 發送 PR。
靈感來自 pungin/Beanfun。
MIT