# Luban one-by-one stop-on-SMS runner and 2026-05-11 retest ## Why this was added BOSS asked to retry Luban SMS verification one order at a time: - buy only one active Luban order at once; - if `sms_received` occurs, notify immediately; - submit the code with the proven OpenAI phone-code `InputEvent` method; - if submission fails again, keep the OpenAI `phone-verification` page and do **not** release/navigate away/waste the number before manual retry. This produced a reusable runner: ```text scripts/luban_one_by_one_stop_on_sms.py ``` ## Runner behavior Run example: ```bash PYTHONUNBUFFERED=1 MAX_BUYS=10 PHONE_POLL_SECONDS=220 MIN_HOLD_SECONDS=180 \ /Users/chick/homebrew/opt/python@3.11/bin/python3.11 \ /Users/chick/.hermes/skills/software-development/codex-oauth-plus-onboarding/scripts/luban_one_by_one_stop_on_sms.py \ | tee /tmp/luban_one_by_one_stop_on_sms.log ``` Important behavior: 1. Resolves Luban OpenAI/ChatGPT services dynamically. 2. Prioritizes France first because a previous run received a France code. 3. Verifies OpenAI country gate before buying. 4. Holds failed/timeout/submit-no-SMS-page orders for at least `MIN_HOLD_SECONDS` before release. 5. Retries Luban `reject` when provider returns messages like `停用失败,该供应商需要在:N 秒 后停止`. 6. Stops immediately when a code is received. 7. Uses the corrected OpenAI code submit method: - `input[autocomplete="one-time-code"], input[name="code"], input` - native `HTMLInputElement.value` setter - `InputEvent('input', {inputType:'insertText', data:code})` - `change` - exact `继续` click first 8. If code submit does not leave `/phone-verification`, logs `sms_submit_failed_hold_for_retry` and stops without releasing or navigating. 9. Never prints full phone numbers or SMS code. Code is only written to `/tmp/luban_one_by_one_sms_code.txt`. ## 2026-05-11 run result Command used from `/tmp` copy: ```text MAX_BUYS=10 PHONE_POLL_SECONDS=220 MIN_HOLD_SECONDS=180 ``` Summary: ```json { "bought": 4, "direct_reject": 0, "sms_timeout": 2, "sms_received": 0, "sms_submit_failed": 0, "success": false, "submit_no_sms_page": 2 } ``` Orders: | Country | request_id | Result | Release | |---|---:|---|---| | France | 34133707 | `submit_no_sms_page`; stayed on `add-phone` without explicit reject | later confirmed `该号码已释放` | | Germany | 34133807 | reached `phone-verification`, page channel `whatsapp`, Luban `msg=wait` for ~220s | retry release success | | Netherlands | 34133909 | reached `phone-verification`, page channel `whatsapp`, Luban `msg=wait` for ~220s | release success | | Argentina | 34133959 | `submit_no_sms_page`; stayed on `add-phone` | release success | No SMS code arrived in this retest, so the corrected code-submit path was not exercised. ## Pitfalls learned - `submit_no_sms_page` is possible without explicit OpenAI rejection. Treat it as neither direct reject nor SMS-page no-delivery. Hold and release the order, then navigate/recover `add-phone` before continuing. - Some Luban suppliers require longer than exactly 180 seconds to reject. Parse the provider wait message and retry until success/known released, instead of only retrying once. - Repeated phone attempts can leave OpenAI `add-phone` in `糟糕,出错了!` state; do not buy another number until the page is reloaded/recovered and the country controls work. - `countryValue:null`/`countryText:null` after an error page means the selector is absent; this is a page-state failure, not a country unsupported result.