Nye-TeeOff/backend/test_gemini.py

116 lines
4.4 KiB
Python
Raw Permalink Normal View History

2026-03-05 05:18:03 +01:00
import asyncio
import os
import re
from playwright.async_api import async_playwright
from google import genai
from dotenv import load_dotenv
load_dotenv()
# Den nye pakken henter automatisk GEMINI_API_KEY fra .env-filen din
client = genai.Client()
async def ask_llm_status(text, course_name, 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."
else:
bane_instruks = f'Finn banestatusen SPESIFIKT for banen som heter/omtales som: "{course_name}".'
prompt = f"""
Du er en ekspert å lese norske golfklubbers nettsider for å finne banestatus.
{bane_instruks}
Svar KUN med nøyaktig ETT av disse ordene:
- aapen (hvis banen er åpen/sommergreener)
- stengt (hvis banen er lukket/stengt/frost/snø)
- aapen_med_vintergreener (hvis det spilles vintergreener)
- aapner_snart (hvis den åpner om kort tid)
- stenger_snart (hvis den stenger for sesongen om kort tid)
- under_utvikling (hvis den er under utvikling)
- nedlagt (hvis den er nedlagt)
- ukjent (hvis du ikke finner noe info om banen i teksten)
Tekst fra nettsiden:
{text[:15000]}
"""
try:
# Ny måte å kalle modellen asynkront på med google-genai
response = await client.aio.models.generate_content(
model='gemini-2.5-flash',
contents=prompt
)
svar = response.text.strip().lower()
gyldige_svar = [
"aapen", "stengt", "aapen_med_vintergreener",
"aapner_snart", "stenger_snart", "under_utvikling",
"nedlagt", "ukjent"
]
for gyldig in gyldige_svar:
if gyldig in svar:
return gyldig
return "ukjent"
except Exception as e:
print(f"❌ Gemini Feil: {e}")
return "ukjent"
async def run_test():
print("\n" + "="*50)
print(" 🧪 TEE OFF: GEMINI TEST-VERKTØY (MED AUTO-KLIKKER)")
print("="*50)
url = input("🌐 Skriv inn URL til golfklubben (f.eks. https://oslogk.no): ").strip()
if not url.startswith("http"):
url = "https://" + url
course_name = input("⛳ Skriv inn banenavn (eller trykk ENTER hvis anlegget kun har 1 bane): ").strip()
is_single = len(course_name) == 0
print("\n⏳ 1. Starter nettleser og besøker siden...")
full_text = ""
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
try:
await page.goto(url, timeout=30000, wait_until="domcontentloaded")
await asyncio.sleep(3) # Vent på animasjoner og iframes
# --- NY LOGIKK: AUTO-KLIKKER ---
print("🖱️ Leter etter 'banestatus'-knapper å klikke på...")
# Vi leter etter tekst som inneholder "banestatus" (ignorerer store/små bokstaver)
knapper = await page.get_by_text(re.compile(r"banestatus", re.IGNORECASE)).all()
for knapp in knapper:
try:
if await knapp.is_visible():
await knapp.click(timeout=3000)
print(" 🎯 Klikket på en banestatus-knapp! Venter 2 sekunder...")
await asyncio.sleep(2) # Venter på at modalen/pop-upen åpner seg
break # Vi trenger bare å klikke på den første vi finner
except Exception as e:
# Ignorerer hvis knappen ikke er klikkbar, prøver neste
pass
# --------------------------------
element = page.locator("body").first
råtekst = await element.inner_text()
full_text = " ".join(råtekst.split())
print(f"✅ Hentet {len(full_text)} tegn med tekst fra nettsiden.")
except Exception as e:
print(f"❌ Feil ved innlasting av side: {e}")
await browser.close()
return
await browser.close()
print("🧠 2. Sender teksten til Gemini for analyse...")
status = await ask_llm_status(full_text, course_name, is_single)
print("\n" + "="*50)
print(f"🎯 GEMINI SITT SVAR: {status.upper()}")
print("="*50 + "\n")
if __name__ == "__main__":
asyncio.run(run_test())