Suite automatisée pour le SEO avancé, les métriques essentielles des pages et l'automatisation des chatbots
Ceci est unMarket Research, AI Chatbotworkflow d'automatisation du domainecontenant 22 nœuds.Utilise principalement des nœuds comme If, Set, Cron, Slack, Start. Relecture et surveillance des performances SEO avec un conseiller GPT-4, PageSpeed Insights et des rappels Slack
- •Token Bot Slack ou URL Webhook
- •Clé API OpenAI
- •Point de terminaison HTTP Webhook (généré automatiquement par n8n)
- •Peut nécessiter les informations d'identification d'authentification de l'API cible
- •Informations d'identification Google Sheets API
Nœuds utilisés (22)
Catégorie
{
"id": "advanced_seo_core_web_vitals_chatbot_automation_suite",
"name": "Advanced SEO, Core Web Vitals & Chatbot Automation Suite",
"nodes": [
{
"id": "node1",
"name": "Start",
"type": "n8n-nodes-base.start",
"parameters": {},
"typeVersion": 1,
"position": [
0,
0
]
},
{
"id": "node2",
"name": "Audit SEO & Core Web Vitals Planifié",
"type": "n8n-nodes-base.cron",
"parameters": {
"mode": "everyHour",
"unit": "hours",
"value": "4",
"options": {}
},
"description": "Triggers comprehensive SEO and Core Web Vitals check every 4 hours",
"typeVersion": 1,
"position": [
180,
0
]
},
{
"id": "node3",
"name": "Écouteur Chatbot Webhook",
"type": "n8n-nodes-base.webhook",
"parameters": {
"path": "chatbot-query",
"options": {},
"webhookId": "seo_chatbot_listener",
"httpMethod": "POST"
},
"description": "Receives user queries from external chatbot platforms",
"typeVersion": 1,
"position": [
360,
0
]
},
{
"id": "node4",
"name": "Liste des Sites Web Surveillés",
"type": "n8n-nodes-base.set",
"parameters": {
"values": [
{
"url": "https://www.yourmainwebsite.com",
"name": "Main Site"
},
{
"url": "https://blog.yourwebsite.com",
"name": "Blog Site"
}
]
},
"description": "List of websites to monitor for SEO and performance",
"typeVersion": 1,
"position": [
540,
0
]
},
{
"id": "node5",
"name": "Crawler HTTP",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{ $json.url }}",
"options": {
"redirects": true,
"fullResponse": true,
"responseFormat": "array"
},
"authentication": "none"
},
"description": "Fetches raw HTML content for parsing",
"typeVersion": 1,
"position": [
720,
0
]
},
{
"id": "node6",
"name": "Analyseur HTML Cheerio (SEO On-Page)",
"type": "n8n-nodes-base.cheerio",
"parameters": {
"extract": [
{
"type": "attribute",
"property": "title",
"selector": "title"
},
{
"type": "attribute",
"property": "meta_description",
"selector": "meta[name=\"description\"]",
"attribute": "content"
},
{
"type": "text",
"property": "h1_tags",
"selector": "h1",
"returnAll": true
},
{
"type": "text",
"property": "h2_tags",
"selector": "h2",
"returnAll": true
},
{
"type": "attribute",
"property": "all_links",
"selector": "a",
"attribute": "href",
"returnAll": true
},
{
"type": "attribute",
"property": "img_alt_tags",
"selector": "img",
"attribute": "alt",
"returnAll": true
},
{
"type": "attribute",
"property": "canonical_tag",
"selector": "link[rel=\"canonical\"]",
"attribute": "href"
},
{
"type": "attribute",
"property": "robots_meta",
"selector": "meta[name=\"robots\"]",
"attribute": "content"
},
{
"type": "text",
"property": "schema_json_ld",
"selector": "script[type=\"application/ld+json\"]",
"returnAll": true
}
],
"dataSelector": "body"
},
"description": "Extracts critical on-page SEO elements from HTML",
"typeVersion": 1,
"position": [
900,
0
]
},
{
"id": "node7",
"name": "Validateur SEO On-Page",
"type": "n8n-nodes-base.function",
"parameters": {
"options": {},
"functionType": "js",
"functionScript": "const data = items[0].json;\n\nconst onPageIssues = {\n missing_title: !data.title || data.title.trim() === '',\n title_too_short: data.title && data.title.length < 10,\n title_too_long: data.title && data.title.length > 60,\n missing_meta_description: !data.meta_description || data.meta_description.trim() === '',\n meta_description_too_short: data.meta_description && data.meta_description.length < 50,\n meta_description_too_long: data.meta_description && data.meta_description.length > 160,\n multiple_h1: data.h1_tags && data.h1_tags.length > 1,\n missing_h1: !data.h1_tags || data.h1_tags.length === 0,\n missing_alt_text_count: data.img_alt_tags ? data.img_alt_tags.filter(alt => !alt || alt.trim() === '').length : 0,\n missing_canonical: !data.canonical_tag || data.canonical_tag.trim() === '',\n noindex_present: data.robots_meta && data.robots_meta.includes('noindex'),\n schema_present: data.schema_json_ld && data.schema_json_ld.length > 0\n};\n\nreturn [{ json: { ...data, onPageIssues: onPageIssues } }];"
},
"description": "Checks for common on-page SEO issues",
"typeVersion": 1,
"position": [
1080,
0
]
},
{
"id": "node8",
"name": "Récupérer Robots.txt",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{ new URL('/robots.txt', $json.url).href }}",
"options": {
"responseFormat": "string"
},
"authentication": "none"
},
"description": "Fetches the robots.txt file for analysis",
"typeVersion": 1,
"position": [
1260,
0
]
},
{
"id": "node9",
"name": "Vérifier la Présence du Sitemap.xml",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{ new URL('/sitemap.xml', $json.url).href }}",
"options": {},
"authentication": "none"
},
"description": "Checks if sitemap.xml exists (will fail if 404)",
"typeVersion": 1,
"position": [
1440,
0
]
},
{
"id": "node10",
"name": "Validateur SEO Technique",
"type": "n8n-nodes-base.function",
"parameters": {
"options": {},
"functionType": "js",
"functionScript": "const url = new URL(items[0].json.url);\nconst isHttps = url.protocol === 'https:';\n\nlet robotsTxtContent = null;\ntry {\n robotsTxtContent = items[1].json.data;\n} catch (error) {\n // robots.txt might not exist or be reachable\n robotsTxtContent = 'Not Found or Error';\n}\n\nlet sitemapPresent = false;\ntry {\n if (items[2].json.statusCode === 200) {\n sitemapPresent = true;\n }\n} catch (error) {\n // sitemap.xml might not exist or be reachable\n sitemapPresent = false;\n}\n\nconst technicalIssues = {\n is_https: isHttps,\n robots_txt_content: robotsTxtContent,\n sitemap_xml_present: sitemapPresent,\n broken_links_check_needed: true // Placeholder for a dedicated broken link checker\n};\n\nreturn [{ json: { ...items[0].json, technicalIssues: technicalIssues } }];"
},
"description": "Validates HTTPS, robots.txt presence/content, and sitemap.xml",
"typeVersion": 1,
"position": [
1620,
0
]
},
{
"id": "node11",
"name": "Audit SEO & Recommandations par IA",
"type": "n8n-nodes-base.openAi",
"parameters": {
"model": "gpt-4o",
"prompt": "Analyze the following web page's SEO elements and technical findings. Provide a summary of issues and actionable recommendations. Focus on missing critical elements, length issues, duplicate content potential (if canonical is missing), and impact of technical issues.\n\nURL: '{{ $json.url }}'\nOn-Page Issues: {{ JSON.stringify($json.onPageIssues) }}\nTechnical Issues: {{ JSON.stringify($json.technicalIssues) }}\n\nContent Sample: '{{ $node[\"HTTP Crawler\"].json[\"data\"].substring(0, 1000) }}'\n\nAlso, provide suggestions for better alt text for images that are missing it, if possible from the content context.",
"options": {
"maxTokens": 1500,
"temperature": 0.7
}
},
"description": "Uses AI to deeply analyze combined SEO data and provide smart recommendations",
"typeVersion": 1,
"position": [
1800,
0
]
},
{
"id": "node12",
"name": "PageSpeed Insights Google API",
"type": "n8n-nodes-base.googlePageSpeedInsights",
"parameters": {
"url": "={{ $json.url }}",
"options": {
"category": [
"performance",
"seo",
"best-practices",
"accessibility"
]
},
"resource": "pagespeed",
"strategy": "desktop",
"operation": "run",
"authentication": "googleApi"
},
"description": "Fetches Core Web Vitals (LCP, INP, CLS) and other performance/SEO metrics",
"typeVersion": 1,
"position": [
1980,
0
]
},
{
"id": "node13",
"name": "Sauvegarder le Rapport SEO Complet dans Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"parameters": {
"data": "={{ JSON.stringify({ URL: $json.url, Date: new Date().toISOString().split('T')[0], TitleOK: !$json.onPageIssues.missing_title && !$json.onPageIssues.title_too_short && !$json.onPageIssues.title_too_long, DescOK: !$json.onPageIssues.missing_meta_description && !$json.onPageIssues.meta_description_too_short && !$json.onPageIssues.meta_description_too_long, HasH1: !$json.onPageIssues.missing_h1, MultipleH1: $json.onPageIssues.multiple_h1, MissingAltTextCount: $json.onPageIssues.missing_alt_text_count, CanonicalPresent: !$json.onPageIssues.missing_canonical, NoindexPresent: $json.onPageIssues.noindex_present, SchemaPresent: $json.onPageIssues.schema_present, IsHTTPS: $json.technicalIssues.is_https, SitemapPresent: $json.technicalIssues.sitemap_xml_present, LCP: $node[\"Google PageSpeed Insights API\"].json[\"lighthouseResult\"].audits[\"largest-contentful-paint\"].numericValue, INP: $node[\"Google PageSpeed Insights API\"].json[\"lighthouseResult\"].audits[\"interaction-to-next-paint\"].numericValue, AIRecommendations: $node[\"AI SEO Audit & Recommendations\"].json[\"choices\"][0].message.content }) }}",
"operation": "append",
"sheetName": "Comprehensive SEO Reports",
"spreadsheetId": "YOUR_GOOGLE_SHEET_ID",
"authentication": "googleOAuth2Api",
"valueInputOption": "USER_ENTERED"
},
"description": "Logs detailed on-page, technical, and Core Web Vitals data to a Google Sheet",
"typeVersion": 1,
"position": [
2160,
0
]
},
{
"id": "node14",
"name": "Contrôle de Santé SEO Global (Déclencheur d'Alerte)",
"type": "n8n-nodes-base.if",
"parameters": {
"combineAll": "false",
"conditions": {
"string": [
{
"value1": "={{ $json.onPageIssues.missing_title || $json.onPageIssues.title_too_short || $json.onPageIssues.title_too_long || $json.onPageIssues.missing_meta_description || $json.onPageIssues.meta_description_too_short || $json.onPageIssues.meta_description_too_long || $json.onPageIssues.multiple_h1 || $json.onPageIssues.missing_h1 || $json.onPageIssues.missing_alt_text_count > 0 || $json.onPageIssues.missing_canonical || $json.onPageIssues.noindex_present || !$json.technicalIssues.is_https || !$json.technicalIssues.sitemap_xml_present }}",
"value2": "true",
"operation": "boolean"
},
{
"value1": "={{ $node[\"Google PageSpeed Insights API\"].json[\"lighthouseResult\"].audits[\"largest-contentful-paint\"].numericValue }}",
"value2": "2500",
"operation": "greater"
},
{
"value1": "={{ $node[\"Google PageSpeed Insights API\"].json[\"lighthouseResult\"].audits[\"interaction-to-next-paint\"].numericValue }}",
"value2": "200",
"operation": "greater"
}
]
}
},
"description": "Triggers alert if any critical SEO or CWV issue is found",
"typeVersion": 1,
"position": [
2340,
0
]
},
{
"id": "node15",
"name": "Envoyer une Alerte d'Audit SEO Complet (Slack)",
"type": "n8n-nodes-base.slack",
"parameters": {
"text": "🚨 *Comprehensive SEO Audit Alert for {{ $json.url }}* 🚨\n\n*On-Page SEO Issues:*\n- Missing Title: {{ $json.onPageIssues.missing_title ? 'Yes' : 'No' }}\n- Title Length OK: {{ !($json.onPageIssues.title_too_short || $json.onPageIssues.title_too_long) ? 'Yes' : 'No' }}\n- Missing Meta Description: {{ $json.onPageIssues.missing_meta_description ? 'Yes' : 'No' }}\n- Meta Description Length OK: {{ !($json.onPageIssues.meta_description_too_short || $json.onPageIssues.meta_description_too_long) ? 'Yes' : 'No' }}\n- Multiple H1s: {{ $json.onPageIssues.multiple_h1 ? 'Yes' : 'No' }}\n- Missing H1: {{ $json.onPageIssues.missing_h1 ? 'Yes' : 'No' }}\n- Missing Alt Text Count: {{ $json.onPageIssues.missing_alt_text_count }}\n- Missing Canonical: {{ $json.onPageIssues.missing_canonical ? 'Yes' : 'No' }}\n- Noindex Present: {{ $json.onPageIssues.noindex_present ? 'Yes' : 'No' }}\n- Schema Present: {{ $json.onPageIssues.schema_present ? 'Yes' : 'No' }}\n\n*Technical SEO Issues:*\n- Is HTTPS: {{ $json.technicalIssues.is_https ? 'Yes' : 'No' }}\n- Sitemap.xml Present: {{ $json.technicalIssues.sitemap_xml_present ? 'Yes' : 'No' }}\n- Robots.txt Content:\n```\n{{ $json.technicalIssues.robots_txt_content.substring(0, 200) }}...\n```\n\n*Core Web Vitals:*\n- *LCP:* {{ $node[\"Google PageSpeed Insights API\"].json[\"lighthouseResult\"].audits[\"largest-contentful-paint\"].numericValue }} ms (Good: < 2.5s)\n- *INP:* {{ $node[\"Google PageSpeed Insights API\"].json[\"lighthouseResult\"].audits[\"interaction-to-next-paint\"].numericValue }} ms (Good: < 200ms)\n\n*AI Recommendations:*\n```\n{{ $node[\"AI SEO Audit & Recommendations\"].json[\"choices\"][0].message.content.substring(0, 1000) }}...\n```\n\n_Full report saved to Google Sheet._",
"options": {},
"webhookUrl": "YOUR_SLACK_WEBHOOK_URL"
},
"description": "Sends detailed audit findings and AI recommendations to Slack",
"typeVersion": 1,
"position": [
2520,
0
]
},
{
"id": "node16",
"name": "Traitement du Langage Naturel & Réponse du Chatbot IA",
"type": "n8n-nodes-base.openAi",
"parameters": {
"model": "gpt-4o",
"prompt": "The user asked: '{{ $json.body.query }}'. Analyze their query about SEO or website performance (LCP/INP) and provide a relevant, concise, and actionable response. Focus on identifying specific entities like 'website URL', 'keyword', 'SEO topic', or 'technical issue'. Based on the query, provide explanations, best practices, or troubleshooting steps.\n\nExample intents:\n- 'Check SEO for [URL]'\n- 'Explain LCP/INP'\n- 'How to fix missing titles?'\n- 'What's wrong with my robots.txt?'\n\nIf the query requires data retrieval, state that you are fetching the data and then provide a summary. If the query is general, provide a general SEO/performance tip. Be helpful and professional.",
"options": {
"maxTokens": 300,
"temperature": 0.7
}
},
"description": "Processes chatbot query, understands intent, and generates intelligent response",
"typeVersion": 1,
"position": [
2700,
0
]
},
{
"id": "node17",
"name": "Extraire les Entités et l'Intention du Chatbot",
"type": "n8n-nodes-base.function",
"parameters": {
"options": {},
"functionType": "js",
"functionScript": "const userQuery = items[0].json.body.query.toLowerCase();\nconst entities = {};\n\n// URL extraction\nconst urlMatch = userQuery.match(/https?://[^\\s]+/);\nif (urlMatch) entities.url = urlMatch[0];\n\n// Keyword extraction\nconst keywordMatch = userQuery.match(/keyword\\s['\"]?([\\w\\s]+)['\"]?/);\nif (keywordMatch) entities.keyword = keywordMatch[1].trim();\n\n// Specific SEO terms\nif (userQuery.includes('title')) entities.seo_topic = 'title';\nif (userQuery.includes('description')) entities.seo_topic = 'meta_description';\nif (userQuery.includes('h1')) entities.seo_topic = 'h1';\nif (userQuery.includes('alt text')) entities.seo_topic = 'alt_text';\nif (userQuery.includes('canonical')) entities.seo_topic = 'canonical';\nif (userQuery.includes('noindex')) entities.seo_topic = 'noindex';\nif (userQuery.includes('schema')) entities.seo_topic = 'schema';\n\n// Technical SEO terms\nif (userQuery.includes('robots.txt')) entities.technical_topic = 'robots.txt';\nif (userQuery.includes('sitemap')) entities.technical_topic = 'sitemap.xml';\nif (userQuery.includes('https') || userQuery.includes('ssl')) entities.technical_topic = 'https';\n\n// Performance terms\nif (userQuery.includes('lcp')) entities.performance_metric = 'lcp';\nif (userQuery.includes('inp')) entities.performance_metric = 'inp';\nif (userQuery.includes('core web vitals')) entities.performance_metric = 'core_web_vitals';\n\n// If a URL is explicitly mentioned and the query asks for audit, trigger full audit\nif (entities.url && (userQuery.includes('audit') || userQuery.includes('check seo')))\n entities.trigger_full_audit = true;\n\nreturn [{ json: { ...items[0].json, entities: entities } }];"
},
"description": "Extracts key information and intent from chatbot queries",
"typeVersion": 1,
"position": [
2880,
0
]
},
{
"id": "node18",
"name": "Recherche Console Google API - Données de Requête (Chatbot)",
"type": "n8n-nodes-base.googleSearchConsole",
"parameters": {
"options": {
"filter": "query=='{{ $json.entities.keyword || \"\" }}'",
"endDate": "={{ new Date().toISOString().split('T')[0] }}",
"rowLimit": 10,
"startDate": "={{ $json.entities.startDate || \"2024-01-01\" }}",
"dimensions": [
"query"
]
},
"siteUrl": "={{ $json.entities.url || 'https://www.yourmainwebsite.com' }}",
"resource": "searchConsole",
"operation": "get",
"authentication": "googleApi"
},
"description": "Fetches keyword performance data for chatbot queries",
"typeVersion": 1,
"position": [
3060,
0
]
},
{
"id": "node19",
"name": "Répondre au Chatbot Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"parameters": {
"mode": "json",
"options": {},
"jsonBody": "={{ JSON.stringify({ response: $node[\"AI Chatbot NLP & Response\"].json[\"choices\"][0].message.content }) }}",
"webhookRespond": true
},
"description": "Sends the AI-generated response back to the chatbot platform",
"typeVersion": 1,
"position": [
3240,
0
]
},
{
"id": "node20",
"name": "Re-Crawl pour Audit par Chatbot",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{ $json.url }}",
"options": {
"redirects": true,
"fullResponse": true,
"responseFormat": "array"
},
"authentication": "none"
},
"description": "Performs an on-demand crawl if requested by chatbot",
"typeVersion": 1,
"position": [
3420,
0
]
},
{
"id": "node21",
"name": "Exécuter le Workflow d'Audit SEO (Déclenché par Chatbot)",
"type": "n8n-nodes-base.executeWorkflow",
"parameters": {
"node": "AI SEO Audit & Recommendations",
"workflowId": "advanced_seo_core_web_vitals_chatbot_automation_suite"
},
"description": "Triggers the main SEO audit workflow from chatbot request",
"typeVersion": 1,
"position": [
3600,
0
]
},
{
"id": "node22",
"name": "Si le Chatbot Demande un Audit Complet",
"type": "n8n-nodes-base.if",
"parameters": {
"combineAll": "true",
"conditions": {
"string": [
{
"value1": "={{ $json.entities.trigger_full_audit }}",
"value2": "true",
"operation": "boolean"
}
]
}
},
"description": "Checks if the chatbot query explicitly asks for a full SEO audit",
"typeVersion": 1,
"position": [
3780,
0
]
}
],
"active": false,
"version": 1,
"settings": {
"executionTimeout": 3600000
},
"connections": {
"node1": {
"main": [
[
{
"node": "node2",
"type": "main",
"index": 0
},
{
"node": "node3",
"type": "main",
"index": 0
}
]
]
},
"node2": {
"main": [
[
{
"node": "node4",
"type": "main",
"index": 0
}
]
]
},
"node3": {
"main": [
[
{
"node": "node17",
"type": "main",
"index": 0
}
]
]
},
"node4": {
"main": [
[
{
"node": "node5",
"type": "main",
"index": 0
},
{
"node": "node12",
"type": "main",
"index": 0
}
]
]
},
"node5": {
"main": [
[
{
"node": "node6",
"type": "main",
"index": 0
}
]
]
},
"node6": {
"main": [
[
{
"node": "node7",
"type": "main",
"index": 0
}
]
]
},
"node7": {
"main": [
[
{
"node": "node10",
"type": "main",
"index": 0
}
]
]
},
"node8": {
"main": [
[
{
"node": "node10",
"type": "main",
"index": 1
}
]
]
},
"node9": {
"main": [
[
{
"node": "node10",
"type": "main",
"index": 2
}
]
]
},
"node10": {
"main": [
[
{
"node": "node11",
"type": "main",
"index": 0
}
]
]
},
"node11": {
"main": [
[
{
"node": "node13",
"type": "main",
"index": 0
},
{
"node": "node14",
"type": "main",
"index": 0
}
]
]
},
"node12": {
"main": [
[
{
"node": "node13",
"type": "main",
"index": 1
},
{
"node": "node14",
"type": "main",
"index": 1
}
]
]
},
"node13": {
"main": [
[
{
"node": "node15",
"type": "main",
"index": 0
}
]
]
},
"node14": {
"main": [
[
{
"node": "node15",
"type": "main",
"index": 0
}
]
]
},
"node16": {
"main": [
[
{
"node": "node19",
"type": "main",
"index": 0
}
]
]
},
"node17": {
"main": [
[
{
"node": "node22",
"type": "main",
"index": 0
},
{
"node": "node16",
"type": "main",
"index": 0
},
{
"node": "node18",
"type": "main",
"index": 0
}
]
]
},
"node18": {
"main": [
[
{
"node": "node16",
"type": "main",
"index": 1
}
]
]
},
"node20": {
"main": [
[
{
"node": "node6",
"type": "main",
"index": 0
}
]
]
},
"node22": {
"main": [
[
{
"node": "node21",
"type": "main",
"index": 0
}
],
[
{
"node": "node16",
"type": "main",
"index": 0
}
]
]
}
}
}Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Avancé - Étude de marché, Chatbot IA
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
Candra Reza
@candrarezaPartager ce workflow