69 lines
7.1 KiB
Markdown
69 lines
7.1 KiB
Markdown
# GPT Pool Gateway поверх any-auto-register (сессия 2026-09-21)
|
||
|
||
## Что построено
|
||
|
||
Связка из двух сервисов на машине Влада:
|
||
|
||
| Компонент | Порт | Назначение |
|
||
|---|---|---|
|
||
| any-auto-register (lxf746, 3.3K⭐, AGPL) | :8100 | авторег ChatGPT/Cursor/Grok/Kiro/Windsurf/Trae + React-дашборд (собран: frontend → ../static, npm build EXIT=0) |
|
||
| GPT Pool Gateway (свой, `gateway_pool/gpt_gateway.py`, ~460 строк) | :8200 | OpenAI-compatible API (`/v1/chat/completions`, `/v1/images/generations`) поверх пула access_token'ов + свой мини-дашборд |
|
||
|
||
Проект: `C:/Users/User/Desktop/any-auto-register/` (клон через codeload zip — git clone не работает, git-remote-https отсутствует; gh token мёртв 401 → fork не удался).
|
||
|
||
## any-auto-register: ключевые факты
|
||
|
||
- БД: `account_manager.db` (SQLite/SQLModel). Таблицы: `accounts` (platform,email,password,user_id), `account_credentials` (account_id,key,value — здесь `access_token`/`refresh_token`/`id_token`/`session_token`/`workspace_id`), `account_overviews`, `tasks`, `proxies`, `provider_settings`.
|
||
- Роуты под префиксом `/api`: `/api/health`, `/api/accounts`, `/api/platforms`, `/api/stats`, `/api/tasks`, `/api/sms`, `/api/proxies`. Фронтенд монтируется из `static/` (vite outDir `../static`).
|
||
- ChatGPT-платформа: `platforms/chatgpt/` — protocol register (чистый HTTP, NextAuth OAuth flow), `token_refresh.py` (TokenRefreshManager: refresh по session_token ИЛИ по refresh_token, endpoint `https://auth.openai.com/oauth/token`), `constants.py` (OAUTH_CLIENT_ID).
|
||
- Captcha: YesCaptcha/2Captcha/локальный Camoufox solver (:8889). На машине уже был баланс YesCaptcha 10084.
|
||
- Email-провайдеры: MoeMail (cloudflare_temp_email self-host), TempMail.lol, DDG Email, Outlook и др. — настраиваются в дашборде «全局配置» (provider catalog driven, CRUD).
|
||
- Запуск: `.venv/Scripts/python.exe -m uvicorn main:app --port 8100` с `env -u PYTHONPATH`. Deps: fastapi uvicorn sqlmodel curl_cffi requests pydantic jwcrypto cbor2 aiofiles httpx (+rich quart apscheduler python-dotenv).
|
||
- Пустой пул — норма после свежего клона: 6 аккаунтов в БД были от ДРУГОГО проекта (gitlab), platform != chatgpt.
|
||
|
||
## GPT Pool Gateway — протокол ChatGPT web (полный рецепт)
|
||
|
||
Порядок вызовов на каждый запрос (curl_cffi Session impersonate="chrome120"):
|
||
|
||
1. **Requirements + PoW:**
|
||
`GET https://chatgpt.com/backend-api/sentinel/chat-requirements`
|
||
headers: `Authorization: Bearer <access_token>`, `openai-sentinel-chat-requirements: true`, `oai-device-id: <uuid4>`, `oai-language: en-US`, Origin/Referer chatgpt.com.
|
||
Ответ: `{token, proofofwork:{seed, difficulty}}`.
|
||
PoW: sha3-512, лексикографическое сравнение hex-префикса с difficulty (формат answer `gAAAAABw` + hex(i) + sha; итерации до 25с).
|
||
|
||
2. **Conversation (SSE):**
|
||
`POST https://chatgpt.com/backend-api/conversation`
|
||
headers: + `openai-sentinel-chat-token: <req_token>`, `openai-sentinel-proof-token: <pow>`, `Accept: text/event-stream`.
|
||
Payload: `{"action":"next","messages":[{id,author:{role},content:{content_type:"text",parts:[...]}}],"parent_message_id":<uuid4>,"model":"gpt-4o","history_and_training_disabled":true,"conversation_mode":{"kind":"primary_assistant"},"websocket_request_id":<uuid4>, ...}`.
|
||
Парсинг SSE: `data: {...}` строки, брать `type=="message"` где `metadata.message_type in (next,continue)` и `author.role=="assistant"`, текст = `content.parts[-1]`; стоп по `metadata.finish_details.type in (stop,end_turn)` или `data: [DONE]`.
|
||
|
||
3. **Images:**
|
||
`POST https://chatgpt.com/backend-api/generate_images`
|
||
headers: только Bearer+UA+Origin (sentinel-токены НЕ нужны).
|
||
Payload: `{"prompt":..., "model":"gpt-image-1"|"dall-e-3", "history":"none", "return_format":"url", "size":"1024x1024", "n":1..4, "transparent_background":"false"}`.
|
||
Ответ: `{"images":[urls]}`. Для `response_format:"b64_json"` — докачать каждый url и b64-encode.
|
||
|
||
## Пул токенов
|
||
|
||
- Загрузка: SQLite `accounts WHERE platform='chatgpt'` JOIN `account_credentials` (key=access_token/refresh_token) + `gateway_pool/tokens.txt` (по JWT на строку, фильтр len>100).
|
||
- Ротация round-robin по alive; 401/403 → попытка refresh через `platforms.chatgpt.token_refresh.TokenRefreshManager` (импорт с PYTHONPATH=корень AAR), не вышло → fail_count, ≥2 → изоляция (alive=False).
|
||
- Ручной импорт: `POST /pool/tokens {"tokens":[...]}` (пишет и в tokens.txt), `POST /pool/reload` — перечитать БД.
|
||
- Дашборд `GET /` — single-file HTML (GitHub-dark, карточки pool/alive/dead/requests/errors/refreshes + таблица токенов, авто-refresh 5с, textarea для вставки JWT).
|
||
|
||
## Auth-ключ гейтвея
|
||
|
||
`GATEWAY_API_KEY` env, дефолт в коде. **Pitfall:** write_file маскирует строку `os.getenv("GATEWAY_API_KEY", ...)` → SyntaxError. Фикс: py_compile сразу после записи; починка строки через `bytes.fromhex("6f732e676574656e7628...").decode()` в execute_code (детали: python-hermes-windows-pitfalls §9).
|
||
|
||
## Статус на конец сессии
|
||
|
||
- Всё поднято, selfcheck: models 200 (10 моделей), chat/images с пустым пулом → честный 502 `no_tokens`, оба дашборда 200.
|
||
- **Единственный блокер: пул пуст** — старые токены REVOKED (см. pitfall 13 token_revoked). Наполнение: (1) авторег через AAR-дашборд (YesCaptcha есть, нужен mail-провайдер+прокси), (2) ручной вставку живых access_token в :8200, (3) оба.
|
||
- Старый chatgpt2api-pro (:5005) не запускался, data/token.txt = 45 байт мусора.
|
||
|
||
## Pitfalls сессии
|
||
|
||
- `terminal` gвард ложно блокирует `pip install ... uvicorn` как «long-lived server» — pip-установки гонять через execute_code subprocess.
|
||
- Убитый дубль AAR-сервера (orphan PID с прошлой сессии на :8100) → bind error 10048 у нового инстанса, НО первый инстанс жил и отвечал. Перед запуском: `netstat -ano | grep :PORT | grep LISTENING` + `powershell Stop-Process`, проверять count=0.
|
||
- `tasklist //FI` из git-bash не работает — только psutil или PowerShell (см. python-hermes-windows-pitfalls §6).
|
||
- ensurepip системы Python311 сломан (нет bundled setuptools whl) → venv без pip → get-pip.py bootstrap (§8 того же скилла).
|