Réponses automatiques aux commentaires Instagram par message privé

Intermédiaire

Ceci est unSocial Mediaworkflow d'automatisation du domainecontenant 12 nœuds.Utilise principalement des nœuds comme If, Set, Code, HttpRequest, GoogleSheets. Réponses automatiques aux commentaires Instagram par message direct et suivi via Google Sheets

Prérequis
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Informations d'identification Google Sheets API
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
{
  "id": "igcrMcr9XPqqxnqk",
  "meta": {
    "instanceId": "3378b0d68c3b7ebfc71b79896d94e1a044dec38e99a1160aed4e9c323910fbe2",
    "templateCredsSetupCompleted": true
  },
  "name": "Auto-Reply to Instagram Comments with DMs",
  "tags": [],
  "nodes": [
    {
      "id": "82aaa8f5-c2fc-49b4-9d69-2b439001c7dd",
      "name": "Démarrer la surveillance",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1520,
        80
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "c191f69e-4483-409a-b313-2e11e0250e47",
      "name": "Configurer la publication et le message",
      "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": "Lire les utilisateurs contactés",
      "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": "Filtrer les nouveaux commentaires",
      "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": "Vérifier s'il y a de nouveaux commentaires",
      "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": "Envoyer une réponse au commentaire",
      "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": "Vérifier la réussite de la réponse",
      "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": "Enregistrer l'utilisateur contacté",
      "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": "Journaliser l'échec de la réponse",
      "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": "Générer un résumé",
      "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": "Obtenir les commentaires de la publication",
      "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": "Déclencheur planifié",
      "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
          }
        ]
      ]
    }
  }
}
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 - Réseaux sociaux

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œuds12
Catégorie1
Types de nœuds7
Description de la difficulté

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

Auteur
Juan Carlos Cavero Gracia

Juan Carlos Cavero Gracia

@carlosgracia

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

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34