web_check.py: Implementierung von Cloudscraper-Bypass, Deep-Analysis (Link-verfolgung), UTF-8 Fixes für ntfy und ntfy-Prioritäten

This commit is contained in:
2026-03-02 22:30:07 +01:00
parent 92fd25239c
commit 4ccdfca2b9

View File

@@ -172,7 +172,7 @@ def hole_artikel_text(url):
# Scraper um die Unterseite zu laden # Scraper um die Unterseite zu laden
antwort = scraper.get(url, timeout=10) antwort = scraper.get(url, timeout=10)
# Verwandle die Antwort in durchsuchbares HTML # Verwandle die Antwort in durchsuchbares HTML
unter_soup = BeautifulSoup(antwort.text, "htpm.parser") unter_soup = BeautifulSoup(antwort.text, "html.parser")
# Suche nach Hauptbereich (wie im Haptscript) # Suche nach Hauptbereich (wie im Haptscript)
bereich = ( bereich = (
unter_soup.find("main") or unter_soup.find("article") or unter_soup.body unter_soup.find("main") or unter_soup.find("article") or unter_soup.body
@@ -208,9 +208,13 @@ def verarbeite_website(url, gedaechtnis):
# Holt den alten Text dieser URL aus dem Gedächtnis # Holt den alten Text dieser URL aus dem Gedächtnis
alter_eintrag = gedaechtnis.get(url, {}) alter_eintrag = gedaechtnis.get(url, {})
alter_text = alter_eintrag.get("inhalt", "") alter_text = alter_eintrag.get("inhalt", "")
bekannte_links = alter_eintrag.get("links", [])
# Sammelt alle Links aus dem Bereich für die KI
aktuelle_links = extrahiere_links(hauptbereich, url)
# Prüft, ob sich der Text seit dem letzten Lauf verändert hat # Prüft, ob sich der Text seit dem letzten Lauf verändert hat
if alter_text != neuer_text: if alter_text != neuer_text or aktuelle_links != bekannte_links:
print(f" [NEU] Änderung auf {url} gefunden. Ich frage die KI...") print(f" [NEU] Änderung auf {url} gefunden. Ich frage die KI...")
# Zerlegt den Text in Zeilen # Zerlegt den Text in Zeilen
alt_z = alter_text.splitlines() alt_z = alter_text.splitlines()
@@ -219,17 +223,26 @@ def verarbeite_website(url, gedaechtnis):
diff = [z[2:] for z in difflib.ndiff(alt_z, neu_z) if z.startswith("+ ")] diff = [z[2:] for z in difflib.ndiff(alt_z, neu_z) if z.startswith("+ ")]
text_fuer_ki = "\n".join(diff) text_fuer_ki = "\n".join(diff)
# Sammelt alle Links aus dem Bereich für die KI
alle_links = extrahiere_links(hauptbereich, url)
# Nur wenn auch wirklich neuer Text vorhanden ist # Nur wenn auch wirklich neuer Text vorhanden ist
if text_fuer_ki.strip(): if text_fuer_ki.strip():
analyse = analysiere_mit_gemini(text_fuer_ki, alle_links) # --- NEU: Neue Links verfolgen und Artikeltexte abrufen ---
neue_links = [l for l in aktuelle_links if l not in bekannte_links]
# Fallback, falls Gemini den direct_link vergisst: Nimm den ersten neuen Link oder die Haupt-URL
backup_link = neue_links[0] if neue_links else url
# Wir begrenzen das auf max. 3 neue Links, um Zeit und Tokens zu sparen
for link in neue_links[:3]:
print(f" [..] Lade Artikelinhalt von: {link}")
artikel_inhalt = hole_artikel_text(link)
# Wir hängen den Inhalt direkt an den Text für die KI an
text_fuer_ki += f"\n\n--- ZUSÄTZLICHER ARTIKELKONTEXT ({link}) ---\n{artikel_inhalt}"
analyse = analysiere_mit_gemini(text_fuer_ki, aktuelle_links)
# Falls die KI die Änderung als politisch wichtig einstuft # Falls die KI die Änderung als politisch wichtig einstuft
if analyse.get("relevant") == True: if analyse.get("relevant") == True:
print(f" [!] KI bestätigt Relevanz: {analyse.get('titel')}") print(f" [!] KI bestätigt Relevanz: {analyse.get('titel')}")
# Nutzt den direkten Link der KI oder die Haupt-URL # Nutzt den direkten Link der KI oder den Backup-Link
klick_url = analyse.get("direct_link", url) klick_url = analyse.get("direct_link", backup_link)
sende_public( sende_public(
titel=analyse.get("titel", "Polit-Update"), titel=analyse.get("titel", "Polit-Update"),
nachricht=analyse.get("nachricht", "Neu auf der Seite"), nachricht=analyse.get("nachricht", "Neu auf der Seite"),
@@ -241,6 +254,7 @@ def verarbeite_website(url, gedaechtnis):
# Speichert den neuen Stand dieser Webseite im lokalen Gedächtnis # Speichert den neuen Stand dieser Webseite im lokalen Gedächtnis
gedaechtnis[url] = { gedaechtnis[url] = {
"inhalt": neuer_text, "inhalt": neuer_text,
"links": aktuelle_links,
"zeit": str(datetime.now()), "zeit": str(datetime.now()),
"status": status, "status": status,
} }