Files
autoreg-skills-max/skills/bulk-account-registration/templates/grok_clerk_api.py

149 lines
5.7 KiB
Python

"""Grok (x.ai) registration via Clerk API — no browser, no Cloudflare, no CAPTCHA.
Pattern: Clerk publishable key extracted from page source as `castlePk`.
Calls Clerk Frontend API directly + t-online.de IMAP for verification codes.
Usage: python grok_clerk_api.py 3
"""
import imaplib, email, re, json, random, string, time, sys, requests
from pathlib import Path
EMAILS_FILE = "C:/Users/User/Desktop/_PROJECTS/GPT-AUTOREG/emails.txt"
OUTPUT = "C:/Users/User/projects/vellum-account-farm/accounts/grok_accounts.json"
CLERK_PK = "pk_p8GGWvD3TmFJZRsX3BQcqAv9aFVispNz"
CLERK_BASE = "https://clerk.x.ai/v1/client"
def load_emails():
emails = []
with open(EMAILS_FILE, "r") as f:
for line in f:
line = line.strip()
if not line or line.startswith("#") or line.startswith("---"):
continue
if ":" in line:
user, pw = line.split(":", 1)
emails.append((user.strip(), pw.strip()))
return emails
def get_code_tonline(addr, pw, timeout=120):
"""Poll t-online.de IMAP for verification code."""
deadline = time.time() + timeout
while time.time() < deadline:
try:
mail = imaplib.IMAP4_SSL("secureimap.t-online.de", 993)
mail.login(addr, pw)
mail.select("inbox")
_, msgs = mail.search(None, "UNSEEN")
if not msgs[0]:
_, msgs = mail.search(None, "ALL")
for num in msgs[0].split()[-5:]:
_, data = mail.fetch(num, "(RFC822)")
for part in data:
if not isinstance(part, tuple): continue
msg = email.message_from_bytes(part[1])
body = ""
if msg.is_multipart():
for p in msg.walk():
if p.get_content_type() in ("text/plain", "text/html"):
pl = p.get_payload(decode=True)
if pl: body += pl.decode(errors="ignore")
else:
pl = msg.get_payload(decode=True)
if pl: body = pl.decode(errors="ignore")
codes = re.findall(r"\b(\d{6,8})\b", body)
if codes and codes[0] != "000000":
mail.logout()
return codes[0]
links = re.findall(r"https://[^\s<>]*x\.ai[^\s<>]*confirm[^\s<>]*", body)
if links:
mail.logout()
return "LINK:" + links[0]
mail.logout()
except Exception as e:
print(f" [IMAP] {e}")
time.sleep(5)
return None
def register_one(email_addr, email_pw):
pw = "".join(random.choices(string.ascii_letters + string.digits + "!@#$%^&*", k=16))
s = requests.Session()
s.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/[REDACTED-IP]",
"Origin": "https://accounts.x.ai",
"Referer": "https://accounts.x.ai/",
"Content-Type": "application/json",
})
# Step 1: Create sign-up
print(f" Creating sign-up for {email_addr}...")
r = s.post(f"{CLERK_BASE}/sign_ups", json={
"email_address": email_addr,
"password": pw,
}, headers={"Clerk-Publishable-Key": CLERK_PK})
if r.status_code != 200:
print(f" [FAIL] Sign-up failed: {r.status_code} {r.text[:200]}")
return None
data = r.json()
signup_id = data.get("response", {}).get("id") or data.get("id")
if not signup_id:
print(f" [FAIL] No sign-up ID in response: {r.text[:200]}")
return None
# Step 2: Prepare email verification
r = s.post(f"{CLERK_BASE}/sign_ups/{signup_id}/prepare_verification", json={
"strategy": "email_code",
}, headers={"Clerk-Publishable-Key": CLERK_PK})
print(f" Prepare verification: {r.status_code}")
# Step 3: Wait for code via IMAP
code = get_code_tonline(email_addr, email_pw, timeout=120)
if not code:
print(" [FAIL] No code received")
return None
if code.startswith("LINK:"):
link = code[5:]
print(f" Got link: {link[:80]}...")
r = s.get(link, allow_redirects=True)
print(f" Link result: {r.status_code}")
else:
# Step 4: Verify email code
print(f" Verifying code: {code}...")
r = s.post(f"{CLERK_BASE}/sign_ups/{signup_id}/attempt_verification", json={
"strategy": "email_code",
"code": code,
}, headers={"Clerk-Publishable-Key": CLERK_PK})
print(f" Verify: {r.status_code} {r.text[:200]}")
print(f" [OK] Done: {email_addr}")
return {"email": email_addr, "password": pw, "site": "grok", "status": "active"}
def main():
count = int(sys.argv[1]) if len(sys.argv) > 1 else 3
emails = load_emails()
print(f"=== GROK REG (Clerk API): {count} accounts from {len(emails)} emails ===")
ok = []
for i in range(min(count, len(emails))):
addr, epw = emails[i]
print(f"\n--- [{i+1}/{count}] {addr} ---")
try:
r = register_one(addr, epw)
if r: ok.append(r)
except Exception as e:
print(f" [ERROR] {e}")
if i < count - 1:
d = random.randint(5, 15)
print(f" Cooldown {d}s...")
time.sleep(d)
print(f"\n=== Done: {len(ok)}/{count} ===")
if ok:
out = Path(OUTPUT)
out.parent.mkdir(parents=True, exist_ok=True)
existing = json.loads(out.read_text()) if out.exists() else []
existing.extend(ok)
out.write_text(json.dumps(existing, indent=2))
print(f"Saved: {out}")
if __name__ == "__main__":
main()