import os import time import shutil import platform from pathlib import Path from playwright.sync_api import sync_playwright from get_token import ( MENU_URL, TOKEN_FILE, SCREENSHOT_DIR, fill_login_form, save_token, save_screenshot, check_for_token, navigate_sol_menu, extract_token_from_menu, ) from logger_manager import get_logger logger = get_logger(__name__) # ============================================================================ USER_AGENT = ( "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) " "Gecko/20100101 Firefox/121.0" ) # ============================================================================ def firefox_instalado(): sistema = platform.system().lower() if sistema == "windows": return bool(shutil.which("firefox")) or any( os.path.exists(p) for p in [ "C:\\Program Files\\Mozilla Firefox\\firefox.exe", "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe", ] ) elif sistema == "darwin": return os.path.exists("/Applications/Firefox.app") elif sistema == "linux": return bool(shutil.which("firefox") or shutil.which("firefox-esr")) return False # ============================================================================ def get_token_headless(timeout=90000): with sync_playwright() as p: browser = p.firefox.launch( headless=True, ) context = browser.new_context( viewport={"width": 1280, "height": 800}, locale="es-PE", timezone_id="America/Lima", user_agent=USER_AGENT, ) page = context.new_page() page.set_default_timeout(timeout) logger.info("1. Sesión desde SOL...") page.goto("https://www.sunat.gob.pe/sol.html", wait_until="domcontentloaded") logger.info("2. Navegando a menú directo...") page.goto(MENU_URL, wait_until="domcontentloaded") page.wait_for_load_state("networkidle") has_inputs = len(page.locator("input[type='password']").all()) > 0 if has_inputs or any(k in page.url.lower() for k in ["login", "autentica", "auth"]): logger.info("3. Login detectado, rellenando credenciales...") fill_login_form(page) page.keyboard.press("Enter") try: page.wait_for_load_state("networkidle", timeout=30000) except Exception: pass page.wait_for_timeout(3000) else: logger.info("3. Sin login (sesión activa)") logger.info("4. Buscando token en menú...") page.wait_for_timeout(2000) token = check_for_token(page) if not token: token = navigate_sol_menu(page) if not token: token = extract_token_from_menu(page) context.close() browser.close() if token: logger.info("Token obtenido (headless)") save_token(token) return token logger.error("No se encontró token") return None # ============================================================================ if __name__ == "__main__": get_token_headless() # ============================================================================