Files
descarga_xml_sunat/get_token_headless.py
T

95 lines
3.2 KiB
Python
Raw Normal View History

2026-07-17 12:21:31 -05:00
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__)
# ============================================================================
2026-07-17 12:21:31 -05:00
USER_AGENT = (
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) "
"Gecko/20100101 Firefox/121.0"
2026-07-17 12:21:31 -05:00
)
# ============================================================================
def firefox_instalado():
2026-07-17 12:21:31 -05:00
sistema = platform.system().lower()
if sistema == "windows":
return bool(shutil.which("firefox")) or any(
2026-07-17 12:21:31 -05:00
os.path.exists(p) for p in [
"C:\\Program Files\\Mozilla Firefox\\firefox.exe",
"C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe",
2026-07-17 12:21:31 -05:00
]
)
elif sistema == "darwin":
return os.path.exists("/Applications/Firefox.app")
2026-07-17 12:21:31 -05:00
elif sistema == "linux":
return bool(shutil.which("firefox") or shutil.which("firefox-esr"))
2026-07-17 12:21:31 -05:00
return False
# ============================================================================
2026-07-17 12:21:31 -05:00
def get_token_headless(timeout=90000):
with sync_playwright() as p:
browser = p.firefox.launch(
2026-07-17 12:21:31 -05:00
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...")
2026-07-17 12:21:31 -05:00
page.goto("https://www.sunat.gob.pe/sol.html", wait_until="domcontentloaded")
logger.info("2. Navegando a menú directo...")
2026-07-17 12:21:31 -05:00
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...")
2026-07-17 12:21:31 -05:00
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)")
2026-07-17 12:21:31 -05:00
logger.info("4. Buscando token en menú...")
2026-07-17 12:21:31 -05:00
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)")
2026-07-17 12:21:31 -05:00
save_token(token)
return token
logger.error("No se encontró token")
2026-07-17 12:21:31 -05:00
return None
# ============================================================================
2026-07-17 12:21:31 -05:00
if __name__ == "__main__":
get_token_headless()
# ============================================================================