#!/usr/bin/env python3 import sys import os import json import logging import asyncio import datetime import requests # Dodanie ścieżki projektu do PYTHONPATH sys.path.append(os.path.join(os.path.dirname(__file__), "../..")) from backend.core.search.grant_search_service import grant_search_service logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") logger = logging.getLogger(__name__) async def verify_all_fallbacks(): logger.info("Rozpoczynam cotygodniową weryfikację fallbacków...") total_checked = 0 total_outdated = 0 total_dead = 0 today_str = datetime.datetime.now().strftime("%Y-%m-%d") # Przechodzimy przez wszystkie źródła for source in grant_search_service.sources: if hasattr(source, "_get_verified_fallback"): fallback_list = source._get_verified_fallback() for grant in fallback_list: total_checked += 1 url = grant.get("url", "") name = grant.get("name", "Brak nazwy") if not url.startswith("http"): continue try: response = await asyncio.to_thread(requests.get, url, timeout=10, allow_redirects=True) if response.status_code == 200: text_lower = response.text.lower() outdated_keywords = ["nabór zakończony", "archiwum", "zamknięty", "zakończyliśmy przyjmowanie"] if any(kw in text_lower for kw in outdated_keywords): logger.warning(f"[OUTDATED TREŚĆ] {name} | {url}") total_outdated += 1 else: logger.info(f"[OK] {name}") else: logger.error(f"[DEAD LINK {response.status_code}] {name} | {url}") total_dead += 1 except Exception as e: logger.error(f"[ERROR] {name} | {url} | {str(e)}") total_dead += 1 logger.info("Podsumowanie weryfikacji cron:") logger.info(f"Sprawdzono: {total_checked}") logger.info(f"Przestarzałe: {total_outdated}") logger.info(f"Martwe linki: {total_dead}") # TODO: Zapisz raport do bazy danych, wyślij e-mail do admina lub nadpisz pliki source.py nową datą 'last_verified' if __name__ == "__main__": asyncio.run(verify_all_fallbacks())