notebookvb

This commit is contained in:
Vladimir Buzalka
2026-04-19 13:43:46 +02:00
parent 93d2f3dedf
commit 86e641b282
3 changed files with 554 additions and 0 deletions
@@ -0,0 +1,134 @@
"""
01 - Přihlášení na VZP Point (Inbox)
Otevře Chrome, přihlásí se certifikátem a naviguje na schránku zpráv.
Okno zůstane otevřené — skript čeká na stisk Enter.
Použití: python 01_prihlaseni.py
"""
import json
import os
import re
import sys
import time
import winreg
INBOX_URL = "https://point.vzp.cz/Inbox/Message"
CHROME_PROFILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "chrome_profile"))
COOKIES_FILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "vzp_cookies.json"))
def load_cookies(context) -> int:
"""Načte dříve uložené cookies (včetně session-only) zpět do kontextu."""
if not os.path.exists(COOKIES_FILE):
return 0
try:
with open(COOKIES_FILE, "r", encoding="utf-8") as f:
cookies = json.load(f)
context.add_cookies(cookies)
return len(cookies)
except Exception as e:
print(f" Chyba při načítání cookies: {e}")
return 0
def save_cookies(context) -> int:
"""Uloží VZP cookies (i session-only) do JSON souboru."""
try:
all_cookies = context.cookies()
vzp = [c for c in all_cookies if "vzp.cz" in c.get("domain", "")]
with open(COOKIES_FILE, "w", encoding="utf-8") as f:
json.dump(vzp, f, indent=2, ensure_ascii=False)
return len(vzp)
except Exception as e:
print(f" Chyba při ukládání cookies: {e}")
return 0
def _delete_chrome_cert_policy() -> None:
"""Smaže AutoSelectCertificateForUrls politiku — Chrome pak zobrazí dialog přirozeně."""
key_path = r"SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls"
try:
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, access=winreg.KEY_SET_VALUE)
winreg.DeleteValue(key, "1")
winreg.CloseKey(key)
except Exception:
pass
def main() -> None:
try:
from playwright.sync_api import sync_playwright
except ImportError:
print("Chybí playwright: pip install playwright && playwright install chrome")
sys.exit(1)
_delete_chrome_cert_policy()
with sync_playwright() as p:
context = p.chromium.launch_persistent_context(
user_data_dir=CHROME_PROFILE,
channel="chrome",
headless=False,
slow_mo=200,
ignore_https_errors=True,
args=["--force-renderer-accessibility"],
)
try:
# Načti dříve uložené cookies (vč. session-only) z JSON
loaded = load_cookies(context)
startup = context.cookies()
vzp_start = [c for c in startup if "vzp.cz" in c.get("domain", "")]
print(f"Profil: {CHROME_PROFILE}")
print(f"Cookies z JSON: {loaded}, VZP v kontextu: {len(vzp_start)}")
page = context.new_page()
print("Naviguji na VZP Point...")
try:
page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000)
except Exception as e:
print(f"Navigace: {e}")
if page.url.startswith("https://auth.vzp.cz/signin"):
print("Přihlašovací stránka — klikám na 'Certifikát'...")
cert_btn = page.locator("a, button").filter(has_text=re.compile(r"certifikát", re.I)).first
cert_btn.wait_for(state="visible", timeout=10_000)
cert_btn.click(no_wait_after=True)
print("Pokud se zobrazí dialog výběru certifikátu, vyberte ho ručně (max 60 s)...")
time.sleep(30)
page = context.new_page()
try:
page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000)
except Exception as e:
print(f"Navigace po auth: {e}")
if not page.url.startswith("https://point.vzp.cz"):
print(f"Přihlášení selhalo. URL: {page.url}")
return
print(f"OK — přihlášení úspěšné. URL: {page.url}")
# Diagnostika: cookies po auth
after = context.cookies()
vzp_after = [c for c in after if "vzp.cz" in c.get("domain", "")]
print(f"Cookies po auth: VZP: {len(vzp_after)}")
for c in vzp_after:
exp = c.get("expires", -1)
persistent = "PERSISTENT" if exp > 0 else "SESSION-ONLY"
# Zkrácený název pro přehlednost
name = c["name"][:60]
print(f" - {name} ({c['domain']}) [{persistent}]")
print("Okno zůstane otevřené. Stiskněte Enter pro zavření...")
input()
finally:
saved = save_cookies(context)
print(f"Uloženo {saved} VZP cookies do {COOKIES_FILE}")
context.close()
if __name__ == "__main__":
main()
@@ -0,0 +1,298 @@
"""
02 - Stažení VŠECH zpráv z VZP Point schránky (jednorázová akce)
Projde celý seznam (lazy-load), stáhne všechny soubory a pojmenuje je:
YYYY-MM-DD Kategorie Název (původní_název).přípona
Použití: python 02_stahuj_vse.py
"""
import json
import os
import re
import sys
import time
import winreg
from datetime import datetime
from pathlib import Path
INBOX_URL = "https://point.vzp.cz/Inbox/Message"
CHROME_PROFILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "chrome_profile"))
COOKIES_FILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "vzp_cookies.json"))
DOWNLOAD_DIR = os.path.join(os.path.dirname(__file__), "Staženo")
def load_cookies(context) -> int:
if not os.path.exists(COOKIES_FILE):
return 0
try:
with open(COOKIES_FILE, "r", encoding="utf-8") as f:
cookies = json.load(f)
context.add_cookies(cookies)
return len(cookies)
except Exception:
return 0
def save_cookies(context) -> int:
try:
all_cookies = context.cookies()
vzp = [c for c in all_cookies if "vzp.cz" in c.get("domain", "")]
with open(COOKIES_FILE, "w", encoding="utf-8") as f:
json.dump(vzp, f, indent=2, ensure_ascii=False)
return len(vzp)
except Exception:
return 0
print(f"Chrome profil: {CHROME_PROFILE}")
print(f"Profil existuje: {os.path.exists(CHROME_PROFILE)}")
def _delete_chrome_cert_policy() -> None:
key_path = r"SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls"
try:
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, access=winreg.KEY_SET_VALUE)
winreg.DeleteValue(key, "1")
winreg.CloseKey(key)
except Exception:
pass
def parse_date(date_str: str) -> str:
"""Převede '16. 4. 2026 09:02' na '2026-04-16'."""
try:
dt = datetime.strptime(date_str.strip(), "%d. %m. %Y %H:%M")
return dt.strftime("%Y-%m-%d")
except Exception:
return "0000-00-00"
def safe_filename(name: str) -> str:
"""Odstraní znaky nevhodné pro název souboru."""
return re.sub(r'[\\/:*?"<>|]', "_", name).strip()
def build_filename(date_str: str, category: str, title: str, original: str) -> str:
"""Sestaví název souboru: YYYY-MM-DD Kategorie Název (původní).ext"""
orig_path = Path(original)
stem = orig_path.stem
ext = orig_path.suffix # včetně tečky
name = f"{parse_date(date_str)} {safe_filename(category)} {safe_filename(title)} ({safe_filename(stem)}){ext}"
# Windows limit 255 znaků
if len(name) > 240:
name = name[:230] + f"({safe_filename(stem)}){ext}"
return name
def load_all_messages(page, max_clicks: int = 0) -> None:
"""Opakovaně kliká na 'Načíst další záznamy' (přes JS). max_clicks=0 = bez omezení."""
clicks = 0
while True:
if max_clicks and clicks >= max_clicks:
break
# Hledáme tlačítko přes JS — robustnější než Playwright selektor
before_count = page.evaluate("document.querySelectorAll('.InboxMessage').length")
clicked = page.evaluate("""() => {
const btn = Array.from(document.querySelectorAll('a')).find(a => a.innerText.includes('Načíst další'));
if (btn) { btn.scrollIntoView(); btn.click(); return true; }
return false;
}""")
if not clicked:
break
clicks += 1
# Počkáme až se načtou nové zprávy (counter se zvýší)
try:
page.wait_for_function(
f"document.querySelectorAll('.InboxMessage').length > {before_count}",
timeout=15_000,
)
except Exception:
print(f" [{clicks}] Nové zprávy nenačteny, končím.")
break
after_count = page.evaluate("document.querySelectorAll('.InboxMessage').length")
print(f" [{clicks}] Načteno {after_count} zpráv (přibyly {after_count - before_count})")
time.sleep(0.3)
def collect_messages(page) -> list[dict]:
"""Projde DOM přes JS a vrátí seznam zpráv se všemi potřebnými údaji."""
data = page.evaluate("""() => {
const results = [];
for (const msg of document.querySelectorAll('.InboxMessage')) {
// Kategorie: title atribut ikony v .InboxMessage-row--type
const typeIcon = msg.querySelector('.InboxMessage-row--type i[title]');
const category = typeIcon ? typeIcon.title.trim() : '';
// Název + název souboru: z title atributů na h3 a a.InboxMessage-title-link
const titleEl = msg.querySelector('h3.InboxMessage-title');
const title = titleEl ? titleEl.title.trim() : '';
const linkEl = msg.querySelector('a.InboxMessage-title-link');
const linkTitle = linkEl ? linkEl.title.trim() : ''; // "Stáhnout soubor xyz.pdf"
const original = linkTitle.split(/\\s+/).pop(); // "xyz.pdf"
// Datum: .InboxMessage-row bez dalších modifikátorů
let date = '';
for (const row of msg.querySelectorAll('.InboxMessage-row')) {
if (row.className.trim() === 'InboxMessage-row') {
date = row.innerText.trim();
break;
}
}
results.push({ title, category, date, original });
}
return results;
}""")
# Playwright locatory — každá zpráva má svůj download link uvnitř .InboxMessage
inbox_msgs = page.locator(".InboxMessage").all()
messages = []
for i, item in enumerate(data):
if i < len(inbox_msgs):
msg_el = inbox_msgs[i]
dl = msg_el.locator(".InboxMessage-row--download .i-l")
if dl.count() > 0:
item["link_locator"] = dl
item["link_type"] = "download"
else:
zobrazit = msg_el.locator(".InboxMessage-row--download .i-r-1")
item["link_locator"] = zobrazit if zobrazit.count() > 0 else None
item["link_type"] = "zobrazit" if zobrazit.count() > 0 else None
item["msg_locator"] = msg_el
else:
item["link_locator"] = None
item["link_type"] = None
messages.append(item)
return messages
def main() -> None:
try:
from playwright.sync_api import sync_playwright
except ImportError:
print("Chybí playwright: pip install playwright && playwright install chrome")
sys.exit(1)
os.makedirs(DOWNLOAD_DIR, exist_ok=True)
_delete_chrome_cert_policy()
with sync_playwright() as p:
context = p.chromium.launch_persistent_context(
user_data_dir=CHROME_PROFILE,
channel="chrome",
headless=False,
slow_mo=100,
ignore_https_errors=True,
accept_downloads=True,
args=["--force-renderer-accessibility"],
downloads_path=DOWNLOAD_DIR,
)
try:
loaded = load_cookies(context)
print(f"Cookies načtené z JSON: {loaded}")
page = context.new_page()
print("Naviguji na VZP Point schránku...")
try:
page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000)
except Exception as e:
print(f"Navigace: {e}")
if page.url.startswith("https://auth.vzp.cz/signin"):
print("Přihlašovací stránka — klikám na 'Certifikát'...")
cert_btn = page.locator("a, button").filter(has_text=re.compile(r"certifikát", re.I)).first
cert_btn.wait_for(state="visible", timeout=10_000)
cert_btn.click(no_wait_after=True)
print("Pokud se zobrazí dialog výběru certifikátu, vyberte ho ručně (max 60 s)...")
time.sleep(60)
page = context.new_page()
try:
page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000)
except Exception as e:
print(f"Navigace po auth: {e}")
if not page.url.startswith("https://point.vzp.cz"):
print(f"Přihlášení selhalo. URL: {page.url}")
return
print("Přihlášení OK. Načítám všechny zprávy (lazy-load)...")
page.wait_for_load_state("networkidle", timeout=15_000)
load_all_messages(page, max_clicks=0)
print("Sbírám seznam zpráv...")
messages = collect_messages(page)
print(f"Nalezeno {len(messages)} zpráv.")
already = set(os.listdir(DOWNLOAD_DIR))
downloaded = 0
skipped = 0
for i, msg in enumerate(messages, 1):
filename = build_filename(msg["date"], msg["category"], msg["title"], msg["original"])
target = os.path.join(DOWNLOAD_DIR, filename)
if filename in already or os.path.exists(target):
skipped += 1
continue
if msg["link_locator"] is None:
print(f"[{i}/{len(messages)}] Přeskakuji (bez odkazu): {filename}")
continue
print(f"[{i}/{len(messages)}] Stahuji: {filename}")
if msg["link_type"] == "download":
try:
with page.expect_download(timeout=30_000) as dl_info:
msg["link_locator"].dispatch_event("click")
dl_info.value.save_as(target)
already.add(filename)
downloaded += 1
time.sleep(0.3)
except Exception as e:
print(f" Chyba při stahování '{filename}': {e}")
elif msg["link_type"] == "zobrazit":
try:
msg["link_locator"].click()
# Počkej na rozbalený obsah
footer = msg["msg_locator"].locator(".InboxMessage-footer")
footer.wait_for(state="visible", timeout=10_000)
time.sleep(0.5)
# Ulož text zprávy jako .txt (bez sekce příloh)
text_el = footer.locator("div").first
text = text_el.inner_text().strip()
txt_target = Path(target).with_suffix(".txt")
txt_target.write_text(text, encoding="utf-8")
already.add(txt_target.name)
downloaded += 1
print(f" Uložen text: {txt_target.name}")
# Stáhni přílohy uvnitř zprávy
attach_links = footer.locator("a.i-l").all()
for al in attach_links:
orig = al.get_attribute("title", timeout=2_000) or ""
orig_name = orig.split()[-1] if orig else "priloha"
att_filename = build_filename(msg["date"], msg["category"], msg["title"], orig_name)
att_target = os.path.join(DOWNLOAD_DIR, att_filename)
if not os.path.exists(att_target):
with page.expect_download(timeout=30_000) as dl_info:
al.dispatch_event("click")
dl_info.value.save_as(att_target)
already.add(att_filename)
downloaded += 1
print(f" Stažena příloha: {att_filename}")
time.sleep(0.3)
except Exception as e:
print(f" Chyba při zobrazení '{filename}': {e}")
print(f"\nHotovo. Staženo: {downloaded}, přeskočeno (již existuje): {skipped}")
finally:
saved = save_cookies(context)
print(f"Uloženo {saved} VZP cookies.")
context.close()
if __name__ == "__main__":
main()
@@ -0,0 +1,122 @@
[
{
"name": "ai_user",
"value": "wIhK13IopJb2nNjRoWMJvz|2026-04-19T06:43:49.112Z",
"domain": "auth.vzp.cz",
"path": "/",
"expires": 1808117029.11323,
"httpOnly": false,
"secure": true,
"sameSite": "None"
},
{
"name": ".Idm.DSID",
"value": "0ecc5408-424f-4c12-8363-906a5db2146b",
"domain": "auth.vzp.cz",
"path": "/",
"expires": 1808117548.882756,
"httpOnly": true,
"secure": false,
"sameSite": "Lax"
},
{
"name": "ai_user",
"value": "McvWEZRk5dmTYStEe5/hwu|2026-04-19T06:43:55.622Z",
"domain": "point.vzp.cz",
"path": "/",
"expires": 1808117035.623945,
"httpOnly": false,
"secure": true,
"sameSite": "None"
},
{
"name": "ARRAffinity",
"value": "e4a2ec12b67fad29b69e0e95414615d6e962fc20458e5c13ed7f203c2a1918e2",
"domain": ".point.vzp.cz",
"path": "/",
"expires": -1,
"httpOnly": true,
"secure": true,
"sameSite": "Lax"
},
{
"name": "ARRAffinitySameSite",
"value": "e4a2ec12b67fad29b69e0e95414615d6e962fc20458e5c13ed7f203c2a1918e2",
"domain": ".point.vzp.cz",
"path": "/",
"expires": -1,
"httpOnly": true,
"secure": true,
"sameSite": "None"
},
{
"name": "ARRAffinity",
"value": "123f0451d6e23dba3c23f29a23c095e2b0d94b97199afeda26565c8c745dfaad",
"domain": ".auth.vzp.cz",
"path": "/",
"expires": -1,
"httpOnly": true,
"secure": true,
"sameSite": "Lax"
},
{
"name": "ARRAffinitySameSite",
"value": "123f0451d6e23dba3c23f29a23c095e2b0d94b97199afeda26565c8c745dfaad",
"domain": ".auth.vzp.cz",
"path": "/",
"expires": -1,
"httpOnly": true,
"secure": true,
"sameSite": "None"
},
{
"name": "ARRAffinity",
"value": "e4a2ec12b67fad29b69e0e95414615d6e962fc20458e5c13ed7f203c2a1918e2",
"domain": ".auth-cert27.vzp.cz",
"path": "/",
"expires": -1,
"httpOnly": true,
"secure": true,
"sameSite": "Lax"
},
{
"name": "ARRAffinitySameSite",
"value": "e4a2ec12b67fad29b69e0e95414615d6e962fc20458e5c13ed7f203c2a1918e2",
"domain": ".auth-cert27.vzp.cz",
"path": "/",
"expires": -1,
"httpOnly": true,
"secure": true,
"sameSite": "None"
},
{
"name": ".AspNetCore.IdmLocalAuth",
"value": "CfDJ8NceE7GPS1hCryl8w53d2tP-WDIbKwQOm0PlEZKlhcodUJYYecsniNTkHawEjQ9PMigigH1LFBhyMF7juithdonBzehldUgN-wgWEuahycGLsUeAcTFiBMy_6h8pgbR086OAxegeBHFmiuMKXJxch88_QC_j1TeStgcgTazXIh7SpKi4fG6kyOxEr5VGMy0xlLviRmbGriAQr19-ptAJf1EGLiIDN2xx0JWapl8KPc1mVAEmwQRbXxW-WXQSDiio6TWvKVdeWy5UCk7QC-wHMfWr9CQ6UoemOFoXvmX9BmqnTtJg6_cXYyc3T1dJunc67a-JlUZJlwblj2ePi2c4KrpYAzE6gH9mheOkTgzJ9kgbEFJ4psimmWexS2SDnMCxNCRp9RFhlipc-RIMJx4NgDhvFy3nKWKP2vxkj0Y-WTiJQSkJzJSR8T_M5WaUnGPy2wTxOelTupjzsHvCad8OonqjSrzYnWBp1NdkuEbl7S3vQ_QHmpygTGGGw4mljcjJb-iFAjafrVsvmkZEdNPACHM7UG-URBhLJh_uWHxZvei8qhW_F86hqqbpraPAfBTw9ShEGCx5vkwuLANbACvIvmkvsRww4BUaHuDy3IugYqI8Xy_34k1eKpaxyNYMZY7kbParYXGy9UZXV0p0DEGAbG52dXiBwpoBXlfXDWrw9hNHpilvZ9fueTa8J2TaMA_FFqbNO8CLSrosfzj3JQ0hTD6HumaX6QircCyHPFHwlcUX",
"domain": "auth.vzp.cz",
"path": "/",
"expires": -1,
"httpOnly": true,
"secure": true,
"sameSite": "Lax"
},
{
"name": ".BDesk.FrontUI.IdmAuth.Cookie",
"value": "CfDJ8COR4DcdV-9Jh-xmwD9F8p2T8-lGdNJ7_FMrxohKxLpsmMzG5wkVsVU5Z-xejDVwd_2hWYl61EWRFn2H7xzIbstM1Iu0A5eSfpu7tcvhYqOlSk3UNtHC2Z7YFXIufMqx8q5GmfItsUdDhoG1dbqsuJ_VYObJnXBKu8oSxUTYYl_di9etizSM9854nu2TzhE0i9VolXLBOIfaOrQR5__es8iCWWJ8fWgSuUUjFF8UEfxcUK2KWC9z8DIgN7R-ZD5vsJ7WXNPNzicwt5ExcK-CmOdsOeKl-O_WDbLcCWYmm12YNvyJxESmnsgyGi37HSezTRyS34MR_FpeYGw3G2CRFVCwvRLAWA2Y90TQ3uhNkSpnZbrN6mgnPUQAq5tjx5PD7Tnh2V8Emmvr2_XS4gOPP6ZB5DUvZxhC4R1Zheisr1wbj1K6wLW7POqdfPAmkxugPvgK0Vp12OGrDrBkip1_9sZt5Z5AyNfhf8_6rYRQ4ZiUNE69C4c5p3BmQET6Amd4daH4vIsTp6ilPa2Xei2QIqyIhAt87Uk0bIu3DofYQQ0gsRZ_qyo7cwLbTEZU7uGmV5lRGUqW0X0oZSYxgP4wiZmpnt9zmZh56-TRWrNGNdenAGeTEDIVqf0s2ct6Z69HRGmHwmgvKuycvew38rfpdwAmvi9gfXzkoDOqf_EaO6XvDWUbNanTJ9QyWMK2PaPdSQc6ZqyZqxzMgl7Ihg8zNZestjz0z2VL4N3iCL0slnLPJrASV3C1Ky8sstjRz5R4J4AaZgxAQTByhMV5rKlBP-Vk7tSxi2w6FyMn_5D5ENzIvfI43G0qgL72Ss3u1j_NCytlT6ROKWY-OTQDcVOwhncK3oulafxLVTIEy5zTt8EU9DGMS_3-Pf2NLVGAyuiFD2lJzEkQpzpvt0bjj-L0njVUHTmGibi8RopAu7sgu-ASVFhH7qAqalE2gv7elkyL9nGeehy3rpBQ5NnuJd5Xv2nUzsxJxfXgZooddCyE3xVAFYd5RRby6iQek264lzXWdbuEZSMNADwiqJvWgAkuMNtBOIUipf5btRZCmCGBxB3WjjnDMCsdI3LHU-7-Pvyc1iuHAijcVLu0fVR-OJMz3RdISl4svmFJO6hERBlN_abxC_i25eeck9GuEWZkVo-Hj0c0BQghZ_Jy22iILQLcgcszOLtQlPWT_szDM4BkuHMzgf3QOJg-Qdqt77MqgUyIz9eta5zTnqLCi7GkKQtvgAgCKJ_LmhEUvA2jCDkc7dW8GS-t-JjqYOOpt3hbI1drX90T72iXtFAqxVsXwYBQ6-_AzZEw7pGl9idizQOIcX7_hiOgn8cl1aQ6JO9DJ6nxM-aSCj34wb_y4wY9MBRgutjhOmR5hFP4l4gLP06po8e-nbTHHiY7Fcj2V4AessnoJZuf9zk8E5wTo--5nxQzpHFDHcuJNv_rooeZ7H7pr0qGck4uP0_RHLtTCRxWLz9dlcPFMwvRhvB4tScd5nXnRRbxoNKSZ6cFSYGTnGU2-GG1GIgwOBb3LBAUVFxFBz6kq_U4iSmcfFDmgJRATxf-AZwWN4SK_e3T1k3emxGPf7SZCk7IRjaVly4YCbZs4UmrW3XoYG9O0zU2-UTb9x-aQ7YM8gVlcyUEeUhBsmsom-7X45ZceTBbUTzdJSDeNH0rpKnKSLeHu6lHnAa2LX3gSQPUy6ah-fOePE3qAw25G6sEIvvgcfentJEWzrcpPqf7jbYe5_D6GHJiBEgWo_NC-IntOU4tcGCotCws9MbGC278vBsNfAeiaKdiPtwswl7JkOZzJJKLhjoFoArvsIHAtzEIO3h-XPuS4aprh7JjCprwMRJzq8bz0BZkn5z44u__JkfnfSlKgi2v5eemMec6_MhSPM8K5hYFAmUf5l5CbF7RM16K56V4YMIgNnIoVUue5rxO74krJ75JRzyN1h1i325fTK5y-rLvzSGNJmruwGckeoFT5D7ir1P7YTAQCzBgns53HbIEhYwBv1e4XnOiy8JozX_8bO2NupbSEKmxn-5n9DfjeUsnq8WdX1scVC4g-qWtsI83uePA64hMvdwtuCl8vRXQQ591-hHsKnrC5IGxharce74_OLY-ztmPOaeUFi22bWYr5bqSCTUT9t5AN7Pe0-pKUHw7iedjU2CF77vLg14oQfwYy12xFpy5wq_rGCWpqTsQBaQAc2cLqudgBQhL1qnEGbHX5HqGJhH2RhhWKaLWV69x2jEgdGSUIJ_qXpws2CSggcZP_3CrdeXumPm61hGzgbhBacyR5xI1xB2jYoLraPO5Fx-xxNkhESjqvdaxZ9Mhs7l3_az7byf_GVBa0dtInqXwpRIJzg1CZYGKf6VeTDKO6_CghT4V9CHB3LtAvx96Pwd3UP1-9RYsrXIUFO06MivvzI4f3i0K_kFpWyOiIGoxZo9F50gjpvM_HNAqH3TGNwoMWi03TxAScdvILQ5EeZfivPeeTDIggR4JWHIhWE75Xrum3-b4CU76PLnWNNExJCMghwruGnwZ17K1aeOUCSpaT6KZ9XXtFqLsLRRiR9Zu2h3dgyq9-PsTzOafitknWu7K17DUiq5AAnA",
"domain": "point.vzp.cz",
"path": "/",
"expires": -1,
"httpOnly": true,
"secure": true,
"sameSite": "Lax"
},
{
"name": "ai_session",
"value": "BonOMZ0/OAueln06g3C+LL|1776598812296|1776598887566",
"domain": "point.vzp.cz",
"path": "/",
"expires": 1776600687.567691,
"httpOnly": false,
"secure": true,
"sameSite": "None"
}
]