z230
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
"""
|
||||
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 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())
|
||||
Reference in New Issue
Block a user