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スプレッドシートへのログ記録",
"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
セキュリティ運用