from fastapi import FastAPI import undetected_chromedriver as uc from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import requests import time import random import string import re import base64 import os app = FastAPI() # --- UTILS --- def gen_password(): chars = string.ascii_letters + string.digits + "!@#$%^&*" return ''.join(random.choice(chars) for i in range(12)) + "Aa1!" def get_screenshot_b64(driver): try: return driver.get_screenshot_as_base64() except: return None # --- MAIL.TM --- class MailTM: def __init__(self): self.base = "https://api.mail.tm" self.headers = {"Content-Type": "application/json", "Accept": "application/json"} self.email = None self.password = None self.token = None def create(self): try: # Domain dom_res = requests.get(f"{self.base}/domains", headers=self.headers) if dom_res.status_code != 200: return "Failed to fetch domains" domain = dom_res.json()['hydra:member'][0]['domain'] # Register self.password = gen_password() user = ''.join(random.choices(string.ascii_lowercase + string.digits, k=10)) self.email = f"{user}@{domain}" reg = requests.post(f"{self.base}/accounts", json={"address": self.email, "password": self.password}) if reg.status_code != 201: return f"Reg Failed: {reg.text}" # Token tok = requests.post(f"{self.base}/token", json={"address": self.email, "password": self.password}) self.token = tok.json().get('token') return None # Success except Exception as e: return str(e) def get_link(self): head = {**self.headers, "Authorization": f"Bearer {self.token}"} for _ in range(15): # 45 seconds polling time.sleep(3) try: msgs = requests.get(f"{self.base}/messages", headers=head).json().get('hydra:member', []) for m in msgs: if "Verify" in m['subject'] or "ElevenLabs" in m['from']['name']: full = requests.get(f"{self.base}/messages/{m['id']}", headers=head).json() body = full.get('text') or full.get('html') or "" match = re.search(r'https://elevenlabs\.io/app/action\?mode=verifyEmail[^"\s<>]+', body) if match: return match.group(0) except: pass return None # --- MAIN --- @app.get("/") def home(): return {"status": "Debugger Online"} @app.get("/gen") def generate(): logs = [] driver = None mail = MailTM() try: logs.append("1. Creating Email...") err = mail.create() if err: raise Exception(err) logs.append(f"Email: {mail.email}") logs.append("2. Launching Chrome...") options = uc.ChromeOptions() options.add_argument('--headless=new') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--window-size=1280,720') driver = uc.Chrome(options=options) logs.append("3. Navigating to Signup...") driver.get("https://elevenlabs.io/sign-up") time.sleep(5) logs.append("4. Filling Form...") WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, "email"))) driver.find_element(By.NAME, "email").send_keys(mail.email) driver.find_element(By.NAME, "password").send_keys(mail.password) logs.append("5. Attempting Turnstile Click...") try: time.sleep(2) frames = driver.find_elements(By.TAG_NAME, "iframe") clicked = False for frame in frames: if "challenges" in frame.get_attribute("src"): driver.switch_to.frame(frame) time.sleep(1) driver.find_element(By.XPATH, "//body").click() driver.switch_to.default_content() logs.append("-> Turnstile Clicked") clicked = True time.sleep(3) break if not clicked: logs.append("-> No Turnstile found (Auto-pass?)") except Exception as e: logs.append(f"-> Turnstile Error: {str(e)}") logs.append("6. Clicking Submit...") btn = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]') driver.execute_script("arguments[0].click();", btn) logs.append("7. Waiting for Email...") link = mail.get_link() if not link: raise Exception("Email timeout (Check Screenshot)") logs.append("8. Verifying Link...") driver.get(link) time.sleep(5) logs.append("9. Fetching API Key...") login = requests.post("https://api.elevenlabs.io/v1/user/login", json={ "email": mail.email, "password": mail.password }) if login.status_code == 200: return { "success": True, "email": mail.email, "password": mail.password, "api_key": login.json().get("xi_api_key"), "logs": logs } else: raise Exception(f"Login Failed: {login.status_code}") except Exception as e: # CAPTURE SCREENSHOT ON FAILURE shot = get_screenshot_b64(driver) if driver else None return { "success": False, "error": str(e), "logs": logs, "screenshot": shot } finally: if driver: driver.quit()