梁鈞瑋
← Projects

NKUST 自動點名系統

逆向學校點名平台的登入流程,用純 HTTP 取代瀏覽器自動化。Next.js 前端 + FastAPI 後端,正式上線。

期間
2025 –
角色
獨立開發
技術
Next.jsTypeScriptFastAPIPythonGitHub ActionsCloudflare
連結
線上網站 ↗GitHub ↗
NKUST 自動點名的主畫面:QR 點名與 Zuvio GPS 點名兩種模式,帳號只存在瀏覽器
NKUST 自動點名的主畫面:QR 點名與 Zuvio GPS 點名兩種模式,帳號只存在瀏覽器

問題

學校點名要掃教室 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)的取捨