Workflow n8n

Audit de lisibilité SEO IA : vérifier la compatibilité du site avec les LLM

Workflow chat qui prend une URL, récupère le HTML sans JS, extrait les signaux SEO/LLM (texte visible, balises, JSON-LD, noscript, messages JS) puis génère un rapport et des recommandations d’optimisation pour les modèles d’IA. Tags clés : seo, llm, audit.

Catégorie: ai · Tags: seo, llm, audit, html, robots.txt0

Vue d'ensemble du workflow n8n

Schéma des nœuds et connexions de ce workflow n8n, généré à partir du JSON n8n.

Inscris-toi pour voir l'intégralité du workflow

Inscription gratuite

S'inscrire gratuitementBesoin d'aide ?
{
  "id": "ov50A5lP1rSZemmo",
  "meta": {
    "instanceId": "f154513fa2d1f769ded7340842c6c8e98207198963b8cc8e27e34710189c205b"
  },
  "name": "Audit de lisibilité SEO IA : vérifier la compatibilité du site avec les LLM",
  "tags": [],
  "nodes": [
    {
      "id": "97f2264d-117f-47e5-a91e-91a8f46c113c",
      "name": "Quand un message de chat est reçu",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        0,
        96
      ],
      "webhookId": "f41e2ff4-b329-4c64-9147-963726a1eb76",
      "parameters": {
        "public": true,
        "options": {
          "title": "🚀 Analyseur de lisibilité SEO pour l’IA",
          "subtitle": "Testez dans quelle mesure votre site est lisible et accessible pour des moteurs d’IA comme ChatGPT, Perplexity ou Google AI Overviews.",
          "responseMode": "lastNode",
          "inputPlaceholder": "https://exemple.com"
        },
        "initialMessages": "Bonjour ! 👋  \nEnvoyez-moi simplement l’URL de votre site web et j’analyserai sa lisibilité pour les moteurs d’IA (ChatGPT, Perplexity, etc.). C’est parti ! 🚀"
      },
      "typeVersion": 1.1
    },
    {
      "id": "5443f0fd-3fd8-4425-8f79-7ebaca0876b9",
      "name": "Récupérer le HTML du site web",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        448,
        96
      ],
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {
          "timeout": 10000
        },
        "jsonHeaders": "{\n  \"User-Agent\": \"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\",\n  \"Accept-Language\": \"nl-NL,nl;q=0.9,en-US;q=0.8,en;q=0.7\"\n}",
        "sendHeaders": true,
        "specifyHeaders": "json"
      },
      "retryOnFail": true,
      "typeVersion": 4.2,
      "alwaysOutputData": true
    },
    {
      "id": "2778fa79-acea-4d0b-bb04-f05fa2d61852",
      "name": "Nettoyer l’URL du site web",
      "type": "n8n-nodes-base.code",
      "position": [
        224,
        96
      ],
      "parameters": {
        "jsCode": "return [\n  {\n    json: {\n      url: (() => {\n        let input = $json.chatInput.trim().toLowerCase();\n        if (!input.startsWith('http')) input = 'https://' + input;\n        return input;\n      })()\n    }\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "e9b78f57-0ab7-4671-81db-47dedc04d4d5",
      "name": "Extraire les caractéristiques HTML",
      "type": "n8n-nodes-base.code",
      "position": [
        672,
        96
      ],
      "parameters": {
        "jsCode": "const html = $json.data || '';\n\n// Remove scripts, styles, and extract visible text\nconst cleanedText = html\n  .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n  .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n  .replace(/<[^>]*>/g, '') // strip all HTML tags\n  .replace(/\\s+/g, ' ')\n  .trim();\n\n// Preview: first 400 chars of visible content\nconst previewText = cleanedText.slice(0, 400);\n\n// Lowercased text for language-agnostic JS block detection\nconst lowerText = cleanedText.toLowerCase();\n\n// Common JS-related blocking messages (EN + NL + DE)\nconst jsBlockIndicators = [\n  'enable javascript',\n  'javascript is required',\n  'please enable javascript',\n  'javascript moet ingeschakeld zijn',\n  'schakel javascript in',\n  'javascript erforderlich'\n];\n\n// Scan for any of the indicators\nconst jsWarningDetected = jsBlockIndicators.some(phrase => lowerText.includes(phrase));\n\nreturn [\n  {\n    json: {\n      visibleTextLength: cleanedText.length,\n      previewText,\n      hasH1: /<h1[\\s>]/i.test(html),\n      hasH2: /<h2[\\s>]/i.test(html),\n      hasH3: /<h3[\\s>]/i.test(html),\n      hasMetaDescription: /<meta[^>]+name=[\"']description[\"']/i.test(html),\n      hasOpenGraph: /<meta[^>]+property=[\"']og:/i.test(html),\n      hasStructuredData: /<script[^>]*type=[\"']application\\/ld\\+json[\"']/i.test(html),\n      hasNoscript: /<noscript[\\s>]/i.test(html),\n      jsWarning: jsWarningDetected,\n      robotsTxt: $('Nettoyer l’URL du site web').first().json.url.replace(/\\/$/, '') + '/robots.txt'\n    }\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "4b110c4a-3dc3-49b0-97c6-9d1ab9ce26d4",
      "name": "Analyse SEO IA",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        880,
        96
      ],
      "parameters": {
        "text": "=Vous êtes un·e expert·e en analyse SEO pour l’IA et en accessibilité aux moteurs de recherche basés sur des LLM.\n\nVous évaluez ici la lisibilité d’un site web pour des outils comme ChatGPT, Perplexity ou Google AI Overviews. Le HTML brut du site a été récupéré *sans exécution de JavaScript*, afin de simuler la manière dont les LLM voient généralement les pages.\n\n---\n\n### 🧾 Résumé du scan technique\n\n**Contenu visible (sans JS) :**\n- Longueur du texte : {{ $json.visibleTextLength }} caractères\n- Aperçu : \"{{ $json.previewText }}\"\n\n**Éléments détectés :**\n- Données structurées (JSON-LD) : {{ $json.hasStructuredData }}\n- Meta description : {{ $json.hasMetaDescription }}\n- Métadonnées Open Graph : {{ $json.hasOpenGraph }}\n- Titres : H1 : {{ $json.hasH1 }}, H2 : {{ $json.hasH2 }}, H3 : {{ $json.hasH3 }}\n- Présence d’un fallback `<noscript>` : {{ $json.hasNoscript }}\n- Avertissement bloquant lié à JavaScript détecté : {{ $json.jsWarning }}\n\n---\n\n### 🎯 Votre mission :\nÉvaluez la lisibilité du site pour l’IA et fournissez :\n\n1. Un **score de lisibilité pour l’IA (0–10)**  \n2. Un **bref résumé** de l’état actuel (2 à 4 phrases)  \n3. Jusqu’à **5 recommandations actionnables** pour améliorer la visibilité et l’accessibilité du site pour les moteurs de recherche basés sur des LLM\n\n💡 Si la longueur du texte est inférieure à 300 ou si `Avertissement bloquant lié à JavaScript détecté` vaut `true`, indiquez clairement que le site peut ne pas être accessible aux LLM à cause de sa dépendance au JavaScript.\n\n⚠️ **Important :**  \nVous devez également **indiquer à l’utilisateur** de vérifier manuellement son fichier `robots.txt`, et lui fournir ce lien cliquable exact :  \n👉 [{{ $json.robotsTxt }}]({{ $json.robotsTxt }})  \nExpliquez-lui qu’il doit s’assurer que les robots tels que `GPTBot`, `ChatGPT-User` et `Google-Extended` ne sont **pas bloqués**.\n\nNe réalisez pas cette vérification vous-même — contentez-vous d’informer l’utilisateur qu’il doit le faire.\n\n---\n\n🎁 Formatez votre réponse de la manière suivante :\n\n**Score :** x/10  \n**Résumé :** …  \n**Recommandations :**\n- …  \n- Vérifiez votre fichier robots.txt à l’adresse suivante : [{{ $json.robotsTxt }}]({{ $json.robotsTxt }}) pour vous assurer que les robots d’IA sont autorisés.",
        "promptType": "define"
      },
      "typeVersion": 1.6
    },
    {
      "id": "141a68dd-8c98-4209-83e2-56860071e77a",
      "name": "Note autocollante",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -176,
        320
      ],
      "parameters": {
        "color": 4,
        "width": 740,
        "height": 700,
        "content": "#  Audit de lisibilité SEO pour l’IA\n\n**Objectif :**  \nCe workflow analyse le HTML d’un site web afin d’évaluer sa lisibilité et son accessibilité pour des modèles de langage (LLMs) comme ChatGPT ou Perplexity, qui parcourent souvent les pages sans exécuter JavaScript.\n\n**Fonctionnement :**  \n1. L’utilisateur saisit une URL dans le chat.  \n2. Le workflow récupère le HTML brut (simulation d’un crawler sans JavaScript).  \n3. Il extrait les principaux éléments SEO (contenu textuel, titres, métadonnées, etc.).  \n4. Un LLM analyse ces données pour fournir :  \n   - Un score de lisibilité pour l’IA (0–10)  \n   - Un résumé de l’accessibilité du site  \n   - Des recommandations concrètes  \n   - Un rappel pour vérifier le fichier `robots.txt`\n\n\n**Utilisation :**  \n1. Configurez la clé API dans le nœud OpenAI.  \n2. Activez le workflow.  \n3. Ouvrez l’URL du chat fournie par le nœud « Quand un message de chat est reçu ».\n\n**Personnalisation :**  \n- **Modèle LLM :** modifiable dans le nœud « Modèle de chat OpenAI ».  \n- **Prompt d’analyse :** modifiable dans le nœud « Analyse SEO IA »."
      },
      "typeVersion": 1
    },
    {
      "id": "13e268a8-41b6-45a3-88d4-d71ec2e11753",
      "name": "Modèle de chat OpenAI",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        976,
        320
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o",
          "cachedResultName": "gpt-4o"
        },
        "options": {
          "temperature": 0.3
        }
      },
      "typeVersion": 1.2
    }
  ],
  "active": true,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "9a8473fe-514f-4012-9d0f-41e0f367e885",
  "connections": {
    "Modèle de chat OpenAI": {
      "ai_languageModel": [
        [
          {
            "node": "Analyse SEO IA",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Nettoyer l’URL du site web": {
      "main": [
        [
          {
            "node": "Récupérer le HTML du site web",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Récupérer le HTML du site web": {
      "main": [
        [
          {
            "node": "Extraire les caractéristiques HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Quand un message de chat est reçu": {
      "main": [
        [
          {
            "node": "Nettoyer l’URL du site web",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extraire les caractéristiques HTML": {
      "main": [
        [
          {
            "node": "Analyse SEO IA",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}