103 lines
3.5 KiB
Markdown
103 lines
3.5 KiB
Markdown
# OpenAI phone-code submit method audit: Luban France SMS received but submit failed (2026-05-11)
|
|
|
|
## Context
|
|
|
|
During Luban free-country testing with `chickliu2031som6d8@2925.com`, France request `34133204` received a code but the runner stayed on OpenAI `phone-verification` after submitting it.
|
|
|
|
Do not classify that event as a completed phone verification. The correct class is:
|
|
|
|
```text
|
|
sms_received_but_submit_failed
|
|
```
|
|
|
|
## DOM observed on OpenAI phone-verification
|
|
|
|
Inspection of the current OpenAI phone verification page showed a single code input, not six split inputs:
|
|
|
|
```json
|
|
{
|
|
"href": "https://auth.openai.com/phone-verification",
|
|
"title": "查看你的手机 - OpenAI",
|
|
"input": {
|
|
"type": "text",
|
|
"name": "code",
|
|
"autocomplete": "one-time-code",
|
|
"inputMode": "numeric",
|
|
"maxLength": 6,
|
|
"placeholder": "代码"
|
|
},
|
|
"buttons": ["继续", "重新发送 WhatsApp 消息"]
|
|
}
|
|
```
|
|
|
|
So the correct target is:
|
|
|
|
```javascript
|
|
input[autocomplete="one-time-code"], input[name="code"], input
|
|
```
|
|
|
|
## Difference from the previously successful 5sim Vietnam submit
|
|
|
|
The successful 5sim Vietnam part2 runner submitted the phone code with:
|
|
|
|
```javascript
|
|
const input=document.querySelector('input[autocomplete=one-time-code], input[name=code], input');
|
|
const setter=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,'value').set;
|
|
input.focus();
|
|
setter.call(input, code);
|
|
input.dispatchEvent(new InputEvent('input', {bubbles:true, inputType:'insertText', data:code}));
|
|
input.dispatchEvent(new Event('change', {bubbles:true}));
|
|
[...document.querySelectorAll('button')].find(b=>(b.innerText||'').trim()==='继续')?.click();
|
|
```
|
|
|
|
The Luban free-country runner used a generic `setVal` helper with plain `Event('input')` instead of `InputEvent('input', {inputType:'insertText', data:code})`:
|
|
|
|
```javascript
|
|
setVal(inputs[0], code); // dispatches Event('input') + Event('change')
|
|
```
|
|
|
|
That may fail to update OpenAI's React/form state even when the DOM value looks set.
|
|
|
|
## Required fix
|
|
|
|
For phone-code submission, use the proven 5sim method exactly:
|
|
|
|
1. Select `input[autocomplete="one-time-code"], input[name="code"], input`.
|
|
2. Use the native HTMLInputElement `value` setter.
|
|
3. Dispatch `InputEvent('input', {bubbles:true, inputType:'insertText', data:code})`.
|
|
4. Dispatch `change`.
|
|
5. Verify `input.value.length === 6` and the Continue button is not disabled.
|
|
6. Click the exact Chinese `继续` button first, then fallback to English/regex.
|
|
7. Save a redacted submit context: input count/name/autocomplete/maxLength, button disabled state, post-submit href/title/body excerpt. Never log the code.
|
|
|
|
A reusable helper is packaged with this skill:
|
|
|
|
```text
|
|
scripts/submit_openai_phone_code_corrected.py
|
|
```
|
|
|
|
It accepts a code or code-file path, submits using the proven method, and redacts the code from output.
|
|
|
|
## Extra channel warning
|
|
|
|
The current phone verification page displayed:
|
|
|
|
```text
|
|
输入我们刚刚通过 WhatsApp 发送到 ... 的验证码。
|
|
重新发送 WhatsApp 消息
|
|
```
|
|
|
|
The runner must record the delivery channel text. If the page channel is WhatsApp but the SMS provider reports an SMS-style code, treat failures as ambiguous until the raw provider fields are inspected. Do not auto-mark as success unless OpenAI leaves `/phone-verification`.
|
|
|
|
## Runner classification fix
|
|
|
|
After `sms_received`, if submitting the code leaves OpenAI on `/phone-verification`, classify as:
|
|
|
|
```text
|
|
sms_submit_failed
|
|
```
|
|
|
|
not `success_request_id`.
|
|
|
|
Also release/finish the provider order explicitly according to provider rules and log the result.
|