Extension Chrome + backend Spring Boot qui analysent une page web (texte, DOM, vidéo, audio) et calculent un score de crédibilité de 0 à 100, avec le détail des techniques de manipulation détectées (dark patterns) et une évaluation de contenu généré par IA.
Les résultats sont des signaux d'alerte, pas des certitudes absolues.
🟢 propre (>80) · 🟡 attention (50-80) · 🔴 manipulateur (<50)
| Module | Technique | Ce qu'il repère |
|---|---|---|
| Web | règles heuristiques (DOM/regex) | fausse urgence (compteur qui se réinitialise), bouton de refus caché, faux stock limité |
| Texte | LLM local (Ollama phi3) + RAG |
faux avis / preuve sociale, langage culpabilisant (FOMO) |
| Vidéo | détecteur d'images IA (HuggingFace) | contenu vidéo généré par IA |
| Audio | modèle audio (Qwen omni) | voix synthétique / clonée |
Chaque module ne s'active que si le contenu correspondant existe sur la page (pas de pénalité pour un module sans matière à analyser).
Extension Chrome (content script + popup + dashboard)
│ POST /api/analyze (JSON)
▼
Backend Spring Boot
AnalysisController → AnalysisService (orchestrateur)
│
├── WebAnalysisService (règles DOM/regex)
├── TextAnalysisService (Ollama phi3 + RAG sur dark-patterns.json)
├── VideoAnalysisService (ffmpeg → frames → HuggingFace)
├── AudioAnalysisService (ffmpeg → extrait audio → Qwen omni)
├── ScoreService (agrège alertes + coefficients → score)
└── ReputationService (historique des scans, H2)
HACKIWHA_extension/
├── backend/ Spring Boot (Java 17)
│ ├── pom.xml
│ └── src/main/
│ ├── java/com/adguard/
│ │ ├── AdGuardApplication.java
│ │ ├── controller/AnalysisController.java # POST /api/analyze
│ │ ├── service/
│ │ │ ├── AnalysisService.java # orchestrateur des 4 modules
│ │ │ ├── WebAnalysisService.java
│ │ │ ├── TextAnalysisService.java
│ │ │ ├── VideoAnalysisService.java
│ │ │ ├── AudioAnalysisService.java
│ │ │ ├── EmbeddingService.java # embeddings pour le RAG
│ │ │ ├── DatasetLoader.java # charge dark-patterns.json au démarrage
│ │ │ ├── ScoreService.java
│ │ │ └── ReputationService.java
│ │ ├── repository/ # accès données (JPA + JDBC)
│ │ ├── model/ # entités JPA (ScanHistory, SiteReputation)
│ │ ├── dto/ # contrat JSON (Alert, AnalysisRequest/Response...)
│ │ └── config/AppProperties.java # config centralisée (Ollama, HF, Qwen, coefficients)
│ └── resources/
│ ├── application.yml
│ └── dark-patterns.json # dataset RAG (exemples de dark patterns)
│
├── extension/ Extension Chrome (Manifest V3)
│ ├── manifest.json
│ ├── content-script.js extrait texte / DOM / médias de la page
│ ├── background.js appelle l'API backend
│ ├── popup.html / .css / .js badge + score + alertes
│ └── dashboard.html / .css / .js détail complet, historique, export JSON
│
└── demo/ pages de test (propre, manipulatrice, avec vidéo)
- Java 17+
- Maven
- Ollama en local, avec les modèles :
ollama pull phi3 ollama pull nomic-embed-text
- ffmpeg installé et accessible dans le PATH (ou configuré via
FFMPEG_PATH) - Clés API (optionnelles — sans elles, les modules vidéo/audio sont simplement inactifs) :
- HuggingFace : token d'inférence → variable d'environnement
HF_TOKEN - Qwen (DashScope) : clé API → variable d'environnement
QWEN_KEY
- HuggingFace : token d'inférence → variable d'environnement
cd backend
# Windows (PowerShell)
$env:HF_TOKEN="hf_xxx"; $env:QWEN_KEY="sk-xxx"; mvn spring-boot:run
# macOS / Linux
HF_TOKEN=hf_xxx QWEN_KEY=sk-xxx mvn spring-boot:runLe backend démarre sur http://localhost:8080 (base H2 en mémoire, aucune installation de base de données requise). Au premier démarrage, DatasetLoader charge automatiquement dark-patterns.json en base pour le RAG.
Tester rapidement :
curl -X POST http://localhost:8080/api/analyze \
-H "Content-Type: application/json" \
-d @backend/test-payload.jsonchrome://extensions- Activer le mode développeur
- Charger l'extension non empaquetée → sélectionner le dossier
extension/ - Ouvrir n'importe quelle page → cliquer sur l'icône C2LIA → Analyser la page
Le bouton Voir le détail ouvre un tableau de bord complet (score, détail par module, historique, export JSON).
Le dossier demo/ contient des pages prêtes à tester :
propre.html— page sans piège (score attendu ~100)manipulatrice.html— cumule fausse urgence, faux stock, bouton de refus caché, faux avisvideo-reelle.html— inclut une vidéo pour tester les modules vidéo/audio
Tout se règle dans backend/src/main/resources/application.yml, sous la clé adguard :
adguard:
scaleFactor: 20.0 # sensibilité du score global
coefficients: # poids de gravité par pattern détecté
fake_review: 1.5
ai_generated_video: 1.5
synthetic_voice: 1.3
fake_urgency: 1.0
fake_stock: 1.0
hidden_decline_button: 0.8
fomo_language: 0.6Les clés API (HF_TOKEN, QWEN_KEY) sont lues uniquement depuis des variables d'environnement et ne doivent jamais être committées en dur dans application.yml.