Skip to content

Octant-Peon/Ai-Content-Detector-extension

Repository files navigation

AI-Content-Detector — Extension Chrome

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é.


Table des matières

  1. Architecture du projet
  2. Guide d'installation
  3. Configuration des clés API
  4. Guide de test des fonctionnalités
  5. Fonctionnalités avancées
  6. Limitations techniques connues
  7. Vie privée et données

1. Architecture du projet

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

Flux de données

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)

Rôle de chaque composant

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

Build

npm install
npm run build        # Production (dist/)
npm run build:dev    # Développement avec source maps
npm run dev          # Watch mode

Le build produit 4 fichiers dans dist/ : background.js, content.js, popup.js, options.js.


2. Guide d'installation

Prérequis

  • Google Chrome version 109 ou supérieure (Manifest V3)
  • Node.js 18+ et npm (pour compiler depuis les sources)

Installation depuis les sources

  1. Cloner ou extraire ce dossier sur votre machine.

  2. Installer les dépendances :

    npm install
  3. Compiler l'extension :

    npm run build

    Le dossier dist/ est généré.

  4. Ajouter des icônes dans public/icons/ :

    • icon16.png (16×16)
    • icon48.png (48×48)
    • icon128.png (128×128)
  5. 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/
  6. L'icône de l'extension apparaît dans la barre d'outils Chrome.

Mise à jour après modification du code

npm run build

Puis, dans chrome://extensions, cliquer sur l'icône de rechargement de l'extension.


3. Configuration des clés API

Ouvrir la page Options en cliquant sur ⚙ dans le popup ou en faisant un clic droit sur l'icône → Options.

API de détection de texte

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)

API de détection d'images

Service recommandé : Hive Moderation, AI or Not, Illuminarty.

Format attendu :

  • Requête : POST {url} avec { "image_url": "https://..." }
  • Réponse : { "score": 72 }

API de détection vidéo

Format attendu :

  • Requête : POST {url} avec { "video_url": "https://..." }
  • Réponse : { "score": 60 }

API de détection audio

Format attendu :

  • Requête : POST {url} avec { "audio_url": "https://..." }
  • Réponse : { "score": 45 }

API backend communautaire (optionnel)

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.


4. Guide de test des fonctionnalités

Test de la détection de texte (heuristiques locales)

  1. Ouvrir un article de blog ou une page contenant du texte long.
  2. Cliquer sur l'icône de l'extension.
  3. L'onglet 📊 Analyse IA affiche le score Texte.
  4. 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).

Test de la détection d'images

  1. Naviguer sur une page contenant des images depuis des services connus (Midjourney, DALL·E, Stability AI).
  2. Les URLs contenant midjourney, dalle, stability.ai déclenchent un score élevé automatiquement.
  3. Le score image apparaît dans la card 🖼️ Images.

Test de l'inspection HTML

  1. Ouvrir une page avec des problèmes HTML connus (handlers inline, scripts sans SRI, contenus mixtes HTTP/HTTPS).
  2. Cliquer sur l'onglet 🔍 HTML dans le popup.
  3. Les problèmes sont listés par sévérité (🔴 critique, 🟡 avertissement, ℹ️ info).

Test du signalement communautaire

  1. Naviguer sur une page.
  2. Cliquer sur l'onglet 📢 Signaler.
  3. Sélectionner le type de contenu IA, le verdict, ajouter des notes.
  4. Cliquer sur Envoyer le signalement.
  5. L'entrée est sauvegardée localement (visible dans Options → Communauté).

Test du rescan

  1. Après une première analyse, cliquer sur ↻ Réanalyser.
  2. Le popup affiche un spinner, puis les nouveaux résultats.

Test des seuils

  1. Ouvrir Options → Fonctionnalités.
  2. Modifier le Seuil score IA (ex. 30).
  3. Recharger une page : les overlays apparaissent si le score dépasse le seuil.

5. Fonctionnalités avancées

Détection heuristique locale (sans API)

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

Adapters de sites spécifiques

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.

Liste 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 contentId exact
  • Validation complète du schéma JSON des réponses serveur avant insertion

Inspection HTML / Sécurité

L'inspecteur analyse la page courante et détecte :

  • Handlers d'événements inline (onclick, onerror, etc.)
  • Usage de eval(), new Function(), setTimeout(string)
  • innerHTML dynamique 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

Badge de l'extension

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

6. Limitations techniques connues

Permissions réseau

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.

Précision de la détection heuristique

  • 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.

Single Page Applications (SPA)

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.

Cache et fraîcheur des résultats

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.

Stockage des clés API

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.

Contenu dynamique et iframes

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).

Limite d'inspection HTML

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.


7. Vie privée et données

Ce qui reste local

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.

Ce qui peut être envoyé (opt-in uniquement)

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

Recommandations

  • 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.

Données jamais collectées

  • Historique de navigation
  • Contenu des champs de formulaire
  • Données personnelles
  • Cookies ou sessions
  • Contenu des pages non analysées

About

Extension Chrome MV3 de détection de contenus générés par IA (texte, images, vidéos, audio). Heuristiques locales, APIs externes optionnelles, signalement communautaire et inspection HTML/sécurité.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors