diff --git a/backend/scrape_status.py b/backend/scrape_status.py index 7853eb0..fb12838 100644 --- a/backend/scrape_status.py +++ b/backend/scrape_status.py @@ -26,8 +26,6 @@ DB_URL = os.getenv("DATABASE_URL", "postgresql://teeoff_admin:teeoff_secret_pass client = genai.Client() 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: bane_instruks = "Finn den generelle banestatusen for dette golfanlegget. Se bort fra spesifikke banenavn, da anlegget kun har én bane." 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}'") # --- NYTT: SORTERT SIKKERHETSFILTER --- - # De lengste/mest spesifikke må stå først! gyldige_svar = [ "aapen_med_vintergreener", "aapner_snart", @@ -192,7 +189,7 @@ async def run_daily_scraping(facility_ids=None): try: print(f"🔍 Besøker {f['name']} (Metode: {method})...") await page.goto(f['scrape_status_url'], timeout=60000, wait_until="domcontentloaded") - await asyncio.sleep(3) + await page.wait_for_timeout(3000) 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}'") continue - await btn.click() - await asyncio.sleep(2) + await btn.click(force=True) + await page.wait_for_timeout(2000) element = page.locator(text_selector).first if await element.count() == 0: @@ -235,24 +232,37 @@ async def run_daily_scraping(facility_ids=None): elif method == 'llm_parse': 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: try: if await knapp.is_visible(): - await knapp.click(timeout=3000) - print(" 🎯 Klikket på en status-knapp! Venter 2 sekunder...") - await asyncio.sleep(2) - break + await knapp.click(timeout=2000, force=True) + klikk_count += 1 + await page.wait_for_timeout(2000) except Exception: 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 if await element.count() == 0: warnings.append(f"❌ {f['name']}: Klarte ikke å lese siden for AI-tolkning") 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()) + # ---------------------------------------------------------------- else: 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 for c in courses: + old_status = c['status'] or "ukjent" if method == 'llm_parse': 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.") continue - old_status = c['status'] or "ukjent" - if new_status != old_status and new_status != "ukjent": + # --- OPPDATERT LOGIKK (Fikser logg-buggen) --- + 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']) 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()}") else: 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: err_msg = str(e).split('\n')[0]