Automatisiertes Veröffentlichen von LinkedIn-Stellenstellenanzeigen mit einem KI-Inhaltsgenerator

Fortgeschritten

Dies ist ein HR, Multimodal AI-Bereich Automatisierungsworkflow mit 10 Nodes. Hauptsächlich werden Code, Webhook, LinkedIn, GoogleSheets, OpenAi und andere Nodes verwendet. Automatisierte LinkedIn-Stellenveröffentlichung mit GPT-4o-Inhaltsgenerierung aus Recrutei ATS

Voraussetzungen
  • HTTP Webhook-Endpunkt (wird von n8n automatisch generiert)
  • LinkedIn API-Anmeldedaten
  • Google Sheets API-Anmeldedaten
  • OpenAI API Key
Workflow-Vorschau
Visualisierung der Node-Verbindungen, mit Zoom und Pan
Workflow exportieren
Kopieren Sie die folgende JSON-Konfiguration und importieren Sie sie in n8n
{
  "name": "Automated LinkedIn Job Posting with AI Content Generator",
  "tags": [],
  "nodes": [
    {
      "id": "ff66c07a-7c70-4b1f-9b08-439051889d16",
      "name": "Recrutei Webhook Trigger",
      "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": "Bereinigen und Standardisieren von Stellendaten",
      "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": "LinkedIn Anzeige veröffentlichen",
      "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": "Google Sheets Protokollierung",
      "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": "Daten in KI-Prompt transformieren",
      "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": "Notiz - Trigger",
      "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": "Notiz - Datenvorverarbeitung",
      "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": "Notiz - KI-Generierung",
      "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": "KI-Inhaltsgenerator",
      "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": "Notiz - Veröffentlichung & Protokoll",
      "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
          }
        ]
      ]
    }
  }
}
Häufig gestellte Fragen

Wie verwende ich diesen Workflow?

Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.

Für welche Szenarien ist dieser Workflow geeignet?

Fortgeschritten - Personalwesen, Multimodales KI

Ist es kostenpflichtig?

Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.

Workflow-Informationen
Schwierigkeitsgrad
Fortgeschritten
Anzahl der Nodes10
Kategorie2
Node-Typen6
Schwierigkeitsbeschreibung

Für erfahrene Benutzer, mittelkomplexe Workflows mit 6-15 Nodes

Externe Links
Auf n8n.io ansehen

Diesen Workflow teilen

Kategorien

Kategorien: 34