NKUST 自動點名系統
逆向學校點名平台的登入流程,用純 HTTP 取代瀏覽器自動化。Next.js 前端 + FastAPI 後端,正式上線。
- 期間
- 2025 –
- 角色
- 獨立開發
- 技術
- Next.jsTypeScriptFastAPIPythonGitHub ActionsCloudflare
- 連結
- 線上網站 ↗GitHub ↗

問題
學校點名要掃教室 QR code、登入、送出,每堂課重複一次。第一版用 Playwright 開真實瀏覽器模擬,慢、吃資源、部署麻煩。
架構
Next.js 前端(帳號只存 localStorage,不上傳)
│ REST
▼
FastAPI 後端
│ 純 HTTP requests
▼
學校點名平台:GET 登入頁 → 解析 form 與 login_key
→ 本地重現前端的 MD5 + DES 加密
→ POST 登入 → follow Refresh header → 解析結果
我做了什麼
- 逆向登入流程:讀前端 JS,把密碼加密邏輯(MD5 取前四碼拼 login_key 做 DES key,Base64 輸出)在 Python 重現,整個流程不需要瀏覽器
- Zuvio GPS 點名:指定教室座標即時簽到,或自動監控點名開放
- 多帳號與分享:帳號別名、可加密的分享連結,支援 AirDrop / LINE / QR code
- 上線:CI 跑測試與建置,前後端各自部署在 chunweidev.com 子網域
Trade-off
- 純 requests 取代 Playwright:從幾秒降到幾百毫秒,後端從要裝瀏覽器的容器變成一個輕量 Python 服務。代價是學校改前端加密邏輯就要重新逆向,所以把加密步驟獨立成一個函式並加測試
- 帳號只存瀏覽器 localStorage:伺服器不保存任何人的學校密碼。方便性換成使用者自己負責備份,用分享連結補這個缺口
- 後端跑在 serverless 還是常駐:見 ADR 0002(FastAPI + Mangum 上 Lambda)的取捨