feat(tixcraft): add ticket_price_auto_select mode for multi-price rows#320
feat(tixcraft): add ticket_price_auto_select mode for multi-price rows#320pengumina wants to merge 1 commit into
Conversation
When an area has multiple ticket-price rows (e.g. "全票+福利兌換券 6,880"
vs "全票 6,800") and no area keyword matches, the bot previously stalled
and reloaded forever. Adds a deterministic fallback with 6 modes:
from top/bottom, center, random, high/low price first. Independent of
area_auto_fallback — ticket-page user has already committed to an area.
Also fixes a latent captcha pre-check bug exposed by the new picker:
querySelector('.mobile-select') only saw the FIRST row, so when the
picker filled the second row, pre-check thought qty was unset and reset
the first row too → 2× qty → "您共選擇了 N 張" alert. Three captcha
sites now use querySelectorAll.
PR Review 報告PR #320 — 總結評語這是一個設計思路清晰的功能 PR,解決了拓元訂購頁因多票價並列導致機器人卡住的真實問題。程式碼結構乾淨、helper function 切分合理、設定遷移完整、UI 說明文案詳盡。整體品質明顯高於一般 contributor PR 的水準。 但有 兩個需要確認或修正的問題,以及若干建議事項,請作者在合併前確認。 功能設計分析6 種模式的合理性6 種模式設計合理,涵蓋位置導向(
價格解析的健壯性
需留意以下邊界案例:
重要問題問題一(討論點):
|
| 優先序 | 類別 | 建議 |
|---|---|---|
| 必須確認 | 行為變更 | area_auto_fallback=false 嚴格模式移除是否刻意,是否需要 CHANGELOG 告知 |
| 必修 | 程式碼 | 移除 area_auto_fallback 死變數賦值 |
| 建議 | 可觀測性 | 在 price fallback 分支補 debug log |
| 建議 | 設定 | 說明 ticket_price_auto_select.mode 預設值為何不跟隨 CONST_SELECT_ORDER_DEFAULT |
| 建議(後續) | 測試 | 依 testing.md 規範,_parse_ticket_price 是純函式,適合在 tests/unit/test_tixcraft_price.py 加入單元測試,至少涵蓋 FAQ 中的三個範例與 fallback 案例 |
潛在 Edge Case 彙整
- 任意票種無數字時 fallback 無 log(上文已述)
- 小數點票價:
1,200.50→ regex 取 50(錯誤);實際影響低,但若未來拓元格式調整則靜默出錯 - 票種名稱含尾部備注數字:如
6,800/限量100張→ 取 100(錯誤票價) - 票種名稱為空字串時:
_parse_ticket_price("")直接回傳None,觸發 DOM 順序 fallback,行為正確 - 全部票種均無數字時:每一個都觸發
return valid_ticket_types[0],最終取第一個票種,行為合理,但無 log
結語
感謝 @pengumina 提交這個功能。這個 PR 補上了拓元多票價場景下的一個真實缺口,程式碼品質整體令人滿意,help-content 的 FAQ 撰寫尤為用心。主要請確認 area_auto_fallback 嚴格模式移除的設計意圖,以及清理死變數,其餘修改建議可視情況採納。期待後續的更新!
|
@pengumina 感謝提供PR,評估後暫時不合併 |
變更摘要
拓元當「同一區域包含多個票價」時(例如 VIP 區分成「全票 6,800」與「全票+福利兌換券 6,880」),機器人會因為關鍵字未匹配而停擺。
設定頁新增「票種排序方式」下拉(位於「區域自動遞補」下方,僅 tixcraft 家族顯示),6 種模式:
from top to bottom(預設)/from bottom to top/center/randomhigh price first/low price first— 解析票種名稱最後一段數字作為價格獨立於
area_auto_fallback(訂購頁的用戶已經提交區域選擇,停擺不該是選項)。變更類型
影響平台
檢查清單
.py檔案中沒有使用 emoji相關 Issue
Closes #309
Related to #38 — 本 PR 解決「選哪個票種」的部分;#38 另外提到的「每個票種各買幾張」不在本 PR 範圍。