""" Stáhne daily Str8ts puzzle jako PDF ze solitaire.org a uloží do stejné složky. Název souboru: yyyy-mm-dd Daily Str8ts puzzle.pdf """ import asyncio import sys sys.stdout.reconfigure(encoding="utf-8") sys.stderr.reconfigure(encoding="utf-8") from datetime import date from pathlib import Path from playwright.async_api import async_playwright sys.path.insert(0, str(Path(__file__).parent.parent.parent / "Knihovny")) from EmailMessagingGraph import send_mail from najdi_dropbox import get_dropbox_root OUTPUT_DIR = Path(get_dropbox_root()) / "!!!Days" / "Downloads Z230" URL = "https://www.solitaire.org/daily-str8ts/" RECIPIENT = ["vladimir.buzalka@buzalka.cz", "alica.buzalkova@buzalka.cz"] EMAIL_BODY = """Str8ts — pravidla Hrací pole 9×9, každá buňka je buď bílá nebo černá. 1. Číslice 1–9 — do bílých buněk piš čísla 1–9. 2. Žádné opakování v řádku/sloupci — stejné číslo se nesmí opakovat v celém řádku ani sloupci (jako Sudoku). 3. Straights (sekvence) — bílé buňky oddělené černými tvoří skupiny. Čísla v každé skupině musí tvořit sadu po sobě jdoucích čísel (v libovolném pořadí). Např. skupinka tří buněk může obsahovat {3,4,5} nebo {7,8,9}, ale ne {1,3,5}. 4. Délka sekvence — skupina o délce n musí obsahovat právě n různých čísel jdoucích za sebou. 5. Černé buňky s číslem — někdy mají předvyplněné číslo jako nápovědu; toto číslo se nepočítá do sekvencí, ale blokuje opakování v řádku/sloupci. Rozdíl od Sudoku: nemusíš vyplnit 1–9 do každé skupiny — jen zajistit, že čísla v každé skupině tvoří „straight" (jako v pokeru). """ async def main(): today = date.today().strftime("%Y-%m-%d") output_path = OUTPUT_DIR / f"{today} Daily Str8ts puzzle.pdf" if output_path.exists(): print(f"Soubor již existuje: {output_path}") return async with async_playwright() as p: browser = await p.chromium.launch(headless=True) context = await browser.new_context( viewport={"width": 1280, "height": 900}, ) page = await context.new_page() print(f"Načítám {URL} ...") await page.goto(URL, wait_until="networkidle", timeout=60_000) # Najdi iframe s hrou (solitaire.org vkládá hru do iframe) game_frame = None for frame in page.frames: if frame.url != page.url and frame.url.strip() not in ("", "about:blank"): game_frame = frame print(f" Nalezen iframe: {frame.url}") break target = game_frame if game_frame else page # Zkus kliknout na Print tlačítko (různé možné selektory) print_selectors = [ "text=Print", "button:has-text('Print')", "[title*='print' i]", "[aria-label*='print' i]", ".print-button", "#print", ] clicked = False for sel in print_selectors: try: await target.click(sel, timeout=3_000) clicked = True print(f" Kliknuto na Print ({sel})") await page.wait_for_timeout(1_500) break except Exception: pass if not clicked: print(" Tlačítko Print nenalezeno — ukládám celou stránku jako PDF.") # Uložit jako PDF await page.pdf( path=str(output_path), format="A4", print_background=True, margin={"top": "10mm", "bottom": "10mm", "left": "10mm", "right": "10mm"}, ) print(f"PDF uloženo: {output_path}") await browser.close() send_mail( to=RECIPIENT, subject="Posílám dnešní Str8ts puzzle v příloze", body=EMAIL_BODY, attachments=output_path, ) print(f"Email odeslán na {RECIPIENT}") if __name__ == "__main__": asyncio.run(main())