diff --git a/helpers.py b/helpers.py index 782dea36..a4be350d 100644 --- a/helpers.py +++ b/helpers.py @@ -1501,50 +1501,42 @@ def scrape_website_details(url): return f"k.A. (Fehler: {str(e)[:100]}...)" -def is_valid_wikipedia_article_url(url_to_check, lang=None): +def is_valid_wikipedia_article_url(url): """ - Prueft, ob eine gegebene URL zu einem gueltigen, existierenden Wikipedia-Artikel fuehrt. + 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_to_check or not isinstance(url_to_check, str) or "wikipedia.org/wiki/" not in url_to_check.lower(): - logger.debug(f"is_valid_wikipedia_article_url: Ungueltige URL-Struktur: {url_to_check[:100]}...") + if not url or not "wikipedia.org/wiki/" in url.lower(): return False - - original_lang = None - if lang: - try: - original_lang = wikipedia.get_lang() - wikipedia.set_lang(lang) - logger.debug(f"Temporaer Wikipedia-Sprache auf '{lang}' gesetzt für Validierung.") - except Exception as e_lang: - logger.warning(f"Konnte Wikipedia-Sprache nicht auf '{lang}' setzen für Validierung: {e_lang}") - - is_valid = False + + headers = {"User-Agent": random.choice(USER_AGENTS)} try: - title_part = url_to_check.split('/wiki/', 1)[1].split('#')[0] - title = unquote(title_part).replace('_', ' ') - logger.debug(f"Validiere Wikipedia-Artikel: '{title[:100]}...' (URL: {url_to_check[:100]}...)") - page = wikipedia.page(title, auto_suggest=False, preload=True) - is_valid = True - logger.debug(f" -> Artikel '{title[:100]}...' scheint valide zu sein (Seite geladen).") - except wikipedia.exceptions.PageError: - logger.debug(f" -> Seite '{title[:100]}...' nicht gefunden (PageError).") - is_valid = False - except wikipedia.exceptions.DisambiguationError: - logger.debug(f" -> Seite '{title[:100]}...' ist eine Begriffsklaerungsseite.") - is_valid = False - except Exception as e: - logger.error(f" -> Unerwarteter Fehler bei Validierung von '{title[:100]}...': {type(e).__name__} - {e}") - logger.debug(traceback.format_exc()) - is_valid = False - finally: - if original_lang: - try: - wikipedia.set_lang(original_lang) - logger.debug(f"Wikipedia-Sprache zurueck auf '{original_lang}' gesetzt.") - except Exception as e_lang_reset: - logger.warning(f"Konnte Wikipedia-Sprache nicht zurueck auf '{original_lang}' setzen: {e_lang_reset}") - return is_valid + # 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