"""BAN YARO — Content-Filter für Spam und Missbrauch im Forum.""" import re from datetime import datetime, timedelta, timezone from fastapi import HTTPException # Offensichtliche Spam-Signale _SPAM_KEYWORDS = [ "casino", "poker", "slots", "jackpot", "sportwetten", "viagra", "cialis", "levitra", "pharmacy", "apotheke online", "kreditkarte sofort", "kredit ohne schufa", "schnell geld verdienen", "passive income", "work from home", "earn money fast", "click here", "klick hier", "free followers", "buy followers", "whatsapp +", "telegram +", "call now", "jetzt anrufen", "seo service", "backlinks kaufen", "website traffic", "crypto invest", "bitcoin verdienen", "nft mint", "lose weight fast", "abnehmen schnell", "diät pille", ] # URL-Muster (http/https oder nackte Domains) _URL_RE = re.compile( r"(https?://|www\.|\b[a-zA-Z0-9-]+\.(de|com|net|org|io|app|shop|info|biz|ru|cn)\b)", re.IGNORECASE, ) # Mindest-Account-Alter für URL-Posts (Tage) _MIN_DAYS_FOR_URLS = 7 def check_forum_content(text: str, user_created_at: str | None = None) -> None: """ Prüft Forum-Text auf Spam. Wirft HTTPException(400) bei Fund. """ lower = text.lower() # Spam-Keywords for kw in _SPAM_KEYWORDS: if kw in lower: raise HTTPException(400, "Dein Beitrag wurde als Spam erkannt und nicht gespeichert.") # URLs in neuen Accounts sperren if _URL_RE.search(text): if user_created_at: try: created = datetime.fromisoformat(user_created_at) if created.tzinfo is None: created = created.replace(tzinfo=timezone.utc) age = datetime.now(timezone.utc) - created if age < timedelta(days=_MIN_DAYS_FOR_URLS): raise HTTPException( 400, "Links können erst nach 7 Tagen Mitgliedschaft gepostet werden." ) except (ValueError, TypeError): pass # Zu viele Sonderzeichen / Zeichensalat if len(text) > 20: alnum = sum(c.isalnum() or c.isspace() for c in text) ratio = alnum / len(text) if ratio < 0.5: raise HTTPException(400, "Dein Beitrag enthält zu viele Sonderzeichen.")