Publication automatisée d'offres d'emploi LinkedIn avec un générateur de contenu AI

Intermédiaire

Ceci est unHR, Multimodal AIworkflow d'automatisation du domainecontenant 10 nœuds.Utilise principalement des nœuds comme Code, Webhook, LinkedIn, GoogleSheets, OpenAi. Utiliser GPT-4o avec génération de contenu pour automatiser la publication d'offres d'emploi LinkedIn à partir de Recrutei ATS

Prérequis
  • Point de terminaison HTTP Webhook (généré automatiquement par n8n)
  • Informations d'identification LinkedIn API
  • Informations d'identification Google Sheets API
  • Clé API OpenAI
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
{
  "name": "Automated LinkedIn Job Posting with AI Content Generator",
  "tags": [],
  "nodes": [
    {
      "id": "ff66c07a-7c70-4b1f-9b08-439051889d16",
      "name": "Déclencheur 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": "Nettoyage et standardisation des données d'emploi",
      "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": "Publication d'annonce 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": "Journalisation 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": "Transformation des données en prompt 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": "Note - Déclencheur",
      "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": "Note - Prétraitement des données",
      "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": "Note - Génération 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": "Générateur de contenu 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": "Note - Publication & Journalisation",
      "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
          }
        ]
      ]
    }
  }
}
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 - Ressources Humaines, IA Multimodale

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œuds10
Catégorie2
Types de nœuds6
Description de la difficulté

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

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34