# ChatGPT t-online.de Registration Pattern (2026-07-09) ## Working Flow 1. **Playwright opens chatgpt.com/signup** with real Chrome profile (CF cookies already present) 2. **`page.route("**/auth.openai.com/**", handler)`** intercepts all XHR to auth.openai.com 3. **Handler skips GET** (page navigations), proxies POST/PUT/PATCH through `curl_cffi(impersonate="chrome124")` 4. **Fill email** (t-online.de address), click submit 5. **IMAP poll** (`secureimap.t-online.de:993`) for OTP from last 10 minutes 6. **Fill OTP**, verify via proxied API call 7. **.de domains skip about-you** — response directly contains `continue_url` callback 8. **If about-you appears**: fill form via JS, click submit via Playwright `btn.click()` (NOT evaluate) 9. **Route handler captures callback URL** from `create_account` response 10. **Navigate to callback URL** → session established 11. **GET `chatgpt.com/api/auth/session`** → extract `accessToken` ## Key Details - **IMAP**: `secureimap.t-online.de:993`, login with full email + password - **Date filter**: Only accept emails < 600 seconds old (10 min window) - **Code extraction**: Last 6-digit code from body, check for "openai" OR "chatgpt" in body - **Button click**: `await btn.click()` (Playwright native), NOT `page.evaluate("btn.click()")` - **Callback capture**: Global variable set by route handler, consumed by main flow - **Session endpoint**: `https://chatgpt.com/api/auth/session` returns `{"accessToken": "eyJ..."}` - **Token format**: JWT, lives 1-30 days, ~40-80 requests/3h per account for GPT-4o ## Pitfalls - **Gmail aliases get rate-limited**: After ~20-30 registrations, OpenAI stops sending OTP to `user+alias@gmail.com`. Switch to t-online.de. - **Wrong code from old emails**: IMAP returns all emails to the address. Date filter is mandatory. - **`create_account` returns 400 `user_already_exists`**: Account already fully created. Try login flow instead. - **Cloudflare on API endpoints**: XHR/fetch calls from browser get 403. Must proxy through `curl_cffi`. - **`page.route()` intercepts navigations**: Always skip GET requests, only handle POST/PUT/PATCH. - **CSS color codes in HTML emails match `\b(\d{6})\b` regex**: OpenAI verification emails are HTML-only. The body contains CSS hex colors like `#202123` and `#353740` which are 6-digit numbers. The regex `\b(\d{6})\b` matches both the OTP code AND CSS colors. **Fix**: strip HTML tags (`re.sub(r'<[^>]+>', ' ', body)`) AND strip CSS hex colors (`re.sub(r'#[0-9a-fA-F]{6}', ' ', body)`) before extracting codes. Without this, the first extracted code is a CSS color, not the OTP. - **IMAP `SEARCH` requires `SELECT` first**: Calling `mail.search()` immediately after `mail.login()` without `mail.select("INBOX")` returns `command SEARCH illegal in state AUTH`. Always call `mail.select("INBOX")` before any search/fetch operations. - **Scanning all messages on empty `before_ids`**: When `get_current_ids` returns empty (first run, error), `wait_for_code` iterates through ALL messages in the inbox. For accounts with 1000+ emails, this takes 3+ minutes and never finds the code. **Fix**: limit to last 50 messages: `sorted(new_ids, key=int, reverse=True)[:50]`. - **`\b` in regex becomes backspace (0x08) in Python source files**: When writing regex patterns to Python files programmatically, `\b` in a regular string is interpreted as backspace (ASCII 0x08). The resulting file has `r'\x08(\d{6})\x08'` instead of `r'\b(\d{6})\b'`. **Fix**: use raw strings (`r'\b'`) in the source code, or use `bytes([0x5c, 0x62])` to write the literal `\b` bytes. Verify with `repr()` — `\b` should show as `\\b`, not `\x08`. - **Protocol registration skips about-you for .de domains**: t-online.de emails skip the about-you form entirely. The OTP verification response directly contains `continue_url` callback. This makes .de domains ~2x faster than Gmail for registration. - **`code=` redirect detection via page TITLE (2026-07-30)**: After OTP submission, OpenAI sometimes redirects via meta-refresh or JS navigation where the page TITLE changes to the target URL (e.g., `"Loading https://chatgpt.com/api/auth/callback/openai?code=ac..."`) while the browser URL STAYS on `email-verification`. The title check must include: ```python ("code=" in page_title and "chatgpt.com" in page_title) ``` Without this, the code thinks the page didn't change, tries clicking "Continue", and fails with "验证码页未找到 Continue 按钮". The `code=` token in the title means OTP was ACCEPTED and the redirect is happening — no button click needed. ## Email Sources - `C:\Users\User\Desktop\Downloads_backup_01.07.2026\working_mails_RECOVERED.txt` — 9767 t-online.de accounts - `C:\Users\User\Desktop\EzSolver\pateway_accounts_v9.txt` — 6 t-online.de accounts (may need IMAP enabled) - Format: `[REDACTED-EMAIL]:[REDACTED], one per line