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

7.0 KiB
Raw Blame History

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).