#!/usr/bin/env python3 """ LobeHub Self-Hosted Mass Auto-Registration Target: http://[REDACTED-IP]:3210 (Better Auth) Strategy: 49 reforrm.me users × 5 subaddresses (+001..+005) = 245 accounts Rate-limit: 3 registers per batch, 30s cooldown Output: lobehub_new_accounts.json """ import requests import json import time import sys import os from datetime import datetime SERVER = "http://[REDACTED-IP]:3210" REGISTER_URL = f"{SERVER}/api/auth/sign-up/email" LOGIN_URL = f"{SERVER}/api/auth/sign-in/email" # Load reforrm.me users reform_users_path = r"C:\Users\User\Desktop\reforrm_workspace_users.txt" users = [] with open(reform_users_path) as f: for line in f: line = line.strip() if "@reforrm.me" in line and "ACTIVE" in line: email = line.split("@reforrm.me")[0].strip() + "@reforrm.me" users.append(email) print(f"[INFO] Loaded {len(users)} active reforrm.me users") # Generate subaddresses: user+001@reforrm.me, user+002@reforrm.me, etc. SUBADDR_COUNT = 5 # 49 * 5 = 245 BATCH_SIZE = 3 BATCH_DELAY = 30 # seconds between batches ERROR_DELAY = 5 PASSWORD = "[REDACTED]" NAME_PREFIX = "LhUser" all_accounts = [] existing = len(users) * SUBADDR_COUNT for i, user in enumerate(users): base_email = user.split("@")[0] domain = "reforrm.me" for sub in range(1, SUBADDR_COUNT + 1): email = f"{base_email}+{sub:03d}@{domain}" name = f"{NAME_PREFIX}{i*SUBADDR_COUNT + sub}" batch_num = (len(all_accounts)) // BATCH_SIZE + 1 try: print(f"[{len(all_accounts)+1}/{existing}] Registering {email} ...", end=" ") sys.stdout.flush() r = requests.post( REGISTER_URL, json={"email": email, "password": PASSWORD, "name": name}, headers={"Content-Type": "application/json"}, timeout=15 ) if r.status_code == 200: data = r.json() token = [REDACTED]"token", "") user_id = data.get("user", {}).get("id", "") print(f"OK token={token[:12]}... user_id={user_id}") all_accounts.append({ "email": email, "password": PASSWORD, "token": token, "user_id": user_id, "name": name, "configured": False, "created_at": datetime.now().isoformat() }) elif r.status_code == 429: print(f"RATE-LIMITED (429) — long wait 60s") time.sleep(60) r = requests.post(REGISTER_URL, json={"email": email, "password": PASSWORD, "name": name}, headers={"Content-Type": "application/json"}, timeout=15) if r.status_code == 200: data = r.json() token = [REDACTED]"token", "") user_id = data.get("user", {}).get("id", "") print(f"OK (retry) token={token[:12]}...") all_accounts.append({ "email": email, "password": PASSWORD, "token": token, "user_id": user_id, "name": name, "configured": False, "created_at": datetime.now().isoformat() }) else: print(f"FAIL (retry): {r.status_code} {r.text[:200]}") else: print(f"FAIL: {r.status_code} {r.text[:200]}") except Exception as e: print(f"ERROR: {e}") time.sleep(ERROR_DELAY) if len(all_accounts) > 0 and len(all_accounts) % BATCH_SIZE == 0: print(f" [BATCH {batch_num}] Cooldown {BATCH_DELAY}s...") time.sleep(BATCH_DELAY) time.sleep(1.5) output_path = r"C:\Users\User\AppData\Local\hermes\lobehub_new_accounts.json" os.makedirs(os.path.dirname(output_path), exist_ok=True) with open(output_path, "w") as f: json.dump(all_accounts, f, indent=2) print(f"\n{'='*60}") print(f"[DONE] Registered {len(all_accounts)} new accounts") print(f"[FILE] {output_path}") print(f"{'='*60}")