#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ RECON ONLY — nic nezakládá, nic neodesílá. Otevře testovacího pacienta Vladko, otevře "Nový požadavek", zachytí dostupné typy požadavků a podívá se na formulář "Recept". Ukládá: screenshoty, HTML, plný GraphQL provoz (request + response). """ from pathlib import Path from datetime import datetime import sys, json, time from playwright.sync_api import sync_playwright, TimeoutError as PWTimeout try: sys.stdout.reconfigure(encoding="utf-8", errors="replace") except Exception: pass HERE = Path(__file__).resolve().parent STATE_FILE = HERE.parent / "medevio_storage.json" PATIENT_UUID = "0210db7b-8fb0-4b47-b1d8-ec7a10849a63" # Vladko - testovaci aplikace PATIENT_URL = f"https://my.medevio.cz/mudr-buzalkova/klinika/pacienti?pacient={PATIENT_UUID}" OUT = HERE / "recon_recept" OUT.mkdir(exist_ok=True) GQL_LOG = OUT / f"graphql_{int(time.time())}.jsonl" def log(msg): print(f"[{datetime.now():%H:%M:%S}] {msg}", flush=True) def main(): with sync_playwright() as p: browser = p.chromium.launch(headless=False, slow_mo=150) context = browser.new_context(storage_state=str(STATE_FILE)) page = context.new_page() # ---- capture GraphQL request + response bodies ---- def on_response(resp): try: req = resp.request if "graphql" in req.url and req.method == "POST": rec = {"op": None, "request": None, "response": None, "status": resp.status} try: rec["request"] = json.loads(req.post_data or "{}") rec["op"] = rec["request"].get("operationName") except Exception: pass try: rec["response"] = resp.json() except Exception: pass with open(GQL_LOG, "a", encoding="utf-8") as f: f.write(json.dumps(rec, ensure_ascii=False) + "\n") except Exception: pass page.on("response", on_response) log(f"Otevírám kartu pacienta…") page.goto(PATIENT_URL, wait_until="networkidle") time.sleep(2) page.screenshot(path=str(OUT / "01_card.png"), full_page=True) # ---- detect login / session expiry ---- url_now = page.url if "login" in url_now or "prihlaseni" in url_now or "auth" in url_now: log(f"!!! Vypadá to na odhlášení / propadlou session. URL: {url_now}") (OUT / "_SESSION_EXPIRED.txt").write_text(url_now, encoding="utf-8") browser.close() return # is the card actually visible? card_ok = False try: page.get_by_text("Historie požadavků").wait_for(timeout=8000) card_ok = True log("Karta pacienta načtena (vidím 'Historie požadavků').") except PWTimeout: log("!!! Nevidím 'Historie požadavků' — možná jiný layout nebo session.") (OUT / "01_card.html").write_text(page.content(), encoding="utf-8") if not card_ok: browser.close() return # ---- open "Nový požadavek" ---- try: page.get_by_role("button", name="Nový požadavek").click() time.sleep(1.0) page.screenshot(path=str(OUT / "02_new_request_open.png"), full_page=True) (OUT / "02_new_request_open.html").write_text(page.content(), encoding="utf-8") log("Kliknuto 'Nový požadavek'.") except Exception as e: log(f"!!! Nepodařilo se kliknout 'Nový požadavek': {e}") browser.close() return # ---- capture all available request-type options (empty query) ---- try: opts = page.locator("[role='option']").all_text_contents() (OUT / "03_all_options.txt").write_text( "\n".join(opts), encoding="utf-8") log(f"Dostupných typů (bez filtru): {len(opts)}") except Exception as e: log(f"options(all) chyba: {e}") # ---- type 'recept' and capture filtered options ---- try: page.keyboard.type("recept") time.sleep(1.0) opts2 = page.locator("[role='option']").all_text_contents() (OUT / "04_recept_options.txt").write_text( "\n".join(opts2), encoding="utf-8") page.screenshot(path=str(OUT / "04_recept_options.png"), full_page=True) (OUT / "04_recept_options.html").write_text(page.content(), encoding="utf-8") log(f"Po napsání 'recept' nabízí: {opts2}") except Exception as e: log(f"options(recept) chyba: {e}") log("RECON hotovo — NIC nezaloženo. Zavírám za 3s.") time.sleep(3) browser.close() log(f"Artefakty v: {OUT}") log(f"GraphQL log: {GQL_LOG}") if __name__ == "__main__": main()