Ferdig på Windows for dagen
This commit is contained in:
parent
f25331c5f0
commit
5e94ce0755
1 changed files with 31 additions and 15 deletions
|
|
@ -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]
|
||||
|
|
|
|||
Loading…
Reference in a new issue