Extension Chrome (Manifest V3) de détection de contenus générés par intelligence artificielle. Analyse le texte, les images, les vidéos et l'audio de chaque page visitée, et signale les problèmes HTML/sécurité.
- Architecture du projet
- Guide d'installation
- Configuration des clés API
- Guide de test des fonctionnalités
- Fonctionnalités avancées
- Limitations techniques connues
- Vie privée et données
AI-Content-Detector_v0.0.1.4_source/
├── public/
│ ├── manifest.json # Manifeste MV3 de l'extension
│ └── icons/ # Icônes 16×16, 48×48, 128×128 (PNG)
├── src/
│ ├── types/
│ │ └── index.ts # Types TypeScript partagés (interfaces)
│ ├── background/
│ │ └── index.ts # Service worker : cache, badges, routage des messages
│ ├── community/
│ │ └── registry.ts # Registre communautaire : stockage, sync, validation
│ ├── content/
│ │ └── index.ts # Script de contenu : scan, analyse, overlays HTML
│ ├── popup/
│ │ ├── popup.ts # Logique du popup
│ │ └── popup.html # Interface du popup (380px)
│ └── options/
│ ├── options.ts # Logique de la page Options
│ └── options.html # Interface des Options (760px)
├── package.json
├── tsconfig.json
├── webpack.config.js # Build : 4 entry points, pas de code splitting
└── README.md
Page web
└─► content.js (PageScanner + Analyzers)
├─► chrome.runtime.sendMessage(ANALYSIS_RESULT)
│ └─► background.js (cache + badge)
│ └─► popup.js (affichage scores)
└─► chrome.runtime.sendMessage(HTML_ISSUES_RESULT)
└─► background.js (cache)
└─► popup.js (onglet HTML)
| Fichier | Rôle |
|---|---|
background/index.ts |
Service worker persistant : reçoit les résultats, met à jour le badge, gère le cache TTL 5min, valide les messages entrants |
community/registry.ts |
Charge/sauvegarde les entrées communautaires dans storage.local, valide le schéma JSON des réponses serveur, pousse les signalements |
content/index.ts |
S'exécute dans chaque page : PageScanner extrait le texte et médias, TextAnalyzer et MediaAnalyzer calculent les scores, HtmlInspector détecte les problèmes, OverlayManager affiche les avertissements visuels |
popup/popup.ts |
Affiche les scores de détection, la bannière communautaire, les problèmes HTML, et le formulaire de signalement |
options/options.ts |
Configure les URLs/clés d'API, les seuils, les modules actifs, et gère la liste communautaire |
npm install
npm run build # Production (dist/)
npm run build:dev # Développement avec source maps
npm run dev # Watch modeLe build produit 4 fichiers dans dist/ : background.js, content.js, popup.js, options.js.
- Google Chrome version 109 ou supérieure (Manifest V3)
- Node.js 18+ et npm (pour compiler depuis les sources)
-
Cloner ou extraire ce dossier sur votre machine.
-
Installer les dépendances :
npm install
-
Compiler l'extension :
npm run build
Le dossier
dist/est généré. -
Ajouter des icônes dans
public/icons/:icon16.png(16×16)icon48.png(48×48)icon128.png(128×128)
-
Charger l'extension dans Chrome :
- Ouvrir
chrome://extensions - Activer le Mode développeur (coin supérieur droit)
- Cliquer sur Charger l'extension non empaquetée
- Sélectionner le dossier
dist/
- Ouvrir
-
L'icône de l'extension apparaît dans la barre d'outils Chrome.
npm run buildPuis, dans chrome://extensions, cliquer sur l'icône de rechargement de l'extension.
Ouvrir la page Options en cliquant sur ⚙ dans le popup ou en faisant un clic droit sur l'icône → Options.
Service recommandé : Originality.ai, Winston AI, GPTZero, ou toute API compatible.
Format attendu :
- Requête :
POST {url}avec{ "content": "texte à analyser" } - Réponse :
{ "score": 85 }(valeur entre 0 et 100)
Champs à renseigner dans Options → APIs :
- URL de l'API : ex.
https://api.originality.ai/api/v1/scan/ai - Clé API : votre clé secrète (stockée localement, jamais synchronisée)
Service recommandé : Hive Moderation, AI or Not, Illuminarty.
Format attendu :
- Requête :
POST {url}avec{ "image_url": "https://..." } - Réponse :
{ "score": 72 }
Format attendu :
- Requête :
POST {url}avec{ "video_url": "https://..." } - Réponse :
{ "score": 60 }
Format attendu :
- Requête :
POST {url}avec{ "audio_url": "https://..." } - Réponse :
{ "score": 45 }
Votre propre backend REST pour synchroniser la liste de contenus connus.
Endpoints attendus :
GET /entries→{ "entries": [ CommunityEntry[] ] }POST /reports→ signalement envoyé par l'utilisateur
Important : l'activation du backend communautaire et l'envoi de données aux APIs externes sont désactivés par défaut. Ils doivent être explicitement activés dans Options → Vie privée.
- Ouvrir un article de blog ou une page contenant du texte long.
- Cliquer sur l'icône de l'extension.
- L'onglet 📊 Analyse IA affiche le score Texte.
- Les indicateurs typiques : phrases de longueur uniforme, formules rhétoriques IA ("En conclusion", "Il convient de noter"), texte impersonnel.
Pour tester avec des scores élevés, ouvrir un article rédigé avec ChatGPT ou un texte d'exemple comportant des formulations caractéristiques (cf. patterns dans src/content/index.ts).
- Naviguer sur une page contenant des images depuis des services connus (Midjourney, DALL·E, Stability AI).
- Les URLs contenant
midjourney,dalle,stability.aidéclenchent un score élevé automatiquement. - Le score image apparaît dans la card 🖼️ Images.
- Ouvrir une page avec des problèmes HTML connus (handlers inline, scripts sans SRI, contenus mixtes HTTP/HTTPS).
- Cliquer sur l'onglet 🔍 HTML dans le popup.
- Les problèmes sont listés par sévérité (🔴 critique, 🟡 avertissement, ℹ️ info).
- Naviguer sur une page.
- Cliquer sur l'onglet 📢 Signaler.
- Sélectionner le type de contenu IA, le verdict, ajouter des notes.
- Cliquer sur Envoyer le signalement.
- L'entrée est sauvegardée localement (visible dans Options → Communauté).
- Après une première analyse, cliquer sur ↻ Réanalyser.
- Le popup affiche un spinner, puis les nouveaux résultats.
- Ouvrir Options → Fonctionnalités.
- Modifier le Seuil score IA (ex. 30).
- Recharger une page : les overlays apparaissent si le score dépasse le seuil.
Sans configuration d'API externe, l'extension analyse localement :
Texte :
- Détection de patterns linguistiques caractéristiques des LLMs (liste configurable dans
AI_PATS) - Analyse de l'uniformité des longueurs de phrases (coefficient de variation)
- Détection des répétitions lexicales anormales
- Mesure de la personnalisation (ratio de pronoms personnels)
Images :
- Reconnaissance des URLs provenant de services de génération IA connus (Midjourney, DALL·E, Stability AI, Replicate, Civitai)
- Détection des patterns de hash MD5 dans les chemins d'URL (signatures typiques des générations batch)
Vidéo :
- Reconnaissance des URLs de plateformes de génération vidéo IA (Runway, Pika, Sora, HeyGen, Synthesia, D-ID)
- Heuristique sur la durée (vidéos très courtes < 10s = caractéristique des générateurs)
Audio :
- Reconnaissance des URLs ElevenLabs, Mubert, Suno, Udio, Soundraw, Resemble.ai, Play.ht
L'extension dispose d'adapters dédiés pour YouTube et Instagram :
- YouTube : extrait l'ID vidéo, le titre, l'auteur, la description, les hashtags. Cible les overlays sur le lecteur vidéo et les miniatures.
- Instagram : extrait l'ID de post/reel, l'auteur, les hashtags. Cible les overlays sur les articles et vidéos.
Ces adapters permettent la correspondance précise par contentId dans la base communautaire.
La liste communautaire permet de signaler des contenus connus comme IA et de partager ces informations :
- Stockage local dans
chrome.storage.local - Synchronisation optionnelle avec un backend REST
- Correspondance par pattern URL (regex sécurisée anti-ReDoS) ou par
contentIdexact - Validation complète du schéma JSON des réponses serveur avant insertion
L'inspecteur analyse la page courante et détecte :
- Handlers d'événements inline (
onclick,onerror, etc.) - Usage de
eval(),new Function(),setTimeout(string) innerHTMLdynamique dans les scripts inline- Images sans attribut
alt - Éléments HTML dépréciés (
<font>,<marquee>,<frame>...) - IDs dupliqués
- Champs de formulaire sans label
- Scripts externes sans attribut
integrity(SRI) - Contenus mixtes HTTP sur HTTPS
- Potentiels open redirects
Le badge sur l'icône Chrome indique en temps réel :
- Pas de badge : score < 40, page analysée propre
- v (vert) : score faible, aucune suspicion
- Score numérique (orange/rouge) : score ≥ 40, indique le score maximal
- ! (rouge) : correspondance communautaire détectée
L'extension requiert host_permissions: ["https://*/*", "http://*/*"] pour injecter le script de contenu sur toutes les pages HTTP/HTTPS. Cette permission est nécessaire car l'extension est conçue pour analyser n'importe quel site web. Elle n'accède pas aux pages file://, chrome:// ou aux extensions tierces.
- Les heuristiques locales ne remplacent pas une API de détection dédiée. Elles produisent des faux positifs (texte académique formel détecté comme IA) et des faux négatifs (texte IA bien humanisé non détecté).
- La détection par URL d'image/vidéo/audio ne fonctionne que si les médias sont servis depuis des domaines connus des générateurs IA. Les contenus hébergés sur des CDN génériques ne sont pas détectés.
- L'analyse vidéo et audio sans API externe repose uniquement sur des heuristiques d'URL et de durée.
Sur les SPAs (YouTube, Instagram, Twitter/X...), la navigation ne recharge pas la page. L'extension détecte les changements d'URL via un MutationObserver avec debounce de 1,5 seconde. Dans de rares cas, l'analyse peut être déclenchée avec un léger délai après la navigation.
Les résultats d'analyse sont mis en cache pendant 5 minutes par onglet. Au-delà, la prochaine ouverture du popup déclenche une nouvelle analyse. Le bouton ↻ Réanalyser force un rescan immédiat.
Les clés API sont stockées dans chrome.storage.local en texte clair. Ce stockage est local, non synchronisé entre appareils, et non accessible aux pages web. Il n'y a pas de chiffrement supplémentaire. Ne pas utiliser des clés d'API de production à forte valeur ; préférer des clés avec des quotas limités.
Le contenu chargé dynamiquement après l'analyse initiale (lazy loading, pagination infinie) peut ne pas être inclus dans les résultats. Les iframes cross-origin ne sont pas analysées (restriction navigateur).
L'inspecteur HTML est limité à 15 problèmes affichés dans le popup (les suivants sont comptabilisés mais non détaillés). Il analyse uniquement le DOM au moment de l'analyse, pas les scripts chargés dynamiquement après coup.
Par défaut, aucune donnée n'est envoyée à l'extérieur :
- L'analyse se fait entièrement en local via des heuristiques embarquées.
- Les clés API sont stockées dans
chrome.storage.local, non synchronisées entre appareils. - La liste communautaire est stockée localement.
- Aucune télémétrie, aucun tracking, aucun analytics.
Ces fonctionnalités sont désactivées par défaut et nécessitent une activation explicite dans Options → Vie privée :
| Fonctionnalité | Données envoyées | Destination |
|---|---|---|
| APIs de détection texte | Jusqu'à 3 000 caractères du texte de la page | Votre API configurée |
| APIs de détection image | URL publique de l'image | Votre API configurée |
| APIs de détection vidéo | URL publique de la vidéo | Votre API configurée |
| APIs de détection audio | URL publique de l'audio | Votre API configurée |
| Sync communautaire | URL de la page signalée + flags IA sélectionnés | Votre backend communautaire |
- Activer "Heuristiques locales uniquement" si vous analysez des pages contenant des informations confidentielles (intranet, documents internes).
- Ne pas activer "Autoriser l'envoi aux APIs IA" sur des réseaux ou pages sensibles.
- Utiliser des clés API avec des quotas limités pour éviter toute consommation abusive en cas de compromission locale.
- La sync communautaire envoie uniquement les données que vous signalez explicitement via le formulaire de signalement.
- Historique de navigation
- Contenu des champs de formulaire
- Données personnelles
- Cookies ou sessions
- Contenu des pages non analysées