Skip to content

feat: 閒置斷線自動重登 + 登入頻率限制(60 秒) - #25

Open
PttCodingMan wants to merge 1 commit into
mainfrom
feat/auto-relogin-throttle
Open

PttCodingMan wants to merge 1 commit into
mainfrom
feat/auto-relogin-throttle

Conversation

@PttCodingMan

Copy link
Copy Markdown
Member

問題

放太久會被 PTT 斷線,之後的呼叫失敗,agent 會反覆呼叫 login();但登入太頻繁又會被 PTT 擋下。

做法

讓 server 自己處理斷線與登入頻率,不靠 agent 判斷何時登出。

  • 登入頻率限制(_activate):同一帳號 60 秒內只允許一次登入嘗試(失敗也算)。超過時不連 PTT,直接回 {"code": "LOGIN_THROTTLED", "retry_after": N}。連線活著時 login() 本來就不重登,不受影響。
  • 閒置自動重登(新增 _ensure_alive,由 _call_ptt_service 在每次呼叫前執行):距上次呼叫超過 60 秒時,先用 get_time 探測,斷線才重登(同樣受頻率限制)。
    • 採「先探測再呼叫」而非「失敗後重試」,避免發文、推文、轉帳等寫入操作重複送出。
    • 從未登入或主動登出後不自動登入,仍回 NOT_LOGGED_IN。
  • logout 已持有 _pool_lock,呼叫時跳過探測以免死結。
  • login / logout docstring 提示 agent:不需做完事就登出、不要反覆 login、遇到 LOGIN_THROTTLED 依 retry_after 等待。

兩個門檻是 api_ptt.py 開頭的 LOGIN_MIN_INTERVAL、IDLE_PROBE_SECONDS。

測試

  • 新增 src/test_auto_relogin.py:頻率限制、失敗也計入、活著不重登、閒置後自動重登、剛用過不探測、重登被擋時不送出原操作、登出後不自動登入。
  • test_switch_to_dead_relogs 會在同一瞬間重登,改為把上次登入時間往前推 60 秒以避開新限制。
  • pytest src:27 passed;mypy . 通過。皆以假 Service 測試,尚未對真實 PTT 驗證。

🤖 Generated with Claude Code

https://claude.ai/code/session_011od43ZvAoaP413L1eYeWSD


Generated by Claude Code

- 同一帳號 60 秒內只允許一次登入嘗試(失敗也算),超過回 LOGIN_THROTTLED + retry_after
- 閒置超過 60 秒的下一次呼叫前先用 get_time 探測,斷線才重登;先探測再呼叫,避免寫入操作重試重複送出
- 主動登出或從未登入時不自動登入
- login/logout docstring 提示 agent 不需做完事就登出、不要反覆 login

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011od43ZvAoaP413L1eYeWSD
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants