Explorer
/proc/100/root/tmp/aa045f5_patch_qfilter.py
← Zurück ↓ Download
"""AA-045-F5: Intake-Qualitätsfilter (Scheinsignale gar nicht erst speichern)."""
p = "/opt/struktur/social-media-radar/intake/watch_intake.py"
s = open(p).read()

old = '''def _store(entity: dict, platform: str, url: str, title: str, summary: str,
           image_url: str = "") -> str | None:
    """Speichert einen Watch-Treffer als Signal (idempotent über URL-Dedup)."""'''
new = '''def _is_scheinsignal(title: str, url: str) -> str | None:
    """AA-045-F5 §29: erkennt nicht-postwürdige Treffer. Liefert Grund oder None."""
    t = (title or "").strip()
    tl = t.lower()
    if not t or t.startswith("(ohne Titel)"):
        return "ohne Titel"
    if "instagram.com" in url:
        return "Instagram-Seite"
    if ".webflow." in tl:
        return "CSS-Klassentitel"
    # Startseiten-/Sprachvarianten ohne konkreten Beitrag
    if any(x in url for x in ("?lang=", "/en-gb", "/en/", "/de/", "/es/", "/ru/", "/sv/")) and len(t) < 30:
        return "Startseiten-/Sprachvariante"
    return None


def _store(entity: dict, platform: str, url: str, title: str, summary: str,
           image_url: str = "") -> str | None:
    """Speichert einen Watch-Treffer als Signal (idempotent über URL-Dedup).
    Scheinsignale (Loginseiten, Startseiten, CSS-Klassen) werden abgewiesen."""'''
assert old in s, "anchor1 fehlt"
s = s.replace(old, new)

old2 = '''    expires = (datetime.now(timezone.utc) + timedelta(hours=336)).isoformat()
    signal = {'''
new2 = '''    skip_reason = _is_scheinsignal(title, url)
    if skip_reason:
        return None  # kein Signal, kein Fehler (§29)

    expires = (datetime.now(timezone.utc) + timedelta(hours=336)).isoformat()
    signal = {'''
assert old2 in s, "anchor2 fehlt"
s = s.replace(old2, new2)
open(p, "w").write(s)
print("watch_intake Qualitätsfilter eingebaut")