8
n8n 中文网amn8n.com

通过私信自动回复Instagram评论

中级

这是一个Social Media领域的自动化工作流,包含 12 个节点。主要使用 If, Set, Code, HttpRequest, GoogleSheets 等节点。 使用私信自动回复Instagram评论,并通过Google表格跟踪

前置要求
  • 可能需要目标 API 的认证凭证
  • Google Sheets API 凭证
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "igcrMcr9XPqqxnqk",
  "meta": {
    "instanceId": "3378b0d68c3b7ebfc71b79896d94e1a044dec38e99a1160aed4e9c323910fbe2",
    "templateCredsSetupCompleted": true
  },
  "name": "通过私信自动回复 Instagram 评论",
  "tags": [],
  "nodes": [
    {
      "id": "82aaa8f5-c2fc-49b4-9d69-2b439001c7dd",
      "name": "开始监控",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1520,
        80
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "c191f69e-4483-409a-b313-2e11e0250e47",
      "name": "配置帖子和消息",
      "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": "读取已联系用户",
      "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": "筛选新评论",
      "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": "检查是否有新评论",
      "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": "发送评论回复",
      "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": "检查回复是否成功",
      "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": "记录已联系用户",
      "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": "记录回复失败",
      "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": "生成摘要",
      "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": "获取帖子评论",
      "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": "计划触发器",
      "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": {
    "Log Failed Reply": {
      "main": [
        [
          {
            "node": "Generate Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Configure Post & Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start Monitoring": {
      "main": [
        [
          {
            "node": "Configure Post & Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Post Comments": {
      "main": [
        [
          {
            "node": "Filter New Comments",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Reply Success": {
      "main": [
        [
          {
            "node": "Record Contacted User",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log Failed Reply",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter New Comments": {
      "main": [
        [
          {
            "node": "Check If Has New Comments",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Contacted Users": {
      "main": [
        [
          {
            "node": "Get Post Comments",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Record Contacted User": {
      "main": [
        [
          {
            "node": "Generate Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Reply to Comment": {
      "main": [
        [
          {
            "node": "Check Reply Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Configure Post & Message": {
      "main": [
        [
          {
            "node": "Read Contacted Users",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check If Has New Comments": {
      "main": [
        [
          {
            "node": "Send Reply to Comment",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Generate Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

中级 - 社交媒体

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
中级
节点数量12
分类1
节点类型7
难度说明

适合有一定经验的用户,包含 6-15 个节点的中等复杂度工作流

作者
Juan Carlos Cavero Gracia

Juan Carlos Cavero Gracia

@carlosgracia

Follow me in linkedin: https://www.linkedin.com/in/juan-carlos-cavero-gracia/

外部链接
在 n8n.io 查看

分享此工作流