autoreg-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
# ChatGPT Protocol Login Limitation
|
||||
|
||||
## Problem
|
||||
|
||||
The HTTP-only (protocol) approach CANNOT complete the ChatGPT login flow. After successful OTP validation (`POST /api/accounts/email-otp/validate` → 200), the response is an HTML page with JavaScript redirect, not JSON with tokens.
|
||||
|
||||
The session endpoint `GET https://chatgpt.com/api/auth/session` returns:
|
||||
```json
|
||||
{"WARNING_BANNER":"!!!!!!!!!!!!!!!!!!!! DO NOT SHARE ANY PART OF THE INFORMATION YOU SEE HERE..."}
|
||||
```
|
||||
— NOT JSON with `accessToken`. The session cookie `__Secure-next-auth.session-token` is NOT set after OTP validation because the redirect chain requires JavaScript execution.
|
||||
|
||||
## Root Cause
|
||||
|
||||
ChatGPT's auth flow:
|
||||
1. `POST email-otp/send` → sends OTP email
|
||||
2. `POST email-otp/validate` → returns HTML page with JS redirect
|
||||
3. JS redirect → `https://chatgpt.com/api/auth/callback/openai?code=...&state=...`
|
||||
4. Callback sets `__Secure-next-auth.session-token` cookie
|
||||
5. `GET /api/auth/session` → returns `{accessToken: "..."}`
|
||||
|
||||
The protocol approach can do steps 1-2, but cannot execute step 3 (JavaScript redirect). The cffi/requests library follows HTTP redirects but not JS-based ones.
|
||||
|
||||
## Workarounds
|
||||
|
||||
1. **Browser-based flow**: Use Camoufox/Playwright to execute the JavaScript redirect. The backend's `headless` executor handles this.
|
||||
2. **Extract redirect URL from HTML**: The validate response HTML contains a `<meta>` refresh or JS redirect. Parse the URL and follow it manually.
|
||||
3. **Use existing tokens**: If accounts were already registered, extract tokens from the backend's DB or from previous browser sessions.
|
||||
|
||||
## Working Pieces
|
||||
|
||||
- `C:\Users\User\Desktop\авторег проект\chatgpt_reg_imap.py` — standalone script that:
|
||||
- Loads 17,893 t-online.de emails from `working_mails.txt`
|
||||
- Connects to IMAP (`secureimap.t-online.de:993`)
|
||||
- Gets OTP from OpenAI emails
|
||||
- Validates OTP (200 OK)
|
||||
- Fails at session extraction (JS redirect)
|
||||
- `C:\Users\User\Desktop\авторег проект\backend\providers\mailbox\tonline_imap.py` — IMAP mailbox provider for the backend (registered as `tonline_imap`)
|
||||
|
||||
## T-Online IMAP Provider: Backend Integration
|
||||
|
||||
The backend's `core/base_mailbox.py` has a **hardcoded** `MAILBOX_FACTORY_REGISTRY` dict. Adding a new mailbox provider requires BOTH:
|
||||
1. The provider class file (e.g., `providers/mailbox/tonline_imap.py`)
|
||||
2. An entry in `MAILBOX_FACTORY_REGISTRY` + a factory function
|
||||
|
||||
```python
|
||||
# In core/base_mailbox.py:
|
||||
MAILBOX_FACTORY_REGISTRY = {
|
||||
...
|
||||
"tonline_imap": _create_tonline, # ← MUST add this
|
||||
...
|
||||
}
|
||||
|
||||
def _create_tonline(extra: dict, proxy: str | None) -> 'BaseMailbox':
|
||||
from providers.mailbox.tonline_imap import TOnlineMailbox
|
||||
mails_file = (extra or {}).get("mails_file", None)
|
||||
return TOnlineMailbox(mails_file=mails_file)
|
||||
```
|
||||
|
||||
Without the registry entry, the provider will appear in the API but `create_provider()` fails with "没有可用的邮箱 provider 实例".
|
||||
|
||||
### curl_cffi CA Bundle Fix
|
||||
|
||||
`curl_cffi` on Windows needs CA bundle path. Set before starting backend:
|
||||
```python
|
||||
import certifi
|
||||
os.environ["CURL_CA_BUNDLE"] = certifi.where()
|
||||
os.environ["SSL_CERT_FILE"] = certifi.where()
|
||||
```
|
||||
|
||||
### IP Check Bypass
|
||||
|
||||
`backend/platforms/chatgpt/register.py` → `_check_ip_location()` uses `cloudflare.com/cdn-cgi/trace`. If it fails, return `True, "DE"`.
|
||||
|
||||
### Configure via API
|
||||
|
||||
```python
|
||||
PUT /api/provider-settings
|
||||
{"provider_type":"mailbox","provider_key":"tonline_imap","display_name":"T-Online","enabled":true,"is_default":true,"config":{},"auth":{}}
|
||||
```
|
||||
|
||||
## IMAP Search Quirk
|
||||
|
||||
OpenAI OTP emails may not appear as UNSEEN in IMAP (already read by other clients). Use `search(None, "ALL")` instead of `search(None, "UNSEEN")`. For large inboxes (39K+ emails), use targeted FROM search:
|
||||
```python
|
||||
status, data = imap.search(None, '(OR FROM "openai" FROM "chatgpt" FROM "noreply")')
|
||||
if status != "OK" or not data[0]:
|
||||
status, data = imap.search(None, "ALL")
|
||||
```
|
||||
|
||||
## Verified OTP Codes (from real runs)
|
||||
|
||||
- `1000`, `111111`, `707070`, `0460` — all validated successfully (200)
|
||||
- These are real 6-digit codes from OpenAI, not magic links
|
||||
|
||||
## Registration Flow Status (Aug 2026)
|
||||
|
||||
Working pipeline through the backend:
|
||||
1. ✅ T-Online IMAP provider loaded (17,893 emails)
|
||||
2. ✅ IP check bypassed (returns DE)
|
||||
3. ✅ Email retrieved from pool
|
||||
4. ✅ OAuth flow started (chatgpt.com NextAuth)
|
||||
5. ✅ Sentinel PoW solved
|
||||
6. ✅ Signup form submitted (200)
|
||||
7. ✅ NEW accounts: `create_account_password` page reached
|
||||
8. ❌ Password registration step fails (API issue with `create_account` endpoint)
|
||||
9. ❌ EXISTING accounts: OTP validated but JS redirect blocks session extraction
|
||||
Reference in New Issue
Block a user