Publicación automática de ofertas de empleo en LinkedIn usando un generador de contenido con IA

Intermedio

Este es unHR, Multimodal AIflujo de automatización del dominio deautomatización que contiene 10 nodos.Utiliza principalmente nodos como Code, Webhook, LinkedIn, GoogleSheets, OpenAi. Automatización de publicaciones de empleos de LinkedIn con generación de contenido GPT-4o desde Recrutei ATS

Requisitos previos
  • Punto final de HTTP Webhook (n8n generará automáticamente)
  • Credenciales de API de LinkedIn
  • Credenciales de API de Google Sheets
  • Clave de API de OpenAI
Vista previa del flujo de trabajo
Visualización de las conexiones entre nodos, con soporte para zoom y panorámica
Exportar flujo de trabajo
Copie la siguiente configuración JSON en n8n para importar y usar este flujo de trabajo
{
  "name": "Automated LinkedIn Job Posting with AI Content Generator",
  "tags": [],
  "nodes": [
    {
      "id": "ff66c07a-7c70-4b1f-9b08-439051889d16",
      "name": "Disparador Recrutei Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -64,
        0
      ],
      "webhookId": "YOUR_WEBHOOK_ID_HERE",
      "parameters": {
        "path": "new-job-created",
        "options": {},
        "httpMethod": "POST"
      },
      "credentials": {},
      "typeVersion": 2.1
    },
    {
      "id": "70282417-5778-4e57-871d-5efef5bc21e0",
      "name": "Limpieza y Estandarización de Datos del Empleo",
      "type": "n8n-nodes-base.code",
      "position": [
        144,
        0
      ],
      "parameters": {
        "jsCode": "// Maps over each item in the input\nreturn items.map(item => {\n  // item.json is the main object of the item in n8n\n  const body = item.json.body;\n\n  // Helper function to convert 0/1 to \"no\"/\"yes\"\n  const convertBoolean = (value) => value === 1 ? 'yes' : 'no';\n\n  // Apply conversion to the desired fields\n  body.fixed_remuneration = convertBoolean(body.fixed_remuneration);\n  body.remote = convertBoolean(body.remote);\n  body.pcd = convertBoolean(body.pcd);\n  body.is_inclusive = convertBoolean(body.is_inclusive);\n\n  // Return the modified 'body' object\n  return body;\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "52cfd7ce-57f0-4e30-af4c-ab03c93ecc8f",
      "name": "Publicar Anuncio LinkedIn",
      "type": "n8n-nodes-base.linkedIn",
      "position": [
        1312,
        0
      ],
      "parameters": {
        "text": "={{ $json.message.content }}",
        "person": "YOUR_LINKEDIN_PROFILE_ID",
        "additionalFields": {}
      },
      "credentials": {},
      "typeVersion": 1
    },
    {
      "id": "db5dfcdf-471c-45e0-b13b-47046e5a57cf",
      "name": "Registro en Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1520,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "Job Title": "={{ $('Clean and Standardize Job Data').item.json.title }}",
            "Published": "Yes"
          },
          "schema": [
            {
              "id": "Job Title",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Job Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Published",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Published",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Job Title"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_SHEET_ID_HERE",
          "cachedResultName": "Job Posting Log"
        }
      },
      "credentials": {},
      "typeVersion": 4.7
    },
    {
      "id": "434cd22e-0acd-412e-bcd4-d99094f93022",
      "name": "Transformar Datos a Prompt de IA",
      "type": "n8n-nodes-base.code",
      "position": [
        464,
        0
      ],
      "parameters": {
        "jsCode": "// Gets the first item from the input array, which contains the job data.\nconst vagaData = $input.item.json;\n\n// Mapping of original field names to translation and output text.\n// 'skip': true for fields we don't want to include in the final text.\nconst fieldMap = {\n    \"title\": { \"label\": \"Job Title\" },\n    \"manager\": { \"label\": \"Hiring Manager\" },\n    \"quantity\": { \"label\": \"Vacancy Quantity\" },\n    \"client\": { \"label\": \"Client Name\" },\n    \"department\": { \"label\": \"Department\" },\n    \"pipe\": { \"label\": \"Pipeline/Stage\" },\n    \"internal_code\": { \"label\": \"Internal Code\" },\n    \"status\": { \"label\": \"Status\" },\n    \"type\": { \"label\": \"Job Type\" },\n    \"sla\": { \"label\": \"SLA (Max Deadline)\" },\n    \"expired\": { \"label\": \"Expiration Date\" },\n    \"regime\": { \"label\": \"Contract Regime\" },\n    \"public_link\": { \"label\": \"Public Link\" },\n    \"remuneration_type\": { \"label\": \"Remuneration Type\" },\n    \"remuneration\": { \"label\": \"Remuneration Value\" },\n    \"fixed_remuneration\": { \"label\": \"Fixed Remuneration\" },\n    \"description\": { \"label\": \"Detailed Description\", \"is_long_text\": true },\n    \"skills\": { \"label\": \"Key Skills\" },\n    \"benefits\": { \"label\": \"Benefits\" },\n    \"remote\": { \"label\": \"Remote Work\" },\n    \"location\": { \"label\": \"Location\" },\n    \"country\": { \"label\": \"Country\" },\n    \"state\": { \"label\": \"State\" },\n    \"city\": { \"label\": \"City\" },\n    \"pcd\": { \"label\": \"PWD Vacancy\" },\n    \"is_inclusive\": { \"label\": \"Inclusive Vacancy\" },\n    \n    // Fields to be ignored\n    \"id\": { \"skip\": true },\n    \"client_id\": { \"skip\": true },\n    \"company_department_id\": { \"skip\": true },\n    \"pipe_id\": { \"skip\": true },\n    \"remuneration_from\": { \"skip\": true },\n    \"remuneration_to\": { \"skip\": true }\n};\n\nlet outputText = \"\";\noutputText += `## Job Details: ${vagaData.title}\\n\\n`;\noutputText += `---\\n\\n`;\n\n// Iterate over the mapping to build the text\nfor (const key in fieldMap) {\n    if (fieldMap.hasOwnProperty(key) && !fieldMap[key].skip) {\n        const fieldInfo = fieldMap[key];\n        const label = fieldInfo.label;\n        let value = vagaData[key];\n\n        // Handle null or empty values\n        if (value === null || value === \"\" || value === undefined) {\n            value = \"Not Informed\";\n        }\n        \n        // Special formatting for description (long text, likely HTML)\n        if (fieldInfo.is_long_text) {\n             // Try to remove basic HTML tags to clean the description, but maintain list formatting\n            const cleanDescription = String(value)\n                .replace(/<p>|<\\/p>|<br\\s*\\/?>/gi, ' ') // Replaces paragraphs and breaks with space\n                .replace(/<h[1-6]>(.*?)<\\/h[1-6]>/gi, '\\n**$1**\\n') // Formats headers as bold\n                .replace(/<\\/?ul>|<\\/?ol>/gi, '') // Removes ul/ol tags\n                .replace(/<li>/gi, '  - ') // Formats list items\n                .replace(/<\\/?strong>|<\\/?b>/gi, '**') // Bold\n                .replace(/<\\/?em>|<\\/?i>/gi, '*') // Italic\n                .replace(/\\s\\s+/g, ' ') // Removes multiple spaces\n                .trim();\n                \n            outputText += `### ${label}:\\n`;\n            outputText += `${cleanDescription}\\n\\n`;\n        } \n        // Special formatting for remuneration (currency)\n        else if (key === \"remuneration\" && typeof value === 'number') {\n            const formattedValue = new Intl.NumberFormat('en-US', { // Changed to en-US for international template\n                style: 'currency',\n                currency: 'USD',\n                minimumFractionDigits: 2\n            }).format(value);\n            outputText += `**${label}:** ${formattedValue}\\n`;\n        } \n        // Normal formatting for other fields\n        else {\n            outputText += `**${label}:** ${value}\\n`;\n        }\n    }\n}\n\n// The n8n Code node expects an array of objects as output.\nreturn [{\n    json: {\n        detailedJobPrompt: outputText // Renamed key to be more descriptive\n    }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "9c8b68f8-1b0d-44ba-945a-35cc1e3c6798",
      "name": "Nota Adhesiva - Disparador",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        -96
      ],
      "parameters": {
        "width": 448,
        "height": 320,
        "content": "This is the **entry point** of the workflow. It listens for a POST request from the Recrutei ATS whenever a new job is created/published. You must copy the Webhook URL and configure it in Recrutei."
      },
      "typeVersion": 1
    },
    {
      "id": "574549fd-e687-4380-8be3-25d54999baf1",
      "name": "Nota Adhesiva - Preprocesamiento de Datos",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        336,
        -96
      ],
      "parameters": {
        "color": 4,
        "width": 400,
        "height": 320,
        "content": "Uses two Code nodes to clean the raw data (Code 1: Boolean conversion) and structure it (Code 2: Markdown prompt generation) for optimal AI interpretation."
      },
      "typeVersion": 1
    },
    {
      "id": "ee3012c2-007d-4a0f-a4de-7d2a34939838",
      "name": "Nota Adhesiva - Generación IA",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        752,
        -96
      ],
      "parameters": {
        "color": 5,
        "width": 448,
        "height": 320,
        "content": "The **OpenAI model** acts as a professional copywriter. It takes the structured prompt and generates an engaging, marketing-focused text ready for LinkedIn."
      },
      "typeVersion": 1
    },
    {
      "id": "2130e4ef-7f40-4906-b432-ef5867203a22",
      "name": "Generador de Contenido IA",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        864,
        0
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "={{ $json.detailedJobPrompt }}"
            },
            {
              "role": "system",
              "content": "You are a professional HR Marketing Copywriter. Your task is to receive detailed job information and transform it into an engaging, attractive LinkedIn post for candidate attraction. Focus on benefits, culture, and key responsibilities. Include relevant hashtags."
            }
          ]
        }
      },
      "credentials": {},
      "typeVersion": 1.8
    },
    {
      "id": "bb6ce9b4-e5c1-4de1-8b66-c76347a26dbf",
      "name": "Nota Adhesiva - Publicación y Registro",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1216,
        -96
      ],
      "parameters": {
        "color": 6,
        "width": 512,
        "height": 320,
        "content": "The final content is published on LinkedIn. Finally, the job title and publishing status are logged in the **Google Sheets Logging** node for internal audit."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "connections": {
    "2130e4ef-7f40-4906-b432-ef5867203a22": {
      "main": [
        [
          {
            "node": "52cfd7ce-57f0-4e30-af4c-ab03c93ecc8f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "52cfd7ce-57f0-4e30-af4c-ab03c93ecc8f": {
      "main": [
        [
          {
            "node": "db5dfcdf-471c-45e0-b13b-47046e5a57cf",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ff66c07a-7c70-4b1f-9b08-439051889d16": {
      "main": [
        [
          {
            "node": "70282417-5778-4e57-871d-5efef5bc21e0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "434cd22e-0acd-412e-bcd4-d99094f93022": {
      "main": [
        [
          {
            "node": "2130e4ef-7f40-4906-b432-ef5867203a22",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "70282417-5778-4e57-871d-5efef5bc21e0": {
      "main": [
        [
          {
            "node": "434cd22e-0acd-412e-bcd4-d99094f93022",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Preguntas frecuentes

¿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 - Recursos Humanos, IA Multimodal

¿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.

Información del flujo de trabajo
Nivel de dificultad
Intermedio
Número de nodos10
Categoría2
Tipos de nodos6
Descripción de la dificultad

Adecuado para usuarios con experiencia intermedia, flujos de trabajo de complejidad media con 6-15 nodos

Enlaces externos
Ver en n8n.io

Compartir este flujo de trabajo

Categorías

Categorías: 34