Ferdig på Windows for dagen

This commit is contained in:
Erol 2026-03-05 17:44:18 +01:00
parent f25331c5f0
commit 5e94ce0755

View file

@ -26,8 +26,6 @@ DB_URL = os.getenv("DATABASE_URL", "postgresql://teeoff_admin:teeoff_secret_pass
client = genai.Client() client = genai.Client()
async def ask_llm_status(text, course_name, is_single_course, ai_instruction=None): async def ask_llm_status(text, course_name, is_single_course, ai_instruction=None):
"""Sender teksten til Gemini og ber om ett enkelt status-ord tilbake."""
if is_single_course: if is_single_course:
bane_instruks = "Finn den generelle banestatusen for dette golfanlegget. Se bort fra spesifikke banenavn, da anlegget kun har én bane." bane_instruks = "Finn den generelle banestatusen for dette golfanlegget. Se bort fra spesifikke banenavn, da anlegget kun har én bane."
else: else:
@ -72,7 +70,6 @@ async def ask_llm_status(text, course_name, is_single_course, ai_instruction=Non
print(f" 🧠 GEMINI RÅ-SVAR: '{svar}'") print(f" 🧠 GEMINI RÅ-SVAR: '{svar}'")
# --- NYTT: SORTERT SIKKERHETSFILTER --- # --- NYTT: SORTERT SIKKERHETSFILTER ---
# De lengste/mest spesifikke må stå først!
gyldige_svar = [ gyldige_svar = [
"aapen_med_vintergreener", "aapen_med_vintergreener",
"aapner_snart", "aapner_snart",
@ -192,7 +189,7 @@ async def run_daily_scraping(facility_ids=None):
try: try:
print(f"🔍 Besøker {f['name']} (Metode: {method})...") print(f"🔍 Besøker {f['name']} (Metode: {method})...")
await page.goto(f['scrape_status_url'], timeout=60000, wait_until="domcontentloaded") await page.goto(f['scrape_status_url'], timeout=60000, wait_until="domcontentloaded")
await asyncio.sleep(3) await page.wait_for_timeout(3000)
full_text = "" full_text = ""
@ -223,8 +220,8 @@ async def run_daily_scraping(facility_ids=None):
warnings.append(f"{f['name']}: Fant ikke knappen å klikke på: '{btn_selector}'") warnings.append(f"{f['name']}: Fant ikke knappen å klikke på: '{btn_selector}'")
continue continue
await btn.click() await btn.click(force=True)
await asyncio.sleep(2) await page.wait_for_timeout(2000)
element = page.locator(text_selector).first element = page.locator(text_selector).first
if await element.count() == 0: if await element.count() == 0:
@ -235,24 +232,37 @@ async def run_daily_scraping(facility_ids=None):
elif method == 'llm_parse': elif method == 'llm_parse':
print(" 🖱️ Leter etter knapper å klikke på for å avdekke skjult tekst...") print(" 🖱️ Leter etter knapper å klikke på for å avdekke skjult tekst...")
knapper = await page.get_by_text(re.compile(r"banestatus|dagens status|se status|baneinfo", re.IGNORECASE)).all() knapper = await page.get_by_text(re.compile(r"banestatus|dagens status|se status|se dagens status|baneinfo|\bstatus\b", re.IGNORECASE)).all()
klikk_count = 0
for knapp in knapper: for knapp in knapper:
try: try:
if await knapp.is_visible(): if await knapp.is_visible():
await knapp.click(timeout=3000) await knapp.click(timeout=2000, force=True)
print(" 🎯 Klikket på en status-knapp! Venter 2 sekunder...") klikk_count += 1
await asyncio.sleep(2) await page.wait_for_timeout(2000)
break
except Exception: except Exception:
pass pass
if klikk_count > 0:
print(f" 🎯 Tvangsklikket på {klikk_count} status-knapp(er)! Venter ekstra på at innholdet laster...")
await page.wait_for_timeout(2000)
else:
print(" ⚠️ Fant ingen knapper å klikke på.")
# --- NYTT: HENTER OGSÅ SKJULT TEKST (For Scangolf megamenyer) ---
element = page.locator("body").first element = page.locator("body").first
if await element.count() == 0: if await element.count() == 0:
warnings.append(f"{f['name']}: Klarte ikke å lese siden for AI-tolkning") warnings.append(f"{f['name']}: Klarte ikke å lese siden for AI-tolkning")
continue continue
råtekst = await element.inner_text()
synlig_tekst = await element.inner_text() or ""
skjult_tekst = await element.text_content() or ""
# Slår sammen all tekst slik at Gemini får med seg menyer som er gjemt med CSS
råtekst = synlig_tekst + " " + skjult_tekst
full_text = " ".join(råtekst.split()) full_text = " ".join(råtekst.split())
# ----------------------------------------------------------------
else: else:
warnings.append(f"⚠️ {f['name']}: Ukjent skrapemetode i databasen: '{method}'") warnings.append(f"⚠️ {f['name']}: Ukjent skrapemetode i databasen: '{method}'")
@ -265,6 +275,7 @@ async def run_daily_scraping(facility_ids=None):
is_single_course = len(courses) == 1 is_single_course = len(courses) == 1
for c in courses: for c in courses:
old_status = c['status'] or "ukjent"
if method == 'llm_parse': if method == 'llm_parse':
print(f" 🤖 Spør Gemini om status for '{c['name']}' (Singelbane: {is_single_course})...") print(f" 🤖 Spør Gemini om status for '{c['name']}' (Singelbane: {is_single_course})...")
@ -279,14 +290,19 @@ async def run_daily_scraping(facility_ids=None):
warnings.append(f"{f['name']} ({c['name']}): Fant ikke søkeordet '{c['scrape_keyword']}' i teksten.") warnings.append(f"{f['name']} ({c['name']}): Fant ikke søkeordet '{c['scrape_keyword']}' i teksten.")
continue continue
old_status = c['status'] or "ukjent" # --- OPPDATERT LOGIKK (Fikser logg-buggen) ---
if new_status != old_status and new_status != "ukjent": if new_status == "ukjent":
# Sikkerhetsnettet slår inn: Vi beholder gammel status!
warnings.append(f"⚠️ {f['name']} ({c['name']}): Fant ikke status. Beholder '{old_status.upper()}'.")
print(f" 🟡 KONKLUSJON: Fant ikke status i teksten (Sikkerhetsnett). Beholder gammel status ({old_status.upper()}).")
elif new_status != old_status:
await conn.execute("UPDATE courses SET status = $1 WHERE id = $2", new_status, c['id']) await conn.execute("UPDATE courses SET status = $1 WHERE id = $2", new_status, c['id'])
changes.append(f"🔹 {f['name']} ({c['name']}): {old_status.upper()}{new_status.upper()}") changes.append(f"🔹 {f['name']} ({c['name']}): {old_status.upper()}{new_status.upper()}")
print(f" 🟢 KONKLUSJON: Status endret fra {old_status.upper()} til {new_status.upper()}") print(f" 🟢 KONKLUSJON: Status endret fra {old_status.upper()} til {new_status.upper()}")
else: else:
successes.append(f"{f['name']} ({c['name']}): {new_status.upper()}") successes.append(f"{f['name']} ({c['name']}): {new_status.upper()}")
print(f" ⚪ KONKLUSJON: Ingen endring. Banen er fortsatt {new_status.upper()}") print(f" ⚪ KONKLUSJON: Ingen endring. Banen er fortsatt {old_status.upper()}")
# ---------------------------------------------
except Exception as e: except Exception as e:
err_msg = str(e).split('\n')[0] err_msg = str(e).split('\n')[0]