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()
|
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]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue