Spaces:
Paused
Paused
| 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 --- | |
| def home(): return {"status": "Debugger Online"} | |
| 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() |