AI 콘텐츠 생성기를 사용한 LinkedIn 채용 공고 게시 자동화
중급
이것은HR, Multimodal AI분야의자동화 워크플로우로, 10개의 노드를 포함합니다.주로 Code, Webhook, LinkedIn, GoogleSheets, OpenAi 등의 노드를 사용하며. Recrutei ATS에서 GPT-4o 콘텐츠 생성을 사용한 자동화된 LinkedIn 채용 공고 게시
사전 요구사항
- •HTTP Webhook 엔드포인트(n8n이 자동으로 생성)
- •LinkedIn API 인증 정보
- •Google Sheets API 인증 정보
- •OpenAI API Key
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"name": "Automated LinkedIn Job Posting with AI Content Generator",
"tags": [],
"nodes": [
{
"id": "ff66c07a-7c70-4b1f-9b08-439051889d16",
"name": "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": "채용 데이터 정리 및 표준화",
"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 게시물 게시",
"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 로깅",
"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": "AI 프롬프트로 데이터 변환",
"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": "스티커 노트 - 트리거",
"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": "스티커 노트 - 데이터 전처리",
"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": "스티커 노트 - AI 생성",
"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": "AI 콘텐츠 생성기",
"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": "스티커 노트 - 게시 및 로깅",
"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
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
중급 - 인사, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
스마트 콘텐츠 및 마케팅 허브 (GPT-4 포함)
GPT-4를 통한 콘텐츠 분석 및 다중 플랫폼 배포 자동화
Code
Merge
Twitter
+
Code
Merge
Twitter
15 노드Marth
소셜 미디어
BeyondPresence Agent 인적 자원 인터뷰 시스템
AI 기반 인적 자원 인터뷰 시스템, BeyondPresence 통합
If
Code
Webhook
+
If
Code
Webhook
22 노드M Shehroz Sajjad
인사
基于GPT-4의스마트招聘与候选人互动系统
基于GPT-4의AI招聘系统,用于简历筛选与자동外联
If
Code
Wait
+
If
Code
Wait
30 노드Marth
인사
AI 후보자 선별 및 면접 일정 시스템
AI 기반 후보자 선별 및 면접 일정 조정(OpenAI GPT 및 Google 제품군)
If
Code
Webhook
+
If
Code
Webhook
18 노드Oneclick AI Squad
인사
URL 기반 AI, Telegram 및 다중 플랫폼 게시를 사용한 소셜 미디어 게시물 자동 생성
URL 기반 AI, Telegram 및 다중 플랫폼 게시를 사용하여 소셜 미디어 게시물 자동 생성
If
Set
Code
+
If
Set
Code
42 노드Karol
콘텐츠 제작
GRC - 보안 설문지 자동 작성
보안 설문지 응답 자동화: GPT-4o 및 Google Sheets
If
Set
Code
+
If
Set
Code
11 노드Adnan Tariq
보안 운영