Files
autoreg-skills-max/skills/ai-provider-autoreg/references/beatapi-email-signup-protocol.md

44 lines
7.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# BeatAPI (beatapi.io) — email signup protocol + SPA endpoint RE
Статус: GH OAuth = рабочая масс-рега (детали в MEMORY, тулкит-репа MinorPsychologist/beatapi-toolkit). Email-путь полностью реверснут, но упирается в supply живых whitelisted-ящиков — протокол ниже готов к запуску, как только появится пул.
## Email signup протокол (new-api форк, кастомный Better-Auth-подобный фронт)
- API base на ОТДЕЛЬНОМ хосте: `https://api.beatapi.io/api` — dashboard-эндпоинтов НЕТ под `/api/*` маркетингового домена beatapi.io (404). Не делать вывод «эндпоинта нет» по 404 на маркетинговом домене.
- Флоу:
1. `GET https://api.beatapi.io/api/verification?email=<email>&turnstile=` — ПУСТОЙ turnstile принимается (капча не нужна, браузер не нужен).
2. Код 6 цифр приходит на ящик (subject может отличаться от «Verification Code» — IMAP-поиск делать по ALL + фильтр по отправителю/времени).
3. `POST https://api.beatapi.io/api/user/register?turnstile=` body: `{username, password, display_name, email, verification_code, aff_code}`.
4. Дальше стандартный new-api: `POST /api/token/` (trailing slash ОБЯЗАТЕЛЕН, иначе 307) → `POST /api/token/{id}/key` = полный ключ (в списках маскирован); header `New-Api-User=<uid>`.
- Relay `/v1` требует браузерный User-Agent (Cloudflare 1010 на urllib UA).
## Гейты email-пути (проверено)
- **Alias-ограничение включено сервером**: gmail с точками/плюсами реджектится (`管理员已启用邮箱地址别名限制` — special symbols). Нужны полностью уникальные ящики, dot/plus-трюк мёртв.
- **Whitelist доменов**: gmail/163/qq/icloud/yahoo/foxmail. t-online, voidash, outlook — явный whitelist-реджект. Whitelist проверяется ДО SMTP, поэтому реджект-сообщение = валидный сигнал что эндпоинт жив.
- **Дневная SMTP-квота сервера**: на whitelisted-адреса приходит `550 You have reached your daily email sending quota` — лимит ГЛОБАЛЬНЫЙ (не per-IP), сброс раз в сутки. Не сжигать ящики в окно квоты; ретраить после полуночи UTC.
- **429 на /api/verification = per-IP rate limit** — пэйсинг проб 25-30с.
## Техника SPA endpoint discovery (переиспользуема для любых new-api/React форков)
1. Скачать HTML signup-страницы → собрать все `/assets/*.js`.
2. В main-бандле API-путей часто НЕТ — искать lazy-chunk'и с route-именами (`sign-up-*.js`) и качать их.
3. Grep chunk'ов на `verification|register|baseURL|fetch\(` — email-флоу BeatAPI лежал в `gateway-session-*.js` как объект `var le={async email...}` с template-путями `/verification?email=...&turnstile=` и `/user/register`.
4. Base URL искать в client-chunk'е (`gateway-client-*.js`, build-time константа типа VITE_GATEWAY_URL) — он может быть на другом хосте, чем сайт.
5. Проба кандидат-эндпоинта: whitelist-реджект или quota-550 в ответе = эндпоинт ЖИВ и форма параметров верна, даже когда конкретный ящик не подходит. 404 = неверный base/путь, не «эндпоинта нет».
## Supply-вывод
Мёртвые yahoo-комбо-пулы (миллионники) не годятся — IMAP liveness 0%. Реальный supply = локальный `gmail-account-creator` (`tmp/apiclaw_reg/gmail-account-creator`): создаёт свежий gmail БЕЗ SMS (phone-skip bypass). Хук BeatAPI (`beat_hook.py` → `run_beat(driver, email, password)`) встроен в конец create-флоу `account_creator.py` — тот же Selenium-драйвер, те же cookies; банк `accounts_email.jsonl`.
**Открытый блокер доставки**: verification возвращает `success:true`, но код НЕ доходит на свежий gmail — inbox полностью пуст 30+ мин (проверено и через `in:anywhere`-поиск, т.е. Spam тоже пуст). Перед масштабированием маршрута ОБЯЗАТЕЛЬНО проверить доставку на читаемый НЕзарегистрированный ящик; донор [REDACTED-NAME]@gmail.com уже занят на BeatAPI (`Email address is already in use` — этот ответ тоже валидный сигнал живости эндпоинта).
## Gmail web-login автоматизация (проверено)
- **Headless-логин в gmail для свежих акков → `accounts.google.com/v3/signin/rejected`** (Google блокирует автоматизированный браузер). Headed-режим (`GMAIL_HEADLESS=0`) логинится успешно. Signup при этом проходит и в headless — rejected бьёт именно по LOGIN.
- **Критерий успешного логина = в URL НЕТ `signin`/`ServiceLogin`/`rejected`**, а не «есть /mail/»: после верного пароля Google может высадить на маркетинговую `workspace.google.com/intl/.../gmail/` при живой auth-сессии. Проверка «'/mail/' in url» даёт ложный LOGIN FAILED.
- **v3 sign-in разметка**: `input[type="email"]` может отсутствовать. Рабочие fallback-селекторы по порядку: `#identifierId`, `input[name="identifier"]`, `input[type="text"]`; next-кнопки `#identifierNext` / `#passwordNext` / `button[type="submit"]`.
- **IMAP свежего gmail ненадёжен** (basic-auth мёртв, app-password требует 2SV). Читать код в той же браузерной сессии через basic-HTML `mail.google.com/mail/h/`; в полл-цикле чередовать inbox и поиск `?q=in:anywhere (...)` — `in:anywhere` покрывает Spam.
- **Баг birthday в gmail-account-creator**: `birthday_tuple` отдаёт day/month/year, а `fill_basic_info` ждёт month/day → month=22 → IndexError. Нормализовать: swap, если month∉1..12 и day∈1..12.
- Маскер patch-инструмента съедает `password=None` в def-сигнатуре хука → `password=***` (SyntaxError); ремонт через terminal-python конкатенацией + py_compile (см. safe-file-editing Pattern 8).