diff --git a/debug_screenshot.py b/debug_screenshot.py index c8c7aca5..178b9e42 100644 --- a/debug_screenshot.py +++ b/debug_screenshot.py @@ -1,23 +1,20 @@ import asyncio import os +import json import logging from pyppeteer import launch -from pyppeteer.errors import TimeoutError # Logging-Konfiguration logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') # --- Konfiguration --- HA_URL = "http://192.168.178.131:8123/lovelace/solar?kiosk" -OUTPUT_FILE = "/screenshots/debug_screenshot_final.png" - -# NEU: Anmeldedaten aus Umgebungsvariablen lesen -HA_USERNAME = os.environ.get("HA_USERNAME") -HA_PASSWORD = os.environ.get("HA_PASSWORD") +OUTPUT_FILE = "/screenshots/hass_screenshot.png" +HA_TOKEN = os.environ.get("HA_ACCESS_TOKEN") async def main(): - if not HA_USERNAME or not HA_PASSWORD: - logging.error("Fehler: HA_USERNAME oder HA_PASSWORD Umgebungsvariable nicht gefunden!") + if not HA_TOKEN: + logging.error("Fehler: Umgebungsvariable HA_ACCESS_TOKEN nicht gefunden!") return logging.info("Starte Puppeteer-Browser...") @@ -32,33 +29,29 @@ async def main(): await page.setViewport({'width': 1280, 'height': 1024}) try: - logging.info(f"Navigiere zur initialen URL: {HA_URL}") + # === NEU: TOKEN-INJEKTION IN DEN LOCAL STORAGE === + # Dieses JavaScript wird ausgeführt, bevor die Ziel-URL geladen wird. + # Es erstellt den Authentifizierungs-Eintrag, den Home Assistant erwartet. + logging.info("Injiziere Authentifizierungs-Token in den Local Storage des Browsers...") + await page.evaluateOnNewDocument(f''' + localStorage.setItem( + 'hassio-token', + JSON.stringify({{ + 'access_token': '{HA_TOKEN}', + 'token_type': 'Bearer', + 'expires_in': 86400, // Gültigkeit auf 24h setzen + 'expires': new Date().getTime() + 86400 * 1000, + 'hassUrl': 'http://192.168.178.131:8123' + }}) + ); + ''') + + logging.info(f"Navigiere zur finalen URL: {HA_URL}") await page.goto(HA_URL, {'waitUntil': 'networkidle0', 'timeout': 60000}) - await asyncio.sleep(3) - - # Warten, bis das Login-Formular bereit ist - username_input_selector = 'input[name="username"]' - await page.waitForSelector(username_input_selector, {'timeout': 10000}) - logging.info("Login-Formular erkannt. Fülle Anmeldedaten aus...") - await page.type(username_input_selector, HA_USERNAME) - await page.type('input[name="password"]', HA_PASSWORD) + logging.info("Seite geladen. Warte 15 Sekunden auf das finale Rendering aller Elemente...") + await asyncio.sleep(15) # Großzügige Wartezeit für komplexe Dashboards - # --- FINALE, ROBUSTE KLICK-METHODE VIA JAVASCRIPT --- - # Dieses Skript dringt in den Shadow DOM ein, um den Button zu finden und zu klicken. - logging.info("Klicke auf 'LOG IN'-Button via JavaScript (für Shadow DOM)...") - await page.evaluate('''() => { - document.querySelector('ha-auth-flow').shadowRoot.querySelector('ha-form > mwc-button').click(); - }''') - - logging.info("Warte nach Login auf Navigation/Neuladen...") - # Wir warten darauf, dass die Login-Maske verschwindet. - # Ein guter Indikator ist, wenn das 'ha-auth-flow'-Element nicht mehr da ist. - await page.waitForSelector('ha-auth-flow', {'hidden': True, 'timeout': 20000}) - - logging.info("Login erfolgreich, Seite wird neu geladen. Warte auf finale Ansicht...") - await asyncio.sleep(10) # Finale Wartezeit für das Dashboard-Rendering - logging.info("Erstelle finalen Screenshot...") await page.screenshot({'path': OUTPUT_FILE}) logging.info(f"Screenshot erfolgreich unter {OUTPUT_FILE} gespeichert.") @@ -70,4 +63,10 @@ async def main(): finally: logging.info("Schließe Browser.") - await browser.close() \ No newline at end of file + await browser.close() + +if __name__ == '__main__': + try: + asyncio.run(main()) + except Exception as e: + logging.critical(f"Kritischer Fehler im Hauptprozess: {e}", exc_info=True) \ No newline at end of file