Files
codex-oauth-plus-onboarding…/skill/codex-oauth-plus-onboarding/references/luban-one-by-one-stop-on-sms-runner-2026-05-11.md
T

3.5 KiB

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:

scripts/luban_one_by_one_stop_on_sms.py

Runner behavior

Run example:

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:

MAX_BUYS=10 PHONE_POLL_SECONDS=220 MIN_HOLD_SECONDS=180

Summary:

{
  "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.