Vdphacker/Cyber_IA
0
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."