Respuesta automática a comentarios de Instagram a través de mensajes privados
Este es unSocial Mediaflujo de automatización del dominio deautomatización que contiene 12 nodos.Utiliza principalmente nodos como If, Set, Code, HttpRequest, GoogleSheets. Respuestas automáticas a comentarios de Instagram por mensaje directo y seguimiento mediante Google Sheets
- •Pueden requerirse credenciales de autenticación para la API de destino
- •Credenciales de API de Google Sheets
Nodos utilizados (12)
Categoría
{
"id": "igcrMcr9XPqqxnqk",
"meta": {
"instanceId": "3378b0d68c3b7ebfc71b79896d94e1a044dec38e99a1160aed4e9c323910fbe2",
"templateCredsSetupCompleted": true
},
"name": "Auto-Reply to Instagram Comments with DMs",
"tags": [],
"nodes": [
{
"id": "82aaa8f5-c2fc-49b4-9d69-2b439001c7dd",
"name": "Iniciar Monitoreo",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-1520,
80
],
"parameters": {},
"typeVersion": 1
},
{
"id": "c191f69e-4483-409a-b313-2e11e0250e47",
"name": "Configurar Publicación y Mensaje",
"type": "n8n-nodes-base.set",
"position": [
-1300,
220
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "postUrl",
"name": "postUrl",
"type": "string",
"value": "Instagram url post/reel"
},
{
"id": "replyMessage",
"name": "replyMessage",
"type": "string",
"value": "Thanks so much! This is the template: xxxxx"
},
{
"id": "profileUsername",
"name": "profileUsername",
"type": "string",
"value": "add_upload_post_username"
}
]
}
},
"typeVersion": 3.3
},
{
"id": "66a72bd2-4f15-4c01-bbad-27d0ec3ce775",
"name": "Leer Usuarios Contactados",
"type": "n8n-nodes-base.googleSheets",
"position": [
-1100,
220
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1SNZYngGfvIxZJ6VAiwD9Keuj6DugbijLH59vyK4L298/edit#gid=0",
"cachedResultName": "Hoja 1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1SNZYngGfvIxZJ6VAiwD9Keuj6DugbijLH59vyK4L298",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1SNZYngGfvIxZJ6VAiwD9Keuj6DugbijLH59vyK4L298/edit?usp=drivesdk",
"cachedResultName": "respuestas a post de instagram"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "3IOU2VjBnR4hGohx",
"name": "Google Sheets account"
}
},
"typeVersion": 4,
"alwaysOutputData": true
},
{
"id": "78881d28-aa34-408d-a6ed-d3578f92c394",
"name": "Filtrar Comentarios Nuevos",
"type": "n8n-nodes-base.code",
"position": [
-700,
220
],
"parameters": {
"jsCode": "const comments = $input.first().json.comments || [];\n// CRÍTICO: Usar .all() para obtener TODAS las filas, no solo la primera\nconst allContactedUsersData = $('Read Contacted Users').all();\nconsole.log('🔍 DEBUG - Raw all contacted users:', JSON.stringify(allContactedUsersData, null, 2));\nconsole.log('🔍 DEBUG - Number of items from Read Contacted Users:', allContactedUsersData.length);\n\n// Extraer todos los objetos JSON de todas las ejecuciones y aplanar en un solo array\nlet contactedUsersData = [];\nallContactedUsersData.forEach((item, index) => {\n console.log(`🔍 DEBUG - Processing item ${index}:`, JSON.stringify(item.json, null, 2));\n if (item.json) {\n if (Array.isArray(item.json)) {\n // Si es un array, agregar todos los elementos\n contactedUsersData.push(...item.json);\n console.log(`🔍 DEBUG - Added ${item.json.length} items from array`);\n } else {\n // Si es un solo objeto, agregarlo\n contactedUsersData.push(item.json);\n console.log(`🔍 DEBUG - Added 1 object`);\n }\n }\n});\n\nconsole.log('🔍 DEBUG - Total extracted contacted users:', contactedUsersData.length);\n\n// DEBUGGING DETALLADO\nconsole.log('🔍 DEBUG - Input comments found:', comments.length);\nconsole.log('🔍 DEBUG - Raw contacted users data:', JSON.stringify(contactedUsersData, null, 2));\nconsole.log('🔍 DEBUG - Contacted users data type:', typeof contactedUsersData);\nconsole.log('🔍 DEBUG - Contacted users data keys:', Object.keys(contactedUsersData));\n\n// Handle different Google Sheets response formats\nlet contactedUsers = [];\n\n// IMPORTANTE: Primero verificar si es un array directo (múltiples filas)\nif (Array.isArray(contactedUsersData)) {\n contactedUsers = contactedUsersData;\n console.log('🔍 DEBUG - Using direct array format (multiple rows)');\n} \n// Método 2: Respuesta con .values (formato común)\nelse if (contactedUsersData.values && Array.isArray(contactedUsersData.values)) {\n contactedUsers = contactedUsersData.values;\n console.log('🔍 DEBUG - Using .values format');\n} \n// Método 3: Respuesta con .data\nelse if (contactedUsersData.data && Array.isArray(contactedUsersData.data)) {\n contactedUsers = contactedUsersData.data;\n console.log('🔍 DEBUG - Using .data format');\n}\n// MÉTODO 4 CORREGIDO: Manejar objetos únicos vs múltiples\nelse if (typeof contactedUsersData === 'object' && contactedUsersData !== null) {\n // CRÍTICO: Verificar si es UN SOLO objeto con comment_id (1 fila)\n if (contactedUsersData.comment_id || contactedUsersData.username) {\n contactedUsers = [contactedUsersData];\n console.log('🔍 DEBUG - Converting single object to array (1 row)');\n } \n // Si es un objeto pero SIN comment_id directo, puede ser múltiples objetos\n else {\n // Convertir a array pero también verificar si los valores son objetos\n const values = Object.values(contactedUsersData);\n \n // Si los valores son objetos con comment_id, son múltiples filas\n if (values.length > 0 && typeof values[0] === 'object' && values[0]?.comment_id) {\n contactedUsers = values;\n console.log('🔍 DEBUG - Converting object values to array (multiple rows from object)');\n } else {\n contactedUsers = values;\n console.log('🔍 DEBUG - Converting object values to array (unknown format)');\n }\n }\n}\n\n// DEBUGGING EXTRA: Mostrar qué tipo de datos recibimos\nconsole.log('🔍 DEBUG - Raw data analysis:');\nconsole.log(' - Is Array:', Array.isArray(contactedUsersData));\nconsole.log(' - Type:', typeof contactedUsersData);\nconsole.log(' - Has comment_id:', !!contactedUsersData?.comment_id);\nconsole.log(' - Object keys:', contactedUsersData ? Object.keys(contactedUsersData) : 'null');\n\nconsole.log('🔍 DEBUG - Final contacted users array length:', contactedUsers.length);\nconsole.log('🔍 DEBUG - Final contacted users array:', JSON.stringify(contactedUsers, null, 2));\n\n// Print first few rows to see the structure\nif (contactedUsers.length > 0) {\n console.log('🔍 DEBUG - First 5 rows structure:');\n contactedUsers.slice(0, 5).forEach((row, index) => {\n console.log(` Row ${index}:`, JSON.stringify(row, null, 2));\n console.log(` Row ${index} type:`, typeof row);\n console.log(` Row ${index} keys:`, Object.keys(row || {}));\n });\n}\n\n// FUNCIÓN PARA NORMALIZAR COMMENT IDs (crítico para números largos)\nfunction normalizeCommentId(id) {\n if (!id || id === null || id === undefined) return null;\n \n // Convertir a string y limpiar espacios\n let cleanId = String(id).trim();\n \n // Si es vacío o es un header, retornar null\n if (cleanId === '' || cleanId === 'comment_id') return null;\n \n // IMPORTANTE: Manejar números largos como strings para evitar problemas de precisión\n // Los comment IDs de Instagram son números muy largos que pueden perder precisión\n return cleanId;\n}\n\n// Create a set of already contacted comment IDs\nconst contactedCommentIds = new Set();\n\ncontactedUsers.forEach((row, index) => {\n let commentId = null;\n \n console.log(`🔍 DEBUG - Processing row ${index}:`, JSON.stringify(row, null, 2));\n \n // Skip header row if it exists\n if (typeof row === 'object' && row !== null && !Array.isArray(row)) {\n // Skip if this looks like a header row\n if (row.comment_id === 'comment_id' || row.username === 'username') {\n console.log(`⚠️ Skipping header row ${index}`);\n return;\n }\n \n // Handle object format (when Google Sheets returns objects)\n commentId = row.comment_id || row.commentId || row['comment_id'] || row['commentId'];\n console.log(`🔍 DEBUG - Object format, raw comment_id: '${commentId}' (type: ${typeof commentId})`);\n } \n // Handle array format (when Google Sheets returns arrays)\n else if (Array.isArray(row)) {\n // Skip if this looks like a header row\n if (row[0] === 'comment_id' || row[1] === 'username') {\n console.log(`⚠️ Skipping header array row ${index}`);\n return;\n }\n \n // comment_id is in Column A (index 0)\n commentId = row[0];\n console.log(`🔍 DEBUG - Array format, raw comment_id: '${commentId}' (type: ${typeof commentId})`);\n }\n \n // Normalize and validate comment ID\n const normalizedId = normalizeCommentId(commentId);\n if (normalizedId) {\n contactedCommentIds.add(normalizedId);\n console.log(`✅ Added contacted comment ID: '${normalizedId}' (length: ${normalizedId.length})`);\n } else {\n console.log(`⚠️ Row ${index} has no valid comment_id:`, commentId);\n }\n});\n\nconsole.log('🔍 DEBUG - Total contacted comment IDs found:', contactedCommentIds.size);\nconsole.log('🔍 DEBUG - Contacted comment IDs list:', Array.from(contactedCommentIds));\n\n// Filter new comments - exclude already contacted ones\nconst newComments = comments.filter(comment => {\n const rawCommentId = comment.id;\n const normalizedCommentId = normalizeCommentId(rawCommentId);\n \n if (!normalizedCommentId) {\n console.log(`⚠️ Invalid comment ID found: ${rawCommentId}`);\n return false;\n }\n \n const isAlreadyContacted = contactedCommentIds.has(normalizedCommentId);\n \n console.log(`🔍 DEBUG - Checking comment ID: '${normalizedCommentId}' (raw: ${rawCommentId}, type: ${typeof rawCommentId}), Already contacted: ${isAlreadyContacted}`);\n \n // Debug: Show all contacted IDs for comparison\n if (isAlreadyContacted) {\n console.log(`🔍 DEBUG - Comment ID '${normalizedCommentId}' found in contacted list`);\n } else {\n console.log(`🔍 DEBUG - Comment ID '${normalizedCommentId}' NOT found in contacted list`);\n console.log(`🔍 DEBUG - All contacted IDs: [${Array.from(contactedCommentIds).join(', ')}]`);\n }\n \n return !isAlreadyContacted;\n});\n\nconsole.log('🔍 DEBUG - New comments after filter:', newComments.length);\n\n// Log the filtering results with emojis\nconsole.log(`📊 Total comments retrieved: ${comments.length}`);\nconsole.log(`✅ Already contacted comments: ${contactedCommentIds.size}`);\nconsole.log(`🆕 New comments to process: ${newComments.length}`);\n\n// Log details of new comments\nnewComments.forEach((comment, index) => {\n console.log(`🆕 New comment ${index + 1}: ID='${comment.id}', User='${comment.user?.username || 'unknown'}', Text='${comment.text?.substring(0, 50) || 'no text'}...'`);\n});\n\nif (newComments.length === 0) {\n console.log('😴 No new comments found. Waiting for next check...');\n console.log('🔄 Workflow will continue monitoring in 15 minutes...');\n \n // Return a special object to indicate no processing needed\n return [{\n json: {\n noNewComments: true,\n summary: `📊 Monitoring complete - Found ${comments.length} total comments, ${contactedCommentIds.size} already contacted, 0 new comments to process`,\n timestamp: new Date().toISOString(),\n status: 'no_new_comments'\n }\n }];\n}\n\n// Transform each new comment into a separate item for processing\nreturn newComments.map(comment => ({\n json: {\n commentId: normalizeCommentId(comment.id),\n commentText: comment.text,\n userId: comment.user?.id || 'unknown',\n username: comment.user?.username || 'unknown',\n timestamp: comment.timestamp || new Date().toISOString(),\n replyMessage: $('Configure Post & Message').first().json.replyMessage,\n postUrl: $('Configure Post & Message').first().json.postUrl,\n profileUsername: $('Configure Post & Message').first().json.profileUsername\n }\n}));"
},
"typeVersion": 2,
"alwaysOutputData": true
},
{
"id": "13ad0cdd-7da6-4e57-98e8-28dae0916ed4",
"name": "Verificar Si Hay Comentarios Nuevos",
"type": "n8n-nodes-base.if",
"position": [
-540,
220
],
"parameters": {
"options": {
"ignoreCase": true,
"looseTypeValidation": true
},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": false,
"typeValidation": "loose"
},
"combinator": "or",
"conditions": [
{
"id": "has_new_comments",
"operator": {
"type": "boolean",
"operation": "notEqual"
},
"leftValue": "={{ $json.noNewComments }}",
"rightValue": true
},
{
"id": "f38ffd12-c4b2-4971-944c-b983ff3541fa",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ !$json.noNewComments }}",
"rightValue": "true"
}
]
}
},
"typeVersion": 2
},
{
"id": "f20e9a90-f8db-4f42-acdb-1e99295a0a0c",
"name": "Enviar Respuesta al Comentario",
"type": "n8n-nodes-base.httpRequest",
"position": [
-340,
120
],
"parameters": {
"url": "https://api.upload-post.com/api/uploadposts/comments/reply",
"method": "POST",
"options": {},
"jsonBody": "={\n \"platform\": \"instagram\",\n \"user\": \"{{ $json.profileUsername }}\",\n \"comment_id\": \"{{ $json.commentId }}\",\n \"message\": \"{{ $json.replyMessage }}\"\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"id": "peX0mDODPePtl6Vb",
"name": "upload-post vitor "
}
},
"typeVersion": 4.1
},
{
"id": "7e4c9bd5-973f-4a15-941d-239ae9581bd8",
"name": "Verificar Éxito de Respuesta",
"type": "n8n-nodes-base.if",
"position": [
-180,
20
],
"parameters": {
"options": {
"ignoreCase": true,
"looseTypeValidation": true
},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": false,
"typeValidation": "loose"
},
"combinator": "or",
"conditions": [
{
"id": "success_check",
"operator": {
"type": "boolean",
"operation": "equal"
},
"leftValue": "={{ $json.success }}",
"rightValue": true
},
{
"id": "15c2064a-8fbd-446e-8d36-29852df64def",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.success }}",
"rightValue": "=true"
}
]
}
},
"typeVersion": 2
},
{
"id": "40146447-62b1-4c97-87f6-44db758b4c8d",
"name": "Registrar Usuario Contactado",
"type": "n8n-nodes-base.googleSheets",
"position": [
40,
-60
],
"parameters": {
"columns": {
"value": {
"post_url": "={{ $('Filter New Comments').item.json.postUrl }}",
"username": "={{ $('Filter New Comments').item.json.username }}",
"timestamp": "={{ $('Filter New Comments').item.json.timestamp }}",
"comment_id": "={{ $('Filter New Comments').item.json.commentId }}",
"message_sent": "={{ $('Filter New Comments').item.json.replyMessage }}"
},
"schema": [
{
"id": "comment_id",
"type": "string",
"display": true,
"required": false,
"displayName": "comment_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "username",
"type": "string",
"display": true,
"required": false,
"displayName": "username",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "message_sent",
"type": "string",
"display": true,
"required": false,
"displayName": "message_sent",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "post_url",
"type": "string",
"display": true,
"required": false,
"displayName": "post_url",
"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/1SNZYngGfvIxZJ6VAiwD9Keuj6DugbijLH59vyK4L298/edit#gid=0",
"cachedResultName": "Hoja 1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1SNZYngGfvIxZJ6VAiwD9Keuj6DugbijLH59vyK4L298",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1SNZYngGfvIxZJ6VAiwD9Keuj6DugbijLH59vyK4L298/edit?usp=drivesdk",
"cachedResultName": "respuestas a post de instagram"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "3IOU2VjBnR4hGohx",
"name": "Google Sheets account"
}
},
"typeVersion": 4
},
{
"id": "730bb698-62e4-4944-83c3-982864140daf",
"name": "Registrar Respuesta Fallida",
"type": "n8n-nodes-base.code",
"position": [
40,
100
],
"parameters": {
"jsCode": "// Log failed replies for debugging\nconst failedReply = {\n userId: $('Filter New Comments').item.json.userId,\n username: $('Filter New Comments').item.json.username,\n commentId: $('Filter New Comments').item.json.commentId,\n error: $json.error || 'Unknown error',\n timestamp: new Date().toISOString()\n};\n\nconsole.log('❌ Failed to send reply:', failedReply);\n\nreturn [{ json: failedReply }];"
},
"typeVersion": 2
},
{
"id": "c87fe62f-9024-4827-8c56-65075e00fb23",
"name": "Generar Resumen",
"type": "n8n-nodes-base.code",
"position": [
260,
240
],
"parameters": {
"jsCode": "// Summary of the monitoring session with proper error handling\nlet totalComments = 0;\nlet newComments = 0;\nlet successfulReplies = 0;\nlet failedReplies = 0;\nlet monitoredPostUrl = '';\n\ntry {\n // Get total comments (handle if node wasn't executed)\n const getPostCommentsData = $('Get Post Comments').first();\n totalComments = getPostCommentsData?.json?.comments?.length || 0;\n} catch (error) {\n console.log('⚠️ Could not get total comments data:', error.message);\n totalComments = 0;\n}\n\ntry {\n // Get new comments (handle if node wasn't executed)\n const filterNewCommentsData = $('Filter New Comments').all();\n newComments = filterNewCommentsData?.length || 0;\n} catch (error) {\n console.log('⚠️ Could not get new comments data:', error.message);\n newComments = 0;\n}\n\ntry {\n // Get successful replies (handle if node wasn't executed)\n const recordContactedData = $('Record Contacted User').all();\n successfulReplies = recordContactedData?.length || 0;\n} catch (error) {\n console.log('⚠️ Could not get successful replies data:', error.message);\n successfulReplies = 0;\n}\n\ntry {\n // Get failed replies (handle if node wasn't executed)\n const logFailedData = $('Log Failed Reply').all();\n failedReplies = logFailedData?.length || 0;\n} catch (error) {\n console.log('⚠️ Could not get failed replies data:', error.message);\n failedReplies = 0;\n}\n\ntry {\n // Get monitored post URL\n const configData = $('Configure Post & Message').first();\n monitoredPostUrl = configData?.json?.postUrl || 'Unknown URL';\n} catch (error) {\n console.log('⚠️ Could not get post URL:', error.message);\n monitoredPostUrl = 'Unknown URL';\n}\n\nconst summary = {\n totalComments,\n newComments,\n successfulReplies,\n failedReplies,\n monitoredPostUrl,\n timestamp: new Date().toISOString(),\n status: 'completed'\n};\n\nconsole.log('📈 Monitoring Summary:', JSON.stringify(summary, null, 2));\n\n// Generate appropriate emoji and message\nconst emoji = successfulReplies > 0 ? '🎉' : failedReplies > 0 ? '⚠️' : totalComments > 0 ? '👀' : '😴';\nlet message = `${emoji} Monitoring cycle complete!`;\n\nif (totalComments > 0) {\n message += ` Found ${totalComments} total comments`;\n \n if (newComments > 0) {\n message += `, ${newComments} new comments`;\n \n if (successfulReplies > 0) {\n message += `, sent ${successfulReplies} replies successfully`;\n }\n \n if (failedReplies > 0) {\n message += `, ${failedReplies} failed`;\n }\n } else {\n message += ', no new comments to process';\n }\n} else {\n message += ' No comments found or error retrieving comments';\n}\n\nconsole.log(message);\nconsole.log('⏰ Next check in 15 minutes...');\nconsole.log('🔄 Workflow will continue monitoring...');\n\nreturn [{\n json: {\n summary,\n message,\n continueMonitoring: true\n }\n}];"
},
"typeVersion": 2
},
{
"id": "1ae9c8df-41b4-42e5-9df9-691fb9b6f2ad",
"name": "Obtener Comentarios de la Publicación",
"type": "n8n-nodes-base.httpRequest",
"position": [
-920,
220
],
"parameters": {
"url": "=https://api.upload-post.com/api/uploadposts/comments",
"options": {
"response": {
"response": {
"responseFormat": "json"
}
}
},
"sendQuery": true,
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"queryParameters": {
"parameters": [
{
"name": "platform",
"value": "instagram"
},
{
"name": "user",
"value": "={{ $('Configure Post & Message').item.json.profileUsername }}"
},
{
"name": "post_url",
"value": "={{ $('Configure Post & Message').item.json.postUrl }}"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"id": "peX0mDODPePtl6Vb",
"name": "upload-post vitor "
}
},
"typeVersion": 4.1
},
{
"id": "08822705-3afd-4ea4-8d9e-8874d989507c",
"name": "Activador Programado",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1520,
340
],
"parameters": {
"rule": {
"interval": [
{
"field": "minutes",
"minutesInterval": 15
}
]
}
},
"typeVersion": 1.2
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "d68f95d6-0596-4d0e-8aa7-498bab2097bc",
"connections": {
"730bb698-62e4-4944-83c3-982864140daf": {
"main": [
[
{
"node": "c87fe62f-9024-4827-8c56-65075e00fb23",
"type": "main",
"index": 0
}
]
]
},
"08822705-3afd-4ea4-8d9e-8874d989507c": {
"main": [
[
{
"node": "c191f69e-4483-409a-b313-2e11e0250e47",
"type": "main",
"index": 0
}
]
]
},
"82aaa8f5-c2fc-49b4-9d69-2b439001c7dd": {
"main": [
[
{
"node": "c191f69e-4483-409a-b313-2e11e0250e47",
"type": "main",
"index": 0
}
]
]
},
"1ae9c8df-41b4-42e5-9df9-691fb9b6f2ad": {
"main": [
[
{
"node": "78881d28-aa34-408d-a6ed-d3578f92c394",
"type": "main",
"index": 0
}
]
]
},
"7e4c9bd5-973f-4a15-941d-239ae9581bd8": {
"main": [
[
{
"node": "40146447-62b1-4c97-87f6-44db758b4c8d",
"type": "main",
"index": 0
}
],
[
{
"node": "730bb698-62e4-4944-83c3-982864140daf",
"type": "main",
"index": 0
}
]
]
},
"78881d28-aa34-408d-a6ed-d3578f92c394": {
"main": [
[
{
"node": "13ad0cdd-7da6-4e57-98e8-28dae0916ed4",
"type": "main",
"index": 0
}
]
]
},
"66a72bd2-4f15-4c01-bbad-27d0ec3ce775": {
"main": [
[
{
"node": "1ae9c8df-41b4-42e5-9df9-691fb9b6f2ad",
"type": "main",
"index": 0
}
]
]
},
"40146447-62b1-4c97-87f6-44db758b4c8d": {
"main": [
[
{
"node": "c87fe62f-9024-4827-8c56-65075e00fb23",
"type": "main",
"index": 0
}
]
]
},
"f20e9a90-f8db-4f42-acdb-1e99295a0a0c": {
"main": [
[
{
"node": "7e4c9bd5-973f-4a15-941d-239ae9581bd8",
"type": "main",
"index": 0
}
]
]
},
"c191f69e-4483-409a-b313-2e11e0250e47": {
"main": [
[
{
"node": "66a72bd2-4f15-4c01-bbad-27d0ec3ce775",
"type": "main",
"index": 0
}
]
]
},
"13ad0cdd-7da6-4e57-98e8-28dae0916ed4": {
"main": [
[
{
"node": "f20e9a90-f8db-4f42-acdb-1e99295a0a0c",
"type": "main",
"index": 0
}
],
[
{
"node": "c87fe62f-9024-4827-8c56-65075e00fb23",
"type": "main",
"index": 0
}
]
]
}
}
}¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Intermedio - Redes sociales
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
Juan Carlos Cavero Gracia
@carlosgraciaFollow me in linkedin: https://www.linkedin.com/in/juan-carlos-cavero-gracia/
Compartir este flujo de trabajo