#!/usr/bin/env python3 """ Запуск полной отладки регистрации AWS Builder ID Использование: python -m debugger.run # или из autoreg/ python debugger/run.py """ import os import sys import time # Добавляем путь к autoreg sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from debugger import DebugSession def run_debug_registration(): """Запускает полную отладку регистрации""" # Создаём сессию session = DebugSession() # Импортируем модули регистрации from registration.register import AWSRegistration from registration.browser import BrowserAutomation from registration.oauth_pkce import OAuthPKCE from core.email_generator import EmailGenerator reg = AWSRegistration(headless=False) try: # === INIT === session.start_step("init") generator = EmailGenerator.from_env() email_result = generator.generate() session.note(f"Email: {email_result.registration_email}") session.note(f"Name: {email_result.display_name}") reg._init_mail() session.note("IMAP connected") session.end_step() # === OAUTH === session.start_step("oauth_start") reg.oauth = OAuthPKCE() auth_url = reg.oauth.start(account_name=email_result.registration_email.split('@')[0]) session.note(f"Auth URL: {auth_url[:60]}...") session.note(f"Callback port: {reg.oauth.port}") session.end_step() # === BROWSER === session.start_step("browser_init") reg.browser = BrowserAutomation(headless=False, email=email_result.registration_email) # Подключаем дебаггер к браузеру session.attach(reg.browser.page) # Пропускаем prewarm для ускорения дебага # reg.browser.prewarm() session.note("Browser ready (prewarm skipped for debug)") session.end_step() # === NAVIGATE === session.start_step("navigate") reg.browser.navigate(auth_url) session.collect() session.monitor(duration=5) session.end_step() # === EMAIL === session.start_step("email_input") reg.browser.enter_email(email_result.registration_email) session.collect() reg.browser.click_continue() session.note("Clicked Continue") session.monitor(duration=10) session.end_step() # === NAME === session.start_step("name_input") reg.browser.enter_name(email_result.display_name) session.collect() session.monitor(duration=5) session.end_step() # === VERIFICATION CODE === session.start_step("verification_code") session.note("Waiting for email...") code = reg.mail_handler.get_verification_code(email_result.imap_lookup_email, timeout=90) if not code: session.end_step("No verification code received") raise Exception("No verification code") session.note(f"Code received: {code}") reg.browser.enter_verification_code(code) session.collect() session.monitor(duration=10) session.end_step() # === PASSWORD === session.start_step("password_input") password = reg.browser.generate_password() session.note(f"Password: {password}") pwd_fields = reg.browser.page.eles('tag:input@@type=password', timeout=3) session.note(f"Found {len(pwd_fields)} password fields") if len(pwd_fields) >= 2: reg.browser.human_type(pwd_fields[0], password, field_type='password') session.note("First password entered") time.sleep(0.5) reg.browser.human_type(pwd_fields[1], password, field_type='password') session.note("Second password entered") session.collect() session.end_step() # === PASSWORD SUBMIT - КРИТИЧЕСКИЙ МОМЕНТ === session.start_step("password_submit") reg.browser._click_if_exists(['@data-testid=test-primary-button'], timeout=1) session.note("Clicked Continue") # Мониторим долго - это где происходит зависание session.note("Monitoring redirect (up to 120s)...") workflow_success_detected = False def check_success(): """Проверяет условия успеха""" nonlocal workflow_success_detected # Собираем данные session.collect() # Проверяем cookies for collector in session._collectors: if hasattr(collector, 'is_workflow_success') and collector.is_workflow_success(): if not workflow_success_detected: session.note("🎉 WORKFLOW SUCCESS via cookie!") workflow_success_detected = True break # Проверяем URL url = session.page.url if session.page else "" if 'awsapps.com' in url: session.note(f"Reached awsapps.com") return True if '127.0.0.1' in url and 'callback' in url: session.note(f"Reached callback") return True return False success = session.monitor(duration=120, interval=1, stop_condition=check_success) # Если workflow success но редирект не произошёл - пробуем форсировать if workflow_success_detected and not success: session.note("⚠️ Workflow success but no redirect - trying to force...") # Пробуем получить redirect URL из страницы try: redirect_info = session.page.run_js(r''' // Ищем redirect URL в странице const scripts = document.querySelectorAll('script'); for (const s of scripts) { const text = s.textContent || ''; const match = text.match(/redirect[Uu]rl["']?\s*[:=]\s*["']([^"']+)/); if (match) return {found: true, url: match[1]}; } // Ищем в meta refresh const meta = document.querySelector('meta[http-equiv="refresh"]'); if (meta) { const content = meta.getAttribute('content') || ''; const match = content.match(/url=(.+)/i); if (match) return {found: true, url: match[1]}; } // Ищем ссылки на awsapps const links = document.querySelectorAll('a[href*="awsapps"]'); if (links.length) return {found: true, url: links[0].href}; return {found: false}; ''') if redirect_info and redirect_info.get('found'): session.note(f"Found redirect URL: {redirect_info.get('url', '')[:50]}...") else: session.note("No redirect URL found in page") except Exception as e: session.note(f"Error searching for redirect: {e}") if not success: session.note("Timeout waiting for redirect") session.end_step() # === ALLOW ACCESS === session.start_step("allow_access") current_url = session.page.url if session.page else "" if 'awsapps.com' in current_url: session.note("On awsapps.com, clicking Allow access...") reg.browser.click_allow_access() session.monitor(duration=10) else: session.note(f"Not on awsapps.com, current URL: {current_url[:50]}...") session.end_step() # === OAUTH CALLBACK === session.start_step("oauth_callback") success = reg.oauth.wait_for_callback(timeout=30) if success: session.note(f"Token: {reg.oauth.get_token_filename()}") else: session.note("Callback timeout") session.end_step() except Exception as e: import traceback session.note(f"EXCEPTION: {e}") session.note(traceback.format_exc()) if session.current_step: session.end_step(str(e)) finally: # Анализируем проблемы с редиректом from debugger.analyzers import RedirectAnalyzer redirect_analysis = RedirectAnalyzer(session).print_report() # Сохраняем отчёт report_path = session.save() # Экспортируем HAR from debugger.exporters import HARExporter har_path = HARExporter(session).export() reg.close() print(f"\n{'='*60}") print(f"DEBUG COMPLETE") print(f"Report: {report_path}") print(f"HAR: {har_path}") print(f"HTML: {session.session_dir / 'report.html'}") print(f"{'='*60}") if __name__ == '__main__': run_debug_registration()