diff --git a/helpers.py b/helpers.py index 2d9548b6..f2083324 100644 --- a/helpers.py +++ b/helpers.py @@ -1582,18 +1582,48 @@ def is_valid_wikipedia_article_url(url): logger.warning(f"URL-Check fehlgeschlagen (Request-Fehler): {url[:100]} - {e}") return False -# ============================================================================== -# 12. ALIGNMENT DEMO UTILITY -# ============================================================================== - def is_valid_wikipedia_article_url(url): - # ... (Code dieser Funktion bleibt unverändert) ... + """ + Prüft, ob eine Wikipedia-URL auf einen tatsächlich existierenden Artikel verweist. + Erkennt "red links" (nicht existierende Seiten), die trotzdem Status 200 zurückgeben. + """ + logger = logging.getLogger(__name__) + if not url or not "wikipedia.org/wiki/" in url.lower(): + return False + headers = {"User-Agent": random.choice(USER_AGENTS)} + try: + # GET-Request ist nötig, um Weiterleitungen zu folgen + response = requests.get(url, timeout=7, allow_redirects=True, headers=headers) + + # 1. Primär-Check: Prüfe die finale URL auf den 'redlink=1' Parameter + if 'action=edit&redlink=1' in response.url: + logger.warning(f"URL-Check fehlgeschlagen (redlink=1): {url[:100]}") + return False + + # 2. Sekundär-Check: Prüfe auf Status-Code und typische "Seite existiert nicht"-Texte + if response.status_code == 200: + content_lower = response.text.lower() + # Deutsche und englische Phrasen für nicht-existente Seiten + if "diese seite existiert nicht" in content_lower or "wikipedia does not have an article with this exact name" in content_lower: + logger.warning(f"URL-Check fehlgeschlagen (Text 'Seite existiert nicht' gefunden): {url[:100]}") + return False + + logger.debug(f"URL-Check erfolgreich (200 OK, kein Redlink): {url[:100]}") + return True + else: + logger.warning(f"URL-Check fehlgeschlagen (Status {response.status_code}): {url[:100]}") + return False + + except requests.exceptions.RequestException as e: + logger.warning(f"URL-Check fehlgeschlagen (Request-Fehler): {url[:100]} - {e}") + return False + # ============================================================================== # 12. ALIGNMENT DEMO UTILITY # ============================================================================== - def alignment_demo(sheet_handler): +def alignment_demo(sheet_handler): """ Schreibt die Header-Struktur (basierend auf v2.1.4, 71 Spalten) ins Google Sheet zur Dokumentation. Dies ist die Single Source of Truth für die Spaltenbedeutung. Version mit ungekürzten Texten.