-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplny_zavod.py
More file actions
132 lines (114 loc) · 4.67 KB
/
plny_zavod.py
File metadata and controls
132 lines (114 loc) · 4.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# --- Standardní knihovny ---
import time
import smtplib
from datetime import datetime
from email.message import EmailMessage
import subprocess
import sys
import platform
from check_version import zkontroluj_a_aktualizuj
if __name__ == "__main__":
global_env = (len(sys.argv) == 2 and sys.argv[1] == "global")
zkontroluj_a_aktualizuj(global_env)
# --- Externí knihovny ---
from playwright.sync_api import sync_playwright, TimeoutError
# --- Lokální moduly ---
from data import (
EMAIL_P, EMAIL_U, LOGIN, URL, INTERVAL, EMAIL_PROVIDER
)
from main import EMAIL_PROVIDERS
LIMIT = 10000 # kolikrát maximálně kontrolovat
def run() -> None:
print("")
try:
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
try:
page.goto(URL, timeout=10000, wait_until="domcontentloaded")
except Exception as e:
print(f"❌ Nelze načíst stránku závodu. {e}")
return
attempts = 0
while attempts < LIMIT:
attempts += 1
try:
try:
page.reload(wait_until="domcontentloaded", timeout=15000)
except TimeoutError:
print("⚠️ Timeout při reloadu, zkouším po pauze 30s…")
time.sleep(30)
continue
label = page.locator("xpath=//div[normalize-space()='Počet registrovaných:']").first
value_div = label.locator("xpath=following-sibling::div[1]")
value_div.wait_for(timeout=5000)
pocet_text = value_div.inner_text().strip()
left, right = pocet_text.split("/", 1)
pocet = int(left.strip())
kapacita = int(right.strip().split()[0])
if pocet < kapacita:
print("✅ Volné místo!")
poslat_informaci()
if platform.system() == "Linux":
subprocess.Popen(["./run.sh"], shell=True)
else:
if global_env:
subprocess.Popen(["start", "cmd", "/k", "run_GLOBAL.bat"], shell=True)
else:
subprocess.Popen(["start", "cmd", "/k", "run.bat"], shell=True)
return
print(datetime.now().strftime("%H:%M:%S"))
print(f"Závod je plně obsazen ({pocet} z {kapacita}). "
f"Další kontrola za {int(INTERVAL/60)} minut.")
print(f"Jakmile se uvolní místo, budu informovat {LOGIN}.\n")
time.sleep(INTERVAL)
except Exception as e:
print(f"⚠️ Chyba: {e}. Opakuji po pauze…")
time.sleep(INTERVAL)
continue
print(f"⏹️ Konec po {LIMIT} pokusech bez volného místa.")
except Exception as e:
print(f"❌ Neošetřená chyba v run(): {e}")
def poslat_informaci() -> None:
msg = EmailMessage()
msg['Subject'] = '✅ Uvolnilo se místo v závodě!'
msg['From'] = EMAIL_U
msg['To'] = LOGIN
msg.set_content(
f"""Ve sledovaném závodě {URL} se uvolnilo místo! Byl spuštěn registrační skript.
Toto je automatizovaný email."""
)
odeslat(msg)
def odeslat(msg: str) -> bool:
try:
if EMAIL_PROVIDER not in EMAIL_PROVIDERS:
print(f"❌ Poskytovatel emailových služeb {EMAIL_PROVIDER} není implementován. Email nebyl odeslán.")
return False
elif EMAIL_PROVIDER == "PROTON":
with smtplib.SMTP('127.0.0.1', 1025) as smtp:
smtp.login(EMAIL_U, EMAIL_P)
smtp.send_message(msg)
return True
elif EMAIL_PROVIDER == "PROTON-TOKEN":
with smtplib.SMTP('smtp.protonmail.ch', 587) as smtp:
smtp.starttls()
smtp.login(EMAIL_U, EMAIL_P)
smtp.send_message(msg)
return True
elif EMAIL_PROVIDER == "GMAIL":
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
smtp.login(EMAIL_U, EMAIL_P)
smtp.send_message(msg)
return True
else:
return False
except Exception as e:
print(f"Chyba {e}")
return False
if __name__ == "__main__":
try:
run()
except KeyboardInterrupt:
print("\nProgram ukončen uživatelem.")
except Exception as e:
print(f"Neočekávaná chyba: {e}")