168 lines
5.4 KiB
Python
168 lines
5.4 KiB
Python
"""
|
|
01 - Přihlášení na portál VoZP — extrakce cookies (jako admin).
|
|
|
|
POSTUP:
|
|
1. Spusť: python 01_prihlaseni.py
|
|
2. Vyskočí UAC — schval (skript potřebuje admin pro čtení Chrome cookies
|
|
kvůli App-Bound Encryption v Chrome v130+).
|
|
3. Otevře se nové okno s běžícím skriptem (admin).
|
|
4. Skript otevře Chrome (jako user) na VoZP login.
|
|
5. Přihlas se certifikátem (NMSigner vyskočí — klikni ANO).
|
|
6. Vrať se k Chrome → ZAVŘI ho (všechna okna).
|
|
7. Stiskni Enter v admin okně skriptu.
|
|
8. Cookies se uloží do vozp_cookies.json.
|
|
|
|
POŽADAVKY:
|
|
pip install rookiepy
|
|
"""
|
|
|
|
import ctypes
|
|
import json
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
|
|
LOGIN_URL = "https://portal.vozp.cz/app/prihlaseni"
|
|
INBOX_URL = "https://portal.vozp.cz/app/prehled-zprav-ve-schrankach"
|
|
COOKIES_FILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "vozp_cookies.json"))
|
|
|
|
|
|
def is_admin() -> bool:
|
|
try:
|
|
return ctypes.windll.shell32.IsUserAnAdmin() != 0
|
|
except Exception:
|
|
return False
|
|
|
|
|
|
def relaunch_as_admin() -> None:
|
|
print("Skript potřebuje admin práva (Chrome v130+ App-Bound Encryption).")
|
|
print("Otevírám UAC...")
|
|
params = " ".join(f'"{a}"' for a in sys.argv)
|
|
ret = ctypes.windll.shell32.ShellExecuteW(
|
|
None, "runas", sys.executable, params, None, 1
|
|
)
|
|
if ret <= 32:
|
|
print(f"UAC selhalo (kód {ret}). Spusť ručně jako admin.")
|
|
sys.exit(1)
|
|
sys.exit(0)
|
|
|
|
|
|
def open_chrome_as_user(url: str) -> None:
|
|
"""Spustí default browser jako standardní user, i když Python běží jako admin."""
|
|
# explorer.exe běží jako user a otevře URL v defaultním prohlížeči
|
|
try:
|
|
subprocess.Popen(["explorer.exe", url])
|
|
return
|
|
except Exception:
|
|
pass
|
|
# Fallback
|
|
import webbrowser
|
|
webbrowser.open(url)
|
|
|
|
|
|
def read_cookies_rookiepy() -> list[dict]:
|
|
import rookiepy
|
|
raw = rookiepy.chrome(["vozp.cz", ".vozp.cz", "portal.vozp.cz", "portalzp.cz"])
|
|
out = []
|
|
for c in raw:
|
|
dom = c["domain"]
|
|
if not any(d in dom for d in ["vozp.cz", "portalzp.cz"]):
|
|
continue
|
|
out.append({
|
|
"name": c["name"],
|
|
"value": c["value"],
|
|
"domain": dom if dom.startswith(".") else "." + dom,
|
|
"path": c.get("path") or "/",
|
|
"expires": int(c["expires"]) if c.get("expires") else -1,
|
|
"secure": bool(c.get("secure", False)),
|
|
"httpOnly": bool(c.get("http_only", False)),
|
|
"sameSite": "Lax",
|
|
})
|
|
return out
|
|
|
|
|
|
def read_cookies_browser_cookie3() -> list[dict]:
|
|
import browser_cookie3
|
|
cj = browser_cookie3.chrome(domain_name="vozp.cz")
|
|
out = []
|
|
for c in cj:
|
|
if not any(d in c.domain for d in ["vozp.cz", "portalzp.cz"]):
|
|
continue
|
|
out.append({
|
|
"name": c.name,
|
|
"value": c.value,
|
|
"domain": c.domain if c.domain.startswith(".") else "." + c.domain,
|
|
"path": c.path or "/",
|
|
"expires": int(c.expires) if c.expires else -1,
|
|
"secure": bool(c.secure),
|
|
"httpOnly": False,
|
|
"sameSite": "Lax",
|
|
})
|
|
return out
|
|
|
|
|
|
def main() -> None:
|
|
if not is_admin():
|
|
relaunch_as_admin()
|
|
return # nedosažitelné
|
|
|
|
print("=" * 60)
|
|
print("BĚŽÍM JAKO ADMIN — PŘIHLÁŠENÍ DO VoZP")
|
|
print("=" * 60)
|
|
print(f"1. Otevírám Chrome (jako user) na: {LOGIN_URL}")
|
|
print("2. Přihlas se certifikátem (NMSigner → klikni ANO)")
|
|
print("3. Po přihlášení ZAVŘI Chrome úplně (všechna okna)")
|
|
print("4. Vrať se sem a stiskni Enter")
|
|
print("=" * 60)
|
|
|
|
open_chrome_as_user(LOGIN_URL)
|
|
|
|
input("\nAž jsi přihlášen/a a Chrome ZAVŘENÝ, stiskni Enter...")
|
|
|
|
cookies: list[dict] = []
|
|
last_err = ""
|
|
|
|
print("\nČtu cookies (jako admin)...")
|
|
try:
|
|
cookies = read_cookies_rookiepy()
|
|
print(f" rookiepy OK: {len(cookies)} cookies")
|
|
except ImportError:
|
|
last_err = "rookiepy není nainstalovaný"
|
|
print(f" {last_err} — zkouším browser_cookie3...")
|
|
except Exception as e:
|
|
last_err = f"rookiepy: {e}"
|
|
print(f" rookiepy selhalo: {e} — zkouším browser_cookie3...")
|
|
|
|
if not cookies:
|
|
try:
|
|
cookies = read_cookies_browser_cookie3()
|
|
print(f" browser_cookie3 OK: {len(cookies)} cookies")
|
|
except ImportError:
|
|
print(" browser_cookie3 není nainstalovaný.")
|
|
except Exception as e:
|
|
print(f" browser_cookie3: {e}")
|
|
|
|
if not cookies:
|
|
print("\nCookies se nepodařilo přečíst ani jako admin.")
|
|
print("Zkontroluj, že:")
|
|
print(" - Chrome je úplně zavřený (Task Manager → žádný chrome.exe)")
|
|
print(" - Jsi se na VoZP přihlásil/a (DB má nové záznamy)")
|
|
print(" - Máš nainstalované: pip install rookiepy browser-cookie3")
|
|
input("\nEnter pro zavření...")
|
|
sys.exit(1)
|
|
|
|
with open(COOKIES_FILE, "w", encoding="utf-8") as f:
|
|
json.dump(cookies, f, indent=2, ensure_ascii=False)
|
|
|
|
print(f"\nUloženo {len(cookies)} cookies do {COOKIES_FILE}")
|
|
for c in cookies:
|
|
exp = c["expires"]
|
|
tag = "PERSISTENT" if exp > 0 else "SESSION"
|
|
print(f" - {c['name'][:50]} ({c['domain']}) [{tag}]")
|
|
|
|
input("\nHotovo. Enter pro zavření...")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|