Files
ordinaceprojekt/SběrDatRůzné/DailyStr8ts/stahni_str8ts.py
T
2026-04-23 10:23:50 +02:00

107 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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
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
OUTPUT_DIR = Path(__file__).parent
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 19 — do bílých buněk piš čísla 19.
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 19 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())