Automatisation de la découverte et de la publication d'actualités avec GPT-4, Google Search API et Slack

Intermédiaire

Ceci est unMiscellaneous, Multimodal AIworkflow d'automatisation du domainecontenant 14 nœuds.Utilise principalement des nœuds comme Code, Slack, HttpRequest, GoogleSheets, Agent. Utiliser GPT-4, l'API de recherche Google et Slack pour automatiser la découverte et la publication de nouvelles

Prérequis
  • Token Bot Slack ou URL Webhook
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Informations d'identification Google Sheets API
  • Clé API OpenAI
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "meta": {
    "instanceId": "58d60dd9256bdb5987eb9f9ae86bf49505ac31ccad75aec6db9c9d448b351af0"
  },
  "nodes": [
    {
      "id": "15fe5e33-4d9f-4bc9-9e72-ac1af36c3fe8",
      "name": "📋 Instructions de Configuration",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        800,
        96
      ],
      "parameters": {
        "color": 7,
        "width": 390.1693164217126,
        "height": 464.5206143079691,
        "content": "## 📊 Google Sheets Setup Instructions\n\n### 1. Create a Google Sheet:\n- Create a new Google Sheet\n- Name it \"n8n Blog Tracker\"\n- Rename the first sheet to \"ProcessedWorkflows\"\n\n### 2. Add Headers (Row 1):\n- A1: workflow_id\n- B1: title\n- C1: slug\n- D1: query\n- E1: published_at\n- F1: seo_score\n- G1: word_count\n- H1: featured\n- I1: status\n\n### 3. Get Sheet ID:\n- Open your Google Sheet\n- Copy the ID from the URL:\n  `https://docs.google.com/spreadsheets/d/[THIS_IS_YOUR_SHEET_ID]/edit`\n\n### 4. Update Both Google Sheets Nodes:\n- Replace \"YOUR_GOOGLE_SHEET_ID\" in both:\n  - \"Get Processed Workflows\" node\n  - \"Log to Google Sheets\" node\n\n### 5. Connect Google Account:\n- Click on either Google Sheets node\n- Add Google Sheets credentials\n- Authenticate with your Google account"
      },
      "typeVersion": 1
    },
    {
      "id": "b3073aba-2403-4ec3-9f30-0aa1fa864c5b",
      "name": "Préparer les Données de Publication 1",
      "type": "n8n-nodes-base.code",
      "position": [
        2448,
        704
      ],
      "parameters": {
        "jsCode": "const response = $input.item.json;\nlet articleData;\n\ntry {\n  let content = response.message?.content || '';\n  \n  // Clean up JSON extraction\n  if (content.includes('```json')) {\n    const start = content.indexOf('```json') + 7;\n    const end = content.lastIndexOf('```');\n    content = content.substring(start, end).trim();\n  }\n  \n  // Handle incomplete JSON\n  if (!content.trim().endsWith('}')) {\n    const lastQuote = content.lastIndexOf('\"');\n    if (lastQuote > 0) {\n      content = content.substring(0, lastQuote + 1) + '}';\n    }\n  }\n  \n  articleData = JSON.parse(content);\n  \n} catch (e) {\n  console.log('JSON parse failed:', e.message);\n  \n  // Fallback extraction\n  const raw = response.message?.content || '';\n  articleData = {\n    title: (raw.match(/\"title\"\\s*:\\s*\"([^\"]*)\"/)?.[1]) || \"Industry Update\",\n    metaDescription: (raw.match(/\"metaDescription\"\\s*:\\s*\"([^\"]*)\"/)?.[1]) || \"Latest industry news\",\n    content: (raw.match(/\"content\"\\s*:\\s*\"([^\"]*)\"/s)?.[1]) || \"Content extraction failed\",\n    focusKeyphrase: \"ai automation\",\n    readingTime: 8,\n    seoScore: 90,\n    wordCount: 2500\n  };\n}\n\n// MINIMAL formatting since GPT should output correctly\nlet formattedContent = (articleData.content || \"\")\n  // Fix escaped characters\n  .replace(/\\\\\"/g, '\"')\n  .replace(/\\\\n\\\\n/g, '\\n\\n')\n  .replace(/\\\\n/g, '\\n')\n  \n  // Just clean up any remaining spacing issues\n  .replace(/\\n{3,}/g, '\\n\\n')\n  .replace(/^\\n+|\\n+$/g, '')\n  .trim();\n\n// Calculate actual word count\nconst wordCount = formattedContent.split(/\\s+/).filter(word => word.length > 0).length;\n\nreturn [{\n  article: {\n    title: articleData.title,\n    metaDescription: articleData.metaDescription,\n    content: formattedContent,\n    focusKeyphrase: articleData.focusKeyphrase || \"ai automation\",\n    readingTime: Math.ceil(wordCount / 250) || 8,\n    seoScore: articleData.seoScore || 90,\n    wordCount: wordCount\n  },\n  publishing: {\n    slug: (articleData.title || \"article\")\n      .toLowerCase()\n      .replace(/[^a-z0-9]+/g, '-')\n      .replace(/^-+|-+$/g, '')\n      .substring(0, 60),\n    featured: true,\n    publishedAt: new Date().toISOString()\n  },\n  seo: {\n    keyword: articleData.focusKeyphrase || \"ai automation\",\n    intent: \"informational\",\n    difficulty: 5,\n    volume: \"5000/mo\",\n    contentAngle: \"industry analysis\"\n  },\n  metadata: {\n    category: \"AI & Technology\",\n    originalUrl: \"\",\n    originalSource: \"Generated\",\n    sources: [],\n    tags: [\"ai\", \"enterprise\", \"automation\", \"technology\"]\n  },\n  image: {\n    url: \"https://source.unsplash.com/1200x630/?technology,artificial-intelligence\",\n    alt: articleData.title || \"Technology\"\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "25c9e154-5434-47b0-a274-e498767d6e90",
      "name": "Publier sur le CMS 1",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueRegularOutput",
      "position": [
        2672,
        704
      ],
      "parameters": {
        "url": "webhook_url",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n \"title\": {{ JSON.stringify($json.article.title) }},\n \"slug\": {{ JSON.stringify($json.publishing.slug) }},\n \"meta_description\": {{ JSON.stringify($json.article.metaDescription) }},\n \"body_markdown\": {{ JSON.stringify($json.article.content) }},\n \"focus_keyphrase\": {{ JSON.stringify($json.article.focusKeyphrase) }},\n \"reading_time\": {{ JSON.stringify(String($json.article.readingTime)) }},\n \"seo_score\": {{ JSON.stringify(String($json.article.seoScore)) }},\n \"word_count\": {{ JSON.stringify(String($json.article.wordCount)) }},\n \"keyword\": {{ JSON.stringify($json.seo.keyword) }},\n \"intent\": {{ JSON.stringify($json.seo.intent) }},\n \"difficulty\": {{ JSON.stringify(String($json.seo.difficulty)) }},\n \"volume\": {{ JSON.stringify($json.seo.volume) }},\n \"content_angle\": {{ JSON.stringify($json.seo.contentAngle) }},\n \"category\": {{ JSON.stringify($json.metadata.category) }},\n \"featured\": {{ $json.publishing.featured }},\n \"author\": \"Lexi\",\n \"publish_date\": {{ JSON.stringify($json.publishing.publishedAt) }},\n \"sources\": {{ JSON.stringify($json.metadata.sources) }},\n \"original_url\": {{ JSON.stringify($json.metadata.originalUrl) }},\n \"news_type\": {{ JSON.stringify($json.seo.intent) }},\n \"tags\": {{ JSON.stringify($json.metadata.tags) }},\n \"image_url\": {{ JSON.stringify($json.image.url) }},\n \"image_caption\": {{ JSON.stringify($json.image.alt) }},\n \"image_credit\": \"Unsplash\",\n \"cta_label\": \"Subscribe for Updates\",\n \"cta_url\": \"https://kalyxi.ai/#contact\"\n}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.1
    },
    {
      "id": "d52e2366-3a77-47d6-91cc-334ead72f289",
      "name": "Déclencheur Quotidien",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        848,
        704
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 7
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "92c9457e-5dd2-4177-9ea0-29156543be78",
      "name": "Rechercher des Articles Récents",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueRegularOutput",
      "position": [
        1424,
        704
      ],
      "parameters": {
        "url": "https://www.googleapis.com/customsearch/v1",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json"
            }
          }
        },
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "key",
              "value": "google_api_key"
            },
            {
              "name": "cx",
              "value": "custom_search_id"
            },
            {
              "name": "q",
              "value": "={{ $json.output }}"
            },
            {
              "name": "dateRestrict",
              "value": "d7"
            },
            {
              "name": "num",
              "value": "5"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "c223a640-db05-4b7d-a4f2-b2344d9693b4",
      "name": "Extraire le Meilleur Article",
      "type": "n8n-nodes-base.code",
      "position": [
        1648,
        704
      ],
      "parameters": {
        "jsCode": "// Parse search results and extract the best article\nconst searchResults = $input.item.json;\nlet articles = [];\n\n// Handle Google Custom Search API response\nif (searchResults.items && Array.isArray(searchResults.items)) {\n searchResults.items.forEach(item => {\n   const urlParts = item.link.match(/^https?:\\/\\/([^\\/]+)/);\n   const hostname = urlParts ? urlParts[1] : 'unknown';\n   \n   articles.push({\n     title: item.title,\n     url: item.link,\n     snippet: item.snippet,\n     source: hostname,\n     publishDate: new Date().toISOString()\n   });\n });\n}\n\n// Return all articles found\nreturn articles;"
      },
      "typeVersion": 2
    },
    {
      "id": "3eef26f8-8ed4-4dcb-aa4f-256880e19127",
      "name": "Générer un Article Original",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "onError": "continueRegularOutput",
      "position": [
        2096,
        704
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4-turbo-preview"
        },
        "options": {
          "maxTokens": 4096,
          "temperature": 0.7
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are an expert content strategist specializing in AI and enterprise automation. Your task is to create a comprehensive, original article based on current industry trends and insights. You must:\n\n1. Write completely original content - never copy or closely paraphrase\n2. Add significant new analysis, insights, and perspectives\n3. Include real-world examples and implementation strategies\n4. Cite sources properly using [1], [2], etc. format\n5. Create SEO-optimized content with natural keyword usage\n6. Focus on practical, actionable insights for enterprise leaders\n7. Maintain a professional, authoritative tone\n8. Structure content with clear sections and subheadings\n9. minimum : 5000 words"
            },
            {
              "content": "=Create a comprehensive news article based on this source material:\n\nTopic:  {{ $json.content }}\nOriginal Title: {{ $json.title }}\nSource: {{ $json.source }}\nContent Preview: {{ $json.content ? $json.content.substring(0, 2000) : $json.snippet }}\nSnippet: {{ $json.snippet }}\n\nWrite a NEWS ARTICLE in the style of Reuters, Bloomberg, or The Wall Street Journal that:\n\nJOURNALISTIC REQUIREMENTS:\n- Lead with the most newsworthy angle in the first paragraph\n- Use inverted pyramid structure (most important info first)\n- Include specific data points, percentages, and dollar amounts\n- Quote industry experts and executives (create realistic quotes)\n- Maintain objective, third-person reporting tone\n- Use present tense for current developments, past tense for context\n- Include company names, market positions, and competitive landscape\n- Add geographical and temporal context\n\nARTICLE STRUCTURE:\n1. HEADLINE: Punchy, specific, newsworthy (60 chars max)\n2. LEDE: Answer who, what, when, where, why in 2-3 sentences\n3. KEY DEVELOPMENTS: 3-4 paragraphs on the main news\n4. MARKET CONTEXT: Industry trends, competitor moves, market size\n5. EXPERT ANALYSIS: 2-3 quoted perspectives from analysts/executives\n6. IMPLICATIONS: What this means for businesses/investors\n7. BACKGROUND: Relevant history and previous developments\n8. OUTLOOK: Future projections and upcoming catalysts\n\nCRITICAL FORMATTING REQUIREMENTS:\n- Use ## for ALL section headers\n- Separate ALL paragraphs with double line breaks (\\n\\n)\n- Never merge text with headers (e.g., NOT \"## Key DevelopmentsThe company...\")\n- Always use: \"## Header\\n\\nParagraph text here\\n\\nNext paragraph\"\n- Include proper quote spacing: \"Quote text,\" said Name, Title.\n\nSTYLE GUIDELINES:\n- Short paragraphs (2-3 sentences max)\n- Active voice\n- Specific rather than general claims\n- Numbers and data in context\n- Avoid jargon without explanation\n- Include source attribution {{ $json.source }}\n\nFormat as VALID JSON:\n{\n  \"title\": \"News headline with specific claim or metric\",\n  \"metaDescription\": \"SEO description with key facts (150-160 chars)\",\n  \"content\": \"## Introduction\\n\\n[Opening paragraph with newsworthy lead]\\n\\n[Context paragraph]\\n\\n## Key Developments\\n\\n[Main developments paragraph]\\n\\n[Quote paragraph with attribution]\\n\\n## Market Context\\n\\n[Industry analysis paragraph]\\n\\n[Competitive landscape paragraph]\\n\\n## Expert Analysis\\n\\n[Expert opinion paragraph]\\n\\n[Additional analysis paragraph]\\n\\n## Implications\\n\\n[Business impact paragraph]\\n\\n## Background\\n\\n[Historical context paragraph]\\n\\n## Outlook\\n\\n[Future projections paragraph]\",\n  \"focusKeyphrase\": \"primary news keyword\",\n  \"sources\": [\"{{ $json.source }}\", \"Additional context sources\"],\n  \"takeaways\": [\"Key fact 1\", \"Key fact 2\", \"Key fact 3\"],\n  \"readingTime\": 8,\n  \"seoScore\": 95,\n  \"wordCount\": 2500\n}\n\nIMPORTANT: \n- Use \\n\\n between ALL paragraphs in the content field\n- Never write \"## Key DevelopmentsThe company\" - always use proper spacing\n- Each section must be clearly separated with headers\n- Content should be 2000-3000 words for comprehensive coverage\n- Include at least 3 realistic quotes from different sources\n- Add specific metrics, percentages, and dollar amounts throughout"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "id": "QA7B68gnhpvpZoob",
          "name": "Kalyxi - OpenAI Account - Project: Digital Content AI Team - Email: support@"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "002c5b6f-35c5-4466-b49f-5a7cb6785eb0",
      "name": "Envoyer une Notification Slack",
      "type": "n8n-nodes-base.slack",
      "onError": "continueRegularOutput",
      "position": [
        3120,
        704
      ],
      "webhookId": "4b559e3f-ee66-48e2-92ae-29b314b46905",
      "parameters": {
        "text": "=*AI-Powered News Content Automation Pipeline*\n\n✅ *New AI Article Published!*\n\n📝 *Title:* {{ $('Publish to CMS1').item.json.article.title }} \n📊 *Metrics:*\\n• \nSEO Score: {{ $('Publish to CMS1').item.json.article.seo_score }}/100 \nWord Count: {{ $('Publish to CMS1').item.json.article.word_count }}  \n \n🎯 *SEO Details:*\nFocus Keyword: {{ $('Prepare Publishing Data1').item.json.seo.keyword }}\\\nSearch Volume: {{ $('Prepare Publishing Data1').item.json.seo.volume }}\\\nDifficulty: {{ $('Prepare Publishing Data1').item.json.seo.difficulty }}/10\n🔗 *Meta:* {{ $('Prepare Publishing Data1').item.json.article.metaDescription }}\n \n👉 *View Article:* {{ $('Publish to CMS1').item.json.article.url }} ",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09CDD3UM3R",
          "cachedResultName": "seo-manager"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "id": "CjOkXK5NYh1BfGCc",
          "name": "Kalyxi Slack Account - Ignacio"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "85a3b60c-a105-48e1-a779-f08273de977f",
      "name": "Journaliser dans Google Sheets 2",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        2896,
        704
      ],
      "parameters": {
        "columns": {
          "value": {
            "slug": "={{ $json.article.slug }}",
            "query": "={{ $('Prepare Publishing Data1').item.json.article.focusKeyphrase }}",
            "title": "={{ $json.article.title }}",
            "status": "={{ $json.message }}",
            "featured": "={{ $('Prepare Publishing Data1').item.json.image.url }}",
            "seo_score": "={{ $json.article.seo_score }}",
            "word_count": "={{ $json.article.word_count }}",
            "workflow_id": "={{ $json.article.id }}",
            "published_at": "={{ $json.article.published_date }}"
          },
          "schema": [
            {
              "id": "workflow_id",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "workflow_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "slug",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "slug",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "query",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "query",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "published_at",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "published_at",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "seo_score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "seo_score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "word_count",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "word_count",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "featured",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "featured",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1xS3rd0wSAub5qS9RT7PQhbkoVuxFeKbyNeT9QweC1gw/edit#gid=0",
          "cachedResultName": "ProcessedWorkflows"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1xS3rd0wSAub5qS9RT7PQhbkoVuxFeKbyNeT9QweC1gw",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1xS3rd0wSAub5qS9RT7PQhbkoVuxFeKbyNeT9QweC1gw/edit?usp=drivesdk",
          "cachedResultName": "n8n Blog Tracker"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "nCwr4sPzRb9b7EoR",
          "name": "Kalyxi Support Account - support@kalyxi"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "e8d27e02-ea01-470b-8c5d-efc083cdf0ef",
      "name": "Agent IA",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1072,
        704
      ],
      "parameters": {
        "text": "```\nCheck the Google Sheets processed articles list. Generate ONE unique search query for our AI/automation niche that hasn't been covered yet.\n\nOutput only the search phrase. Nothing else.\n\nExample output:\nedge computing ai manufacturing\n\nRequirements:\n- 3-5 words maximum\n- Must be different from previous searches\n- Stay within AI/enterprise/automation topics\n- No explanations, just the query\n```",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "c3eda3f1-b438-4e85-bf7c-12c6cfad733a",
      "name": "Obtenir la/les ligne(s) dans la feuille Google Sheets",
      "type": "n8n-nodes-base.googleSheetsTool",
      "position": [
        1216,
        928
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('values0_Value', ``, 'string') }}",
              "lookupColumn": "query"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1xS3rd0wSAub5qS9RT7PQhbkoVuxFeKbyNeT9QweC1gw/edit#gid=0",
          "cachedResultName": "ProcessedWorkflows"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1xS3rd0wSAub5qS9RT7PQhbkoVuxFeKbyNeT9QweC1gw",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1xS3rd0wSAub5qS9RT7PQhbkoVuxFeKbyNeT9QweC1gw/edit?usp=drivesdk",
          "cachedResultName": "n8n Blog Tracker"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "nCwr4sPzRb9b7EoR",
          "name": "Kalyxi Support Account - support@kalyxi"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "94b5558e-2855-4ce0-8071-0b87f21077da",
      "name": "Modèle de Chat OpenAI",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1088,
        928
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4-turbo-preview",
          "cachedResultName": "gpt-4-turbo-preview"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "HJIzncdtPshQzpyx",
          "name": "Kalyxi - OpenAI Account - Project: Cold Outreach AI Team - Email: support@"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "48895c3d-a820-477f-b16f-52ebd9d44241",
      "name": "🚀 Instructions de Configuration",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        352,
        96
      ],
      "parameters": {
        "color": 4,
        "width": 420,
        "height": 868,
        "content": "## 🤖 AI News Content Pipeline Setup\n\n### Required APIs & Credentials:\n- **OpenAI API Key** (GPT-4 access required)\n- **Google Custom Search API** + Search Engine ID\n- **Google Sheets OAuth2** (for tracking)\n- **Slack OAuth2** (for notifications)\n- **Custom CMS Endpoint** (for publishing)\n\n### Setup Steps:\n1. **Configure Search Engine:**\n   - Update Google Custom Search API key\n   - Set your custom search engine ID\n\n2. **Update CMS Endpoint:**\n   - Replace CMS URL in \"Publish to CMS\" node\n   - Adjust JSON mapping for your CMS structure\n\n3. **Google Sheets Setup:**\n   - Create sheet with headers: workflow_id, title, slug, query, published_at, seo_score, word_count, featured, status\n   - Update sheet ID in both Google Sheets nodes\n\n4. **Schedule Configuration:**\n   - Current: Every 8 hours\n   - Adjust in \"Daily Schedule Trigger\" node\n\n### Key Features:\n- Intelligent duplicate prevention\n- SEO-optimized content generation\n- Professional news article formatting\n- Multi-channel publishing pipeline"
      },
      "typeVersion": 1
    },
    {
      "id": "8bf87601-073b-4bee-82c7-a861b2d0e511",
      "name": "Ignorer les Problèmes",
      "type": "n8n-nodes-base.code",
      "position": [
        1872,
        704
      ],
      "parameters": {
        "jsCode": "const articles = $input.all();\nconst filteredArticles = [];\n\nfor (const article of articles) {\n  const url = article.json.url || '';\n  \n  // Skip domains known to have strong anti-bot protection\n  const blockedDomains = [\n    'aibusiness.com',\n    'forbes.com', \n    'wsj.com',\n    'ft.com'\n  ];\n  \n  const isBlocked = blockedDomains.some(domain => url.includes(domain));\n  \n  if (!isBlocked) {\n    filteredArticles.push(article.json);\n  }\n}\n\n// If all articles are blocked, use the first one with just the snippet\nif (filteredArticles.length === 0 && articles.length > 0) {\n  const fallback = articles[0].json;\n  fallback.content = fallback.snippet;\n  filteredArticles.push(fallback);\n}\n\nreturn filteredArticles;"
      },
      "typeVersion": 2
    }
  ],
  "pinData": {},
  "connections": {
    "e8d27e02-ea01-470b-8c5d-efc083cdf0ef": {
      "main": [
        [
          {
            "node": "92c9457e-5dd2-4177-9ea0-29156543be78",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8bf87601-073b-4bee-82c7-a861b2d0e511": {
      "main": [
        [
          {
            "node": "3eef26f8-8ed4-4dcb-aa4f-256880e19127",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "25c9e154-5434-47b0-a274-e498767d6e90": {
      "main": [
        [
          {
            "node": "85a3b60c-a105-48e1-a779-f08273de977f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "94b5558e-2855-4ce0-8071-0b87f21077da": {
      "ai_languageModel": [
        [
          {
            "node": "e8d27e02-ea01-470b-8c5d-efc083cdf0ef",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "c223a640-db05-4b7d-a4f2-b2344d9693b4": {
      "main": [
        [
          {
            "node": "8bf87601-073b-4bee-82c7-a861b2d0e511",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "85a3b60c-a105-48e1-a779-f08273de977f": {
      "main": [
        [
          {
            "node": "002c5b6f-35c5-4466-b49f-5a7cb6785eb0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d52e2366-3a77-47d6-91cc-334ead72f289": {
      "main": [
        [
          {
            "node": "e8d27e02-ea01-470b-8c5d-efc083cdf0ef",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "92c9457e-5dd2-4177-9ea0-29156543be78": {
      "main": [
        [
          {
            "node": "c223a640-db05-4b7d-a4f2-b2344d9693b4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b3073aba-2403-4ec3-9f30-0aa1fa864c5b": {
      "main": [
        [
          {
            "node": "25c9e154-5434-47b0-a274-e498767d6e90",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3eef26f8-8ed4-4dcb-aa4f-256880e19127": {
      "main": [
        [
          {
            "node": "b3073aba-2403-4ec3-9f30-0aa1fa864c5b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c3eda3f1-b438-4e85-bf7c-12c6cfad733a": {
      "ai_tool": [
        [
          {
            "node": "e8d27e02-ea01-470b-8c5d-efc083cdf0ef",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

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

Intermédiaire - Divers, IA Multimodale

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.

Informations sur le workflow
Niveau de difficulté
Intermédiaire
Nombre de nœuds14
Catégorie2
Types de nœuds10
Description de la difficulté

Adapté aux utilisateurs expérimentés, avec des workflows de complexité moyenne contenant 6-15 nœuds

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34