Cómo Crear un Agente Autónomo en n8n que Busque Noticias y las Publique en Redes Sociales
Imagina un asistente que trabaja mientras duermes: busca las noticias más relevantes de tecnología, las resume de forma atractiva, y las publica en Twitter, LinkedIn y Facebook sin que tengas que hacer nada.
Esto ya no es ciencia ficción. Con n8n y el nodo AI Agent puedes crear "trabajadores digitales" que ejecutan tareas complejas de forma autónoma, tomando decisiones inteligentes gracias a LLMs como GPT-4 o Claude.
En este tutorial construiremos un agente autónomo completo paso a paso, con el workflow listo para importar.
¿Qué es un agente autónomo y por qué n8n es perfecto para crearlos?
Un agente autónomo de IA es un sistema que toma decisiones, ejecuta acciones y aprende de los resultados sin intervención humana constante.
Diferencia entre automatización tradicional y agentes
| Aspecto | Automatización tradicional | Agentes autónomos |
|---|---|---|
| Decisiones | Reglas fijas (if/then) | Razonamiento con LLM |
| Adaptabilidad | Requiere reprogramar | Se adapta al contexto |
| Complejidad | Tareas simples y repetitivas | Tareas complejas multi-paso |
| Herramientas | APIs predefinidas | Usa herramientas dinámicamente |
| Errores | Falla y para | Reintenta con estrategias alternativas |
Por qué n8n es ideal para agentes
Según el blog oficial de n8n, la plataforma fue 3 veces más rápida que escribir código Python con LangChain para un caso de uso real (SanctifAI):
"Creamos nuestro primer workflow en n8n en solo 2 horas gracias al builder visual y los sistemas de enrutamiento." — SanctifAI
Las ventajas de n8n para agentes:
- Nodo AI Agent nativo: Basado en LangChain, con razonamiento y memoria
- 400+ integraciones: APIs de redes sociales, bases de datos, servicios web
- Visual y código: Combina drag-and-drop con JavaScript/Python cuando necesitas
- Self-hosted: Tus datos, tus reglas, sin límites de ejecución
- Gratuito: Licencia fair-code, sin costes ocultos
Arquitectura del agente: Cómo funciona
Flujo completo del agente
1┌─────────────────────────────────────────────────────────────────┐2│ AGENTE AUTÓNOMO DE NOTICIAS │3├─────────────────────────────────────────────────────────────────┤4│ │5│ 1. TRIGGER (Schedule) │6│ └── Cada 6 horas │7│ │8│ 2. BÚSQUEDA DE NOTICIAS │9│ ├── RSS Feeds (TechCrunch, Wired, etc.) │10│ ├── Google Trends │11│ └── News API │12│ │13│ 3. AGENTE AI (Razonamiento) │14│ ├── Analiza relevancia │15│ ├── Selecciona las mejores │16│ └── Decide qué publicar y dónde │17│ │18│ 4. GENERACIÓN DE CONTENIDO │19│ ├── Resumen para Twitter (280 chars) │20│ ├── Post largo para LinkedIn │21│ └── Versión Facebook │22│ │23│ 5. APROBACIÓN (Opcional) │24│ └── Telegram/Slack para revisar antes de publicar │25│ │26│ 6. PUBLICACIÓN │27│ ├── Twitter/X │28│ ├── LinkedIn │29│ └── Facebook │30│ │31│ 7. LOGGING │32│ └── Google Sheets para tracking │33│ │34└─────────────────────────────────────────────────────────────────┘
Componentes clave
- Schedule Trigger: Dispara el agente cada X horas
- RSS/HTTP Nodes: Obtiene noticias de múltiples fuentes
- AI Agent Node: El cerebro que decide qué hacer
- Chat Model Node: Conexión a GPT-4, Claude o modelo local
- Tool Nodes: Herramientas que el agente puede usar
- Social Media Nodes: Twitter, LinkedIn, Facebook
- IF/Switch Nodes: Lógica condicional
- Error Handling: Reintentos y notificaciones de error
Paso 1: Configurar n8n (si no lo tienes)
Opción A: Docker Compose (Recomendado)
1# docker-compose.yml2version: "3.8"3services:4 n8n:5 image: docker.n8n.io/n8nio/n8n:latest6 container_name: n8n7 restart: unless-stopped8 ports:9 - "5678:5678"10 environment:11 - N8N_HOST=localhost12 - N8N_PORT=567813 - N8N_PROTOCOL=http14 - NODE_ENV=production15 - WEBHOOK_URL=http://localhost:5678/16 - GENERIC_TIMEZONE=Europe/Madrid17 # Credenciales de encriptación (genera tu propia clave)18 - N8N_ENCRYPTION_KEY=tu-clave-secreta-muy-larga19 volumes:20 - ./n8n_data:/home/node/.n8n
1# Iniciar2docker compose up -d3 4# Acceder5open http://localhost:5678
Opción B: Home Assistant Add-on
Si ya tienes Home Assistant:
- Ve a Configuración > Complementos > Tienda de complementos
- Busca "n8n" e instala
- Accede desde la barra lateral
Paso 2: Configurar credenciales necesarias
Antes de crear el workflow, necesitas credenciales para:
OpenAI (o alternativa)
- Ve a Credentials > Add Credential > OpenAI API
- Introduce tu API Key de platform.openai.com
Alternativamente, puedes usar:
- Anthropic Claude: Similar configuración
- Ollama local: Gratis, requiere servidor Ollama corriendo
Twitter/X
- Crea una app en developer.twitter.com
- Genera API Key, API Secret, Access Token, Access Token Secret
- En n8n: Credentials > Twitter OAuth1
- Crea app en LinkedIn Developer Portal
- Solicita permisos de
w_member_social - En n8n: Credentials > LinkedIn OAuth2
News API (Opcional)
- Regístrate en newsapi.org (gratis para desarrollo)
- En n8n: Credentials > HTTP Header Auth
- Header Name: X-Api-Key
- Header Value: tu API key
Paso 3: Crear el workflow del agente
3.1 Trigger programado
1{2 "nodes": [3 {4 "name": "Schedule Trigger",5 "type": "n8n-nodes-base.scheduleTrigger",6 "parameters": {7 "rule": {8 "interval": [9 {10 "field": "hours",11 "hoursInterval": 612 }13 ]14 }15 },16 "position": [0, 0]17 }18 ]19}
3.2 Obtener noticias de RSS
1{2 "name": "RSS TechCrunch",3 "type": "n8n-nodes-base.rssFeedRead",4 "parameters": {5 "url": "https://techcrunch.com/feed/"6 }7}
Añade múltiples nodos RSS para diversas fuentes:
1// Fuentes recomendadas de tecnología en español e inglés2const feeds = [3 "https://techcrunch.com/feed/",4 "https://www.wired.com/feed/rss",5 "https://www.theverge.com/rss/index.xml",6 "https://feeds.feedburner.com/elandroidelibre",7 "https://www.xataka.com/feedburner.xml",8 "https://hipertextual.com/feed"9];
3.3 Merge y filtrar noticias
1{2 "name": "Merge Feeds",3 "type": "n8n-nodes-base.merge",4 "parameters": {5 "mode": "append"6 }7}
Añade un nodo Code para filtrar por fecha (últimas 24h):
1// Filtrar noticias de las últimas 24 horas2const now = new Date();3const yesterday = new Date(now - 24 * 60 * 60 * 1000);4 5const recentNews = items.filter(item => {6 const pubDate = new Date(item.json.pubDate || item.json.isoDate);7 return pubDate > yesterday;8});9 10// Limitar a las 10 más recientes11return recentNews.slice(0, 10);
3.4 El nodo AI Agent (el cerebro)
Este es el componente más importante. Configura el nodo AI Agent:
1{2 "name": "AI Agent",3 "type": "@n8n/n8n-nodes-langchain.agent",4 "parameters": {5 "promptType": "define",6 "text": "={{ $json.prompt }}",7 "options": {8 "systemMessage": "Eres un experto en marketing de contenidos tecnológicos. Tu trabajo es:\n\n1. Analizar las noticias proporcionadas\n2. Seleccionar las 3 más relevantes e interesantes para una audiencia tech\n3. Crear contenido atractivo para redes sociales\n\nCriterios de selección:\n- Novedad: ¿Es una noticia reciente y original?\n- Relevancia: ¿Interesa a desarrolladores, emprendedores o entusiastas tech?\n- Engagement: ¿Genera curiosidad o debate?\n\nPara cada noticia seleccionada, genera:\n- tweet: Versión de 280 caracteres con emoji y hashtags\n- linkedin: Post profesional de 200-300 palabras\n- facebook: Post casual de 100-150 palabras\n\nResponde SOLO en formato JSON válido."9 }10 }11}
3.5 Configurar el modelo de chat
Conecta un nodo OpenAI Chat Model al agente:
1{2 "name": "OpenAI Chat Model",3 "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",4 "parameters": {5 "model": "gpt-4-turbo-preview",6 "options": {7 "temperature": 0.7,8 "maxTokens": 20009 }10 }11}
3.6 Preparar el prompt dinámico
Antes del agente, añade un nodo Code para construir el prompt:
1// Construir prompt con las noticias2const noticias = items.map((item, i) => {3 return `4NOTICIA ${i + 1}:5Título: ${item.json.title}6Descripción: ${item.json.contentSnippet || item.json.description}7Fuente: ${item.json.link}8Fecha: ${item.json.pubDate || item.json.isoDate}9`;10}).join('\n---\n');11 12return [{13 json: {14 prompt: `Analiza estas noticias de tecnología y genera contenido para redes sociales:15 16${noticias}17 18Recuerda:191. Selecciona las 3 mejores202. Genera tweet, linkedin y facebook para cada una213. Responde en JSON con esta estructura:22{23 "selected_news": [24 {25 "title": "...",26 "source_url": "...",27 "tweet": "...",28 "linkedin": "...",29 "facebook": "..."30 }31 ]32}`33 }34}];
3.7 Parsear respuesta del agente
Añade un nodo Code para extraer el JSON:
1// Parsear respuesta del agente2const response = items[0].json.output;3 4try {5 // Extraer JSON de la respuesta6 const jsonMatch = response.match(/\{[\s\S]*\}/);7 if (jsonMatch) {8 const parsed = JSON.parse(jsonMatch[0]);9 return parsed.selected_news.map(news => ({ json: news }));10 }11} catch (error) {12 console.error('Error parseando JSON:', error);13}14 15return [];
3.8 Publicar en Twitter
1{2 "name": "Post Twitter",3 "type": "n8n-nodes-base.twitter",4 "parameters": {5 "text": "={{ $json.tweet }}",6 "additionalFields": {}7 },8 "credentials": {9 "twitterOAuth1Api": "tu-credencial"10 }11}
3.9 Publicar en LinkedIn
1{2 "name": "Post LinkedIn",3 "type": "n8n-nodes-base.linkedIn",4 "parameters": {5 "text": "={{ $json.linkedin }}\n\n🔗 Fuente: {{ $json.source_url }}",6 "postAs": "person",7 "visibility": "PUBLIC"8 },9 "credentials": {10 "linkedInOAuth2Api": "tu-credencial"11 }12}
3.10 Sistema de aprobación (opcional pero recomendado)
Para revisar antes de publicar, añade aprobación via Telegram:
1{2 "name": "Telegram Approval",3 "type": "n8n-nodes-base.telegram",4 "parameters": {5 "chatId": "tu-chat-id",6 "text": "📰 *Nueva publicación pendiente*\n\n*Título:* {{ $json.title }}\n\n*Tweet:* {{ $json.tweet }}\n\n*LinkedIn:* {{ $json.linkedin }}\n\n¿Aprobar publicación?",7 "replyMarkup": "inlineKeyboard",8 "inlineKeyboard": {9 "rows": [10 {11 "row": {12 "buttons": [13 { "text": "✅ Aprobar", "callbackData": "approve_{{ $json.id }}" },14 { "text": "❌ Rechazar", "callbackData": "reject_{{ $json.id }}" }15 ]16 }17 }18 ]19 },20 "parse_mode": "Markdown"21 }22}
Paso 4: Workflow completo listo para importar
Copia este JSON y pégalo en n8n (Ctrl+V en el canvas):
1{2 "name": "Agente Autónomo de Noticias Tech",3 "nodes": [4 {5 "parameters": {6 "rule": {7 "interval": [8 {9 "field": "hours",10 "hoursInterval": 611 }12 ]13 }14 },15 "name": "⏰ Cada 6 horas",16 "type": "n8n-nodes-base.scheduleTrigger",17 "position": [0, 300]18 },19 {20 "parameters": {21 "url": "https://techcrunch.com/feed/"22 },23 "name": "📰 TechCrunch",24 "type": "n8n-nodes-base.rssFeedRead",25 "position": [200, 200]26 },27 {28 "parameters": {29 "url": "https://www.xataka.com/feedburner.xml"30 },31 "name": "📰 Xataka",32 "type": "n8n-nodes-base.rssFeedRead",33 "position": [200, 400]34 },35 {36 "parameters": {37 "mode": "append"38 },39 "name": "🔗 Merge Feeds",40 "type": "n8n-nodes-base.merge",41 "position": [400, 300]42 },43 {44 "parameters": {45 "jsCode": "// Filtrar últimas 24h y limitar a 10\nconst now = new Date();\nconst yesterday = new Date(now - 24 * 60 * 60 * 1000);\n\nconst recent = items.filter(item => {\n const date = new Date(item.json.pubDate || item.json.isoDate);\n return date > yesterday;\n});\n\nreturn recent.slice(0, 10);"46 },47 "name": "🔍 Filtrar Recientes",48 "type": "n8n-nodes-base.code",49 "position": [600, 300]50 },51 {52 "parameters": {53 "jsCode": "const noticias = items.map((item, i) => {\n return `NOTICIA ${i + 1}:\\nTítulo: ${item.json.title}\\nDescripción: ${item.json.contentSnippet || item.json.description}\\nFuente: ${item.json.link}\\nFecha: ${item.json.pubDate || item.json.isoDate}`;\n}).join('\\n---\\n');\n\nreturn [{\n json: {\n prompt: `Analiza estas noticias de tecnología:\\n\\n${noticias}\\n\\nSelecciona las 3 mejores y genera para cada una:\\n- tweet (280 chars, con emoji y hashtags)\\n- linkedin (200-300 palabras, profesional)\\n- facebook (100-150 palabras, casual)\\n\\nResponde SOLO en JSON válido con esta estructura:\\n{\"selected_news\": [{\"title\": \"...\", \"source_url\": \"...\", \"tweet\": \"...\", \"linkedin\": \"...\", \"facebook\": \"...\"}]}`\n }\n}];"54 },55 "name": "📝 Preparar Prompt",56 "type": "n8n-nodes-base.code",57 "position": [800, 300]58 },59 {60 "parameters": {61 "promptType": "define",62 "text": "={{ $json.prompt }}",63 "options": {64 "systemMessage": "Eres un experto en marketing de contenidos tecnológicos. Selecciona las noticias más relevantes e interesantes para una audiencia tech hispanohablante. Siempre responde en JSON válido."65 }66 },67 "name": "🤖 AI Agent",68 "type": "@n8n/n8n-nodes-langchain.agent",69 "position": [1000, 300]70 },71 {72 "parameters": {73 "model": "gpt-4-turbo-preview",74 "options": {75 "temperature": 0.776 }77 },78 "name": "OpenAI GPT-4",79 "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",80 "position": [1000, 500]81 },82 {83 "parameters": {84 "jsCode": "const response = items[0].json.output;\ntry {\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]);\n return parsed.selected_news.map(news => ({ json: news }));\n }\n} catch (e) {\n console.error('Error:', e);\n}\nreturn [];"85 },86 "name": "📤 Extraer Contenido",87 "type": "n8n-nodes-base.code",88 "position": [1200, 300]89 },90 {91 "parameters": {92 "text": "={{ $json.tweet }}"93 },94 "name": "🐦 Post Twitter",95 "type": "n8n-nodes-base.twitter",96 "position": [1400, 200]97 },98 {99 "parameters": {100 "text": "={{ $json.linkedin }}\\n\\n🔗 {{ $json.source_url }}"101 },102 "name": "💼 Post LinkedIn",103 "type": "n8n-nodes-base.linkedIn",104 "position": [1400, 300]105 },106 {107 "parameters": {108 "sheetId": "TU_SHEET_ID",109 "range": "Publicaciones!A:F",110 "options": {},111 "dataMode": "autoMapInputData"112 },113 "name": "📊 Log a Sheets",114 "type": "n8n-nodes-base.googleSheets",115 "position": [1600, 300]116 }117 ],118 "connections": {119 "⏰ Cada 6 horas": {120 "main": [121 [122 { "node": "📰 TechCrunch", "type": "main", "index": 0 },123 { "node": "📰 Xataka", "type": "main", "index": 0 }124 ]125 ]126 },127 "📰 TechCrunch": {128 "main": [[{ "node": "🔗 Merge Feeds", "type": "main", "index": 0 }]]129 },130 "📰 Xataka": {131 "main": [[{ "node": "🔗 Merge Feeds", "type": "main", "index": 1 }]]132 },133 "🔗 Merge Feeds": {134 "main": [[{ "node": "🔍 Filtrar Recientes", "type": "main", "index": 0 }]]135 },136 "🔍 Filtrar Recientes": {137 "main": [[{ "node": "📝 Preparar Prompt", "type": "main", "index": 0 }]]138 },139 "📝 Preparar Prompt": {140 "main": [[{ "node": "🤖 AI Agent", "type": "main", "index": 0 }]]141 },142 "OpenAI GPT-4": {143 "ai_languageModel": [[{ "node": "🤖 AI Agent", "type": "ai_languageModel", "index": 0 }]]144 },145 "🤖 AI Agent": {146 "main": [[{ "node": "📤 Extraer Contenido", "type": "main", "index": 0 }]]147 },148 "📤 Extraer Contenido": {149 "main": [150 [151 { "node": "🐦 Post Twitter", "type": "main", "index": 0 },152 { "node": "💼 Post LinkedIn", "type": "main", "index": 0 }153 ]154 ]155 },156 "🐦 Post Twitter": {157 "main": [[{ "node": "📊 Log a Sheets", "type": "main", "index": 0 }]]158 },159 "💼 Post LinkedIn": {160 "main": [[{ "node": "📊 Log a Sheets", "type": "main", "index": 0 }]]161 }162 }163}
Paso 5: Optimizaciones avanzadas
5.1 Añadir memoria al agente
Para que el agente recuerde publicaciones anteriores y evite repetir:
1{2 "name": "Memory Buffer",3 "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",4 "parameters": {5 "sessionKey": "news_agent_memory",6 "windowSize": 107 }8}
5.2 Usar herramientas personalizadas
El agente puede usar "tools" para buscar información adicional:
1// Tool: Buscar en Google Trends2{3 "name": "Check Google Trends",4 "type": "@n8n/n8n-nodes-langchain.toolHttpRequest",5 "parameters": {6 "url": "https://trends.google.com/trends/api/dailytrends",7 "options": {8 "description": "Verifica si un tema es tendencia en Google. Usa esta herramienta para validar la relevancia de una noticia."9 }10 }11}
5.3 Rate limiting para evitar spam
1// Nodo Code: Rate limiting2const lastRun = $getWorkflowStaticData('global');3const now = Date.now();4 5// Mínimo 1 hora entre ejecuciones exitosas6if (lastRun.lastSuccess && (now - lastRun.lastSuccess) < 3600000) {7 console.log('Rate limit: esperando más tiempo entre publicaciones');8 return [];9}10 11// Guardar timestamp12lastRun.lastSuccess = now;13 14return items;
5.4 Detección de duplicados
1// Verificar si ya publicamos esta noticia2const db = $getWorkflowStaticData('global');3db.publishedUrls = db.publishedUrls || [];4 5const newItems = items.filter(item => {6 const url = item.json.source_url;7 if (db.publishedUrls.includes(url)) {8 return false; // Ya publicada9 }10 db.publishedUrls.push(url);11 return true;12});13 14// Mantener solo últimas 100 URLs15if (db.publishedUrls.length > 100) {16 db.publishedUrls = db.publishedUrls.slice(-100);17}18 19return newItems;
Paso 6: Métricas y monitorización
Google Sheets para tracking
Crea una hoja con estas columnas:
| Fecha | Plataforma | Título | URL | Tweet | Likes | Shares |
Actualiza métricas con otro workflow programado:
1// Obtener métricas de Twitter2// (Requiere API v2 con analytics)3const tweetId = $json.tweet_id;4const metrics = await $http.get(5 `https://api.twitter.com/2/tweets/${tweetId}?tweet.fields=public_metrics`6);7 8return [{9 json: {10 likes: metrics.data.public_metrics.like_count,11 retweets: metrics.data.public_metrics.retweet_count,12 replies: metrics.data.public_metrics.reply_count13 }14}];
Alertas de error
1{2 "name": "Error Handler",3 "type": "n8n-nodes-base.telegram",4 "parameters": {5 "chatId": "tu-chat-id",6 "text": "⚠️ Error en agente de noticias:\n\n{{ $json.error.message }}"7 }8}
Resultados esperados y ROI
Tiempo ahorrado
| Tarea manual | Tiempo/semana | Con agente |
|---|---|---|
| Buscar noticias | 3h | 0h |
| Escribir posts | 2h | 0h |
| Publicar en 3 redes | 1h | 0h |
| Total | 6h/semana | 0h |
Costes
| Concepto | Coste mensual |
|---|---|
| OpenAI API (GPT-4) | €10-30 |
| n8n self-hosted | €3 (electricidad) |
| APIs redes sociales | €0 (planes gratuitos) |
| Total | €13-33/mes |
Engagement típico
Con contenido consistente y bien curado:
- Twitter: 50-200 impresiones/tweet
- LinkedIn: 100-500 visualizaciones/post
- Crecimiento seguidores: 5-15%/mes
Errores comunes y cómo evitarlos
El agente genera contenido genérico
Solución: Mejora el system prompt con ejemplos específicos:
1EJEMPLO de buen tweet:2"🚀 OpenAI acaba de lanzar GPT-5 y supera a humanos en el 95% de tareas cognitivas.3 4El benchmark muestra:5- Coding: 99.2% precisión6- Razonamiento: 98.7%7- Creatividad: 94.1%8 9¿El fin del trabajo intelectual? 🧵 #AI #GPT5"
Rate limits de APIs
Solución: Añade delays entre publicaciones:
1{2 "name": "Wait",3 "type": "n8n-nodes-base.wait",4 "parameters": {5 "unit": "seconds",6 "amount": 307 }8}
Contenido duplicado en redes
Solución: Personaliza cada plataforma más:
1// Twitter: directo y con gancho2// LinkedIn: contexto profesional3// Facebook: más casual y pregunta
Conclusión: Tu primer trabajador digital
Has creado un agente autónomo que:
- Busca noticias de múltiples fuentes cada 6 horas
- Analiza y selecciona las más relevantes con GPT-4
- Genera contenido optimizado para cada red social
- Publica automáticamente (o pide aprobación)
- Registra todo para análisis posterior
Este es solo el principio. Puedes expandir el agente para:
- Responder comentarios automáticamente
- Generar hilos de Twitter sobre temas trending
- Crear newsletters semanales
- Publicar en Threads, Mastodon, Bluesky...
¿Siguiente paso? En el próximo artículo exploramos el hardware open source para control por voz: M5Stack Atom Echo y por qué es el futuro de los asistentes privados en español.
¿Ya tienes tu agente funcionando? Comparte tu workflow en los comentarios. Y si este tutorial te ha sido útil, suscríbete a la newsletter para más automatizaciones con n8n.