3.4 KiB
3.4 KiB
DailyStr8ts — technické poznámky
Přehled skriptů
| Skript | Popis |
|---|---|
stahni_str8ts.py |
Stahuje denní puzzle jako PDF z webu, odesílá emailem |
preskumaj_str8ts.py |
Průzkumný — vytáhne gameLevels z JS kontextu stránky |
vykresli_puzzle.py |
Generuje vlastní PDF z dat v MySQL (reportlab, vektorové) |
vykresli_velikosti.py |
Testovací — jedno puzzle v 17 velikostech (18–2 cm) |
create_puzzles_table.sql |
DDL pro tabulku puzzle.puzzles |
Stahování z webu (stahni_str8ts.py)
Výstup: U:\Dropbox\!!!Days\Downloads Z230\yyyy-mm-dd Daily Str8ts puzzle.pdf
Příjemci: vladimir.buzalka@buzalka.cz, alica.buzalkova@buzalka.cz
Stránka game.php má funkci Game.printDaily() která:
- Vytvoří skrytý
<iframe id="printFrame">v DOM - Zapíše do něj puzzle HTML přes
contentWindow.document.write()— všechny 3 obtížnosti (Easy, Medium, Hard) - Data
gameLevelsjsou načtena při page load — žádný extra AJAX není potřeba - Zavolá
contentWindow.print()→ Chrome print dialog
Řešení v skriptu:
- Načteme
game.php(headless Chromium) - Zavoláme
Game.printDaily()přes JS evaluate - Přečteme
iframe.contentDocument.documentElement.outerHTML - Přidáme
<base href="https://www.solitaire.org/daily-str8ts/">pro obrázky - Načteme HTML do nové stránky a uložíme jako
page.pdf()
Datová struktura gameLevels
JS objekt gameLevels obsahuje puzzle pro všechny dny roku, klíčované jako gameLevels[difficulty]["MM-DD"].
Každý záznam má 3 stringy po 81 znacích (9×9 mřížka, po řádcích):
| Pole | Význam |
|---|---|
puzzle |
Zadání: 1–9 = předvyplněné číslo, . = prázdná buňka |
bw |
Mapa barev: 0 = bílá buňka, 1 = černá buňka |
solution |
Řešení: 1–9 = číslo, . = černá bez čísla |
MySQL tabulka puzzle.puzzles
Univerzální tabulka pro Str8ts, Sudoku i další puzzle typy.
CREATE TABLE puzzles (
id INT AUTO_INCREMENT PRIMARY KEY,
game_type VARCHAR(30) NOT NULL, -- 'str8ts', 'sudoku', 'killer_sudoku'
difficulty VARCHAR(20) NOT NULL, -- 'easy', 'medium', 'hard'
puzzle_date DATE NOT NULL,
puzzle VARCHAR(200) NOT NULL, -- zadání (81 znaků pro 9×9)
solution VARCHAR(200) DEFAULT NULL,
extra JSON DEFAULT NULL, -- specifika typu (bw mapa, cage definice...)
source VARCHAR(100) DEFAULT NULL,
fetched_at DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uq_puzzle (game_type, difficulty, puzzle_date)
);
Pro Str8ts se do extra ukládá {"bw": "001100011..."}.
Generování vlastního PDF (vykresli_puzzle.py)
- Knihovna: reportlab — vektorová grafika, plynule škálovatelná
- Zvolená velikost: 11×11 cm, 2 puzzle nad sebou na A4
- Černé buňky:
c.rect(fill=1), žlutá čísla na černé, černá čísla na bílé - Str8ts nemá 3×3 bloky → všechny čáry mřížky stejně silné
Co nefunguje (neopakovat)
page.pdf()na hlavní stránce → uvítací obrazovka, ne puzzlecontext.expect_page()→ žádný popup se neotevírá- Override
window.print→ Game volácontentWindow.print(), newindow.print()
Co zbývá
- Zabudovat extrakci + MySQL insert do
stahni_str8ts.py - Nahradit stahované PDF z webu vlastním generovaným
- Rozšířit na další typy puzzle (Sudoku, Killer Sudoku)