5.5 KiB
5.5 KiB
Remalt.com — better-auth авторег без капчи + разведка триалов (проверено 2026-10-08)
Репо с рабочим кодом: aaronjaworski710/remalt-autoreg (remalt_autoreg.py, trial_probe.py). Локально: C:/Users/User/tmp/remalt/.
Generic-паттерн: better-auth сайты (Next.js)
Remalt — эталонный пример стека Next.js + better-auth + Supabase. Паттерн переносим на любой better-auth сайт:
- Детект стека: скачать signup-страницу → собрать все
/_next/static/chunks/*.js→ grep чанков наsign-up/email,better-auth,supabase,/api/auth/. better-auth всегда exposes REST:POST /api/auth/sign-up/email {email, password, name},POST /api/auth/sign-in/email,GET /api/auth/get-session, verify черезGET /api/auth/verify-email?token=***. - Капчи обычно НЕТ: better-auth-регистрация проходит чистым curl/urllib (User-Agent Mozilla). Пробовать API-путь ПЕРЕД любым браузерным флоу.
- Session: sign-in возвращает cookie/token на ~30 дней; для последующих API-проб держать cookiejar.
Флоу Remalt (10 сек/акк, лимитов на IP не обнаружено)
- Voidash inbox:
POST https://api.voidash.com/api/v1/inboxes {"domain":"voidash.bond"}→ address + session_key (Bearer). Другие домены (eu.cc и т.п.) могут быть BLOCKED — voidash.bond рабочий. POST /api/auth/sign-up/email→ 200 + user id.- Poll
GET /api/v1/messages(Bearer session_key) ~5 сек до письма "Verify your email". - Verify-ссылку брать из поля
magic_linkполного сообщения (GET /api/v1/messages/{id}), НЕ regex'ом по html-телу: html экранирует&в query-параметрах → токен режется → verify 401. Fallback regex по `https:///api/auth/verify-email?token=*** только если magic_link пуст. GET magic_link→ 302 на главную = успех (302 не ошибка).POST /api/auth/sign-in/email→ session. Выход вaccounts.jsonl(email, password, user_id, session_token).
Разведка entitlements/гейтов нового акка
GET /api/stripe/subscription→storedCredits: 500,trialEligible: true, ноtokenBalance.locked: true— кредиты есть, но за paywall до оплаты.- Генерация (
/api/chat,/api/image/generate,/api/linkedin/generate-post) →REMALT_FULL_ACCESS_REQUIRED. Гейт-строку greпать в JS-чанках, чтобы отличать «нужен план» от «эндпоинта нет» (HTML404). /api/webpage/analyzeработает БЕЗ плана (мелкие URL) — халявная функция./api/healthоткрыт наружу: сливает supabase project id, build sha, статусы stripe/razorpay — всегда проверять/api/health,/health,/api/statusна любом Next.js таргете.
Триалы: маркетинг vs реальность
- Stripe «7-day free trial» — наебалово:
POST /api/stripe/checkout {"item":"starter"}→ checkout показывает $29 due today. Перед вбиванием карты ВСЕГДА читать сумму «due today» на странице чекаута (скрин + vision), а не верить лендингу. - Razorpay
starter_promo= настоящий месяц бесплатно (INR):POST /api/razorpay/order {"item":"starter_promo"}→ order сkey,subscriptionId,prefill. Оплата только черезcheckout.razorpay.com/v1/checkout.js(модаль), verify →POST /api/razorpay/verify. - Драйвер модали через camoufox на origin сайта (same-origin fetch для verify с cookies): инжектить checkout.js динамически и НЕ полагаться на
script.onloadв инжектированном контексте — поллитьtypeof Razorpay !== 'undefined'через setInterval, только потом конструировать实例 и.open(). Handler платежа → fetch/api/razorpay/verifyсcredentials:'include'. - Влад решает сам, вбивать ли карту в платный чекаут: при «триале», который сразу списывает деньги, — clarify (3 варианта: настоящий триал-путь / пробить платный / не вбивать). Он отверг Stripe $29, хотел именно триал.
Питфолы
- curl в MSYS
/tmpvs Windows-путь: файлы, скачанные curl'ом в/tmp, не видны Python-коду с Windows-путями и наоборот — все артефакты держать вC:/Users/User/AppData/Local/Tempили в project-дире, пути сверять. page.reload()сразу после evaluate-fetch sign-in может оборвать session-cookie flow — ждатьwait_for_load_stateв try/except, не reload вслепую.- В репо НЕ пушить card.json/accounts.jsonl (gitignore), скрипты читать секреты из локальных файлов рядом (
pathlib.Path(__file__).parent).