File size: 5,850 Bytes
cf8e6e2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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()