CoolFace
Apppublic

Vdphacker/Cyber_IA

sourceHugging Facemitupdated 10mo agoView on Hugging Face
0likes
web_researcher.py55 linesDownload Raw Back to root
1import os
2from scrapegraphai.graphs import SmartScraperGraph
3from langchain_huggingface import HuggingFaceEndpoint
4
5# Liste des sites autorisés (à étendre)
6ALLOWED_SITES = [
7    "https://www.ssi.gouv.fr",      # ANSSI (France)
8    "https://www.cert.ssi.gouv.fr", # CERT-FR
9    "https://csrc.nist.gov",        # NIST (USA)
10    "https://www.sans.org",         # SANS Institute
11    "https://attack.mitre.org",     # MITRE ATT&CK
12    "https://owasp.org",            # OWASP
13    "https://www.cisa.gov",         # CISA (USA)
14]
15
16def rechercher_sur_web(question: str) -> str:
17    """
18    Recherche la réponse sur les sites de cybersécurité autorisés.
19    ScrapeGraph-AI respecte automatiquement le robots.txt.
20    """
21    results = []
22    
23    for base_url in ALLOWED_SITES:
24        try:
25            # ScrapeGraph vérifie robots.txt avant de crawler
26            graph_config = {
27                "llm": {
28                    "model": "ollama/llama3",  # ou utilise Hugging Face Endpoint
29                    "temperature": 0,
30                    "format": "json",
31                    "base_url": "http://localhost:11434",  # si tu utilises Ollama
32                },
33                "verbose": False,
34                "headless": True,
35                "respect_robots_txt": True,  # 🔑 clé de ton exigence
36            }
37
38            # On cherche via le moteur de recherche interne du site (si possible)
39            # Sinon, on scrape la page d'accueil (moins efficace)
40            search_url = f"{base_url}/?s={question.replace(' ', '+')}"  # ajuste selon le site
41
42            smart_scraper = SmartScraperGraph(
43                prompt=f"Trouve des informations techniques sur : {question}",
44                source=search_url,
45                config=graph_config
46            )
47
48            result = smart_scraper.run()
49            if result and "content" in result:
50                results.append(f"Source: {base_url}\n{result['content'][:1000]}...")
51        except Exception as e:
52            print(f"⚠️ Erreur avec {base_url}: {e}")
53            continue
54
55    return "\n\n".join(results) if results else "Aucune source fiable trouvée."