discord-auto-bot
Showcase用 Playwright 驅動瀏覽器自動執行 Discord 斜線指令,內建 Kelly 投注、股票訊號、Rich 終端與零依賴 Web 儀表板雙介面的長時運行 asyncio 機器人。
專案概述
以 Playwright 控制 Chromium、模擬使用者帳號自動執行 Discord 斜線指令的自動化機器人,以單一 asyncio event loop 並行協調 10 條排程 loop(整點/每日/賭博/轉帳/貓娘/股票/新聞/摘要/版本更新/除錯)。所有送指令動作共用一把 command_lock 序列化,並以「最新一則 ephemeral」錨點切片解析 Discord 累積式回應,解決多 loop 互相污染 parser 的核心難題。下注分析採半 Kelly + EV 95% 信賴區間下界(需 ≥200 筆樣本)做保守估計,並提供時段過濾、滾動視窗 EV、Trailing Stop 等可組合的風險管理策略。設定與歷史全存於 Fernet 加密的 SQLite,並同時提供 Rich 終端 UI 與純 Python stdlib(http.server)、零外部依賴的 Web 儀表板(HTTP Basic Auth + CSRF 防護)。
關鍵亮點
- 以單一 asyncio event loop 並行 10 條排程 loop,所有送指令動作共用 command_lock 序列化,並用 channel_context 在獨立頻道間切換,避免不同指令的回應互相污染解析。
- 解決 Discord ephemeral 訊息累積不替換的解析難題:用 rfind + anchor 切片只解析「最新一則 ephemeral」,並自寫 DOM walk 把 emoji 的 <img> alt 接回 textContent,否則 slot 符號會全空。
- 保守的 Kelly 投注:用 EV 95% 信賴區間下界 (ev − 1.96·SE) 取代點估計、半 Kelly + 0.25 上限、需 ≥200 筆樣本才啟用;並坦承負 EV 下任何策略只能降 variance/drawdown 而非翻正期望值。
- 工程化的可靠性與運維:loop 連續失敗自動 auto_paused 冷卻 30 分鐘、page 失敗 3 次觸發 exit 42 由 run.bat 自動重啟、session 過期偵測引導重登,並把 WARNING+ 推到獨立 Discord 頻道讓手機端遠端可見。
技術棧
挑戰與取捨
最大難點是 Discord Web 的回應解析:ephemeral 訊息累積在 page textContent 而非替換,emoji 又被渲染成不含 alt 的 <img>,導致多個排程 loop 的回應會互相污染。取捨上選擇「browser 自動化使用者帳號」而非官方 Bot API,換取存取一般 bot 拿不到的私服互動指令,代價是違反 Discord ToS、解析脆弱且需大量防禦性工程(command_lock 序列化、anchor 切片、自寫 DOM walk)。另一刻意取捨是 Web 儀表板堅持用純 stdlib http.server 零外部依賴,雖犧牲框架便利性,卻換來極簡部署與更小攻擊面(再自行補上 hmac.compare_digest 比對、CSRF 同源檢查、log redaction)。風險管理上也誠實面對數學現實——負 EV 的拉霸無法靠下注策略翻正,因此策略定位為降 variance/drawdown 而非「致勝法」;且 Discord modal 太脆弱,自動下單功能已移除且不會回歸。