8
n8n 中文网amn8n.com

工作简历与求职信自动化(含简历 HTML 模板)

高级

这是一个Document Extraction, AI RAG领域的自动化工作流,包含 31 个节点。主要使用 Set, Code, Html, Github, Webhook 等节点。 使用 AI、GitHub Pages 和 Google Drive 个性化简历和求职信

前置要求
  • GitHub Personal Access Token
  • HTTP Webhook 端点(n8n 会自动生成)
  • Telegram Bot Token
  • Google Drive API 凭证
  • 可能需要目标 API 的认证凭证
  • Google Sheets API 凭证
  • OpenAI API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "Llj4X6Re9MaRJKtz",
  "meta": {
    "instanceId": "84f919bdf71e0a8207578f3b6d18e75ace42ed26bca5f98c23187d7c0785bb5b",
    "templateCredsSetupCompleted": true
  },
  "name": "工作简历与求职信自动化(含简历 HTML 模板)",
  "tags": [],
  "nodes": [
    {
      "id": "3ba543ec-62cb-4dd6-bd11-cd625dbfdbe3",
      "name": "HTTP 请求",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -320,
        208
      ],
      "parameters": {
        "url": "http://000.00.00:3000/forms/chromium/convert/url",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "name": "url",
              "value": "https://evenkik.github.io/Resume_url/"
            }
          ]
        }
      },
      "retryOnFail": false,
      "typeVersion": 4.2
    },
    {
      "id": "f96a1856-6ff4-4304-b6ae-ff497392eed2",
      "name": "AI 代理",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -272,
        1152
      ],
      "parameters": {
        "options": {
          "systemMessage": "You are an AI assistant that structures professional experience data for a resume-matching and vector-search system.\n\nYour task is to convert the given unstructured experience text into a clean, professional, and factual JSON object.\n\nGuidelines:\n- Use concise, resume-appropriate language.\n- Keep the tone factual and professional.\n- You may infer missing details in a general, realistic way — but never invent unrelated or false information.\n- If the input text does not contain enough valid or general professional information to create a meaningful entry, output an empty JSON object: {}\n- Each array (tasks, skills, tools) must include at least two relevant and specific items.\n- The summary should briefly describe the main purpose and impact of the experience.\n- Output only valid JSON — no comments, explanations, or extra text.\n\n---\n\nOutput format:\n{\n  \"role\": \"\",\n  \"summary\": \"\",\n  \"tasks\": \"\",\n  \"skills\": \"\",\n  \"tools\": \"\",\n  \"industry\": \"\"\n}\n\n"
        },
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "6c30b321-16ee-4540-8f69-b4b10dda1292",
      "name": "OpenAI 聊天模型",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -320,
        1376
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5",
          "cachedResultName": "gpt-5"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "8814JRU0x3fI9btT",
          "name": "evenkik4"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "1c6f3c2f-996a-436e-ad9c-adce7b64875a",
      "name": "简单记忆",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -192,
        1376
      ],
      "parameters": {
        "contextWindowLength": 10
      },
      "typeVersion": 1.3
    },
    {
      "id": "be71fb62-719d-4cbb-9c41-be6438f97e18",
      "name": "结构化输出解析器",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -64,
        1376
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"role\": \"\",\n  \"summary\": \"\",\n  \"tasks\": \"\",\n  \"skills\": \"\",\n  \"tools\": \"\",\n  \"industry\": \"\"\n}\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "b08a88e5-0ec8-407f-a230-08ab97c0c1ec",
      "name": "插入行",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        144,
        1152
      ],
      "parameters": {
        "columns": {
          "value": {
            "Role": "={{ $json.output.role }}",
            "Tasks": "={{ $json.output.tasks }}",
            "tools": "={{ $json.output.tools }}",
            "Skills": "={{ $json.output.skills }}",
            "Summary": "={{ $json.output.summary }}",
            "industry": "={{ $json.output.industry }}"
          },
          "schema": [
            {
              "id": "Role",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Role",
              "defaultMatch": false
            },
            {
              "id": "Summary",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Summary",
              "defaultMatch": false
            },
            {
              "id": "Tasks",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Tasks",
              "defaultMatch": false
            },
            {
              "id": "Skills",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Skills",
              "defaultMatch": false
            },
            {
              "id": "tools",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "tools",
              "defaultMatch": false
            },
            {
              "id": "industry",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "industry",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "uD4RCsZ5q6GncPRD",
          "cachedResultUrl": "/projects/ty2N3FKN04d75oM7/datatables/uD4RCsZ5q6GncPRD",
          "cachedResultName": "experience"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "66b3e574-4da5-4e4c-9012-d98bc15eba52",
      "name": "AI 代理1",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -208,
        544
      ],
      "parameters": {
        "text": "={{ $json.message.text }}",
        "options": {
          "systemMessage": "You are a smart resume personalization agent.\n\nYour task:\n1. Receive a **job description** (list of required skills, responsibilities, or qualifications).\n2. Access my **experience data** from a data table tool (includes my past roles, tasks, and known skills).\n3. Compare my experience to the job description to find **matching skills**.\n4. If some required skills are missing, **add them only if they are not advanced skills**.\n   - A skill is considered **advanced** if it typically takes more than 6 months to learn.\n   - I can learn new apps or workflow integrations for automation within 2 weeks — so these are **not advanced** and can be added.\n5. Generate a personalized application letter tailored to the job description, highlighting my relevant experience, skills, and accomplishments. The letter should be professional, concise, and persuasive, with a clear introduction, body, and closing paragraph. Avoid generic statements; tailor it specifically to the job description.\n\n### Output Format:\nReturn the result as valid JSON in the following structure:\n\n{\n  \"company\": \"company name\",\n  \"job_description\": \"short summary of the job description or title\",\n  \"skills\": [\n    \"skill1\",\n    \"skill2\",\n    \"skill3\"\n  ],\n  \"tools_expertise\": [\n    \"tool1\",\n    \"tool2\",\n    \"tool3\"\n  ],\n  \"application_letter\": \"Your generated application letter here.\"\n}\n\n\n### Example Output:\n{\n  \"company\": \"News Times\",\n  \"job_description\": \"Front-End Web Developer responsible for building responsive and user-friendly interfaces.\",\n  \"skills\": [\n    \"HTML\",\n    \"CSS\",\n    \"JavaScript\"\n  ],\n  \"tools_expertise\": [\n    \"make.com\",\n    \"React\",\n    \"Google Sheets\"\n  ],\n  \"cover_letter\": \"Dear Hiring Manager, I am excited to apply for the [Job Title] role... \n\nSincerely,    \n}\n\n### Rules:\n- Only include **skills relevant to the job**.  \n- Use **clear, human-readable** skill names (no duplicates).  \n- Keep the HTML indentation and `class` attributes exactly as shown.  \n- The JSON must be **valid and clean**.\n- **Do not add language skills** - it already add manually.\n- Maximum of 5 skills and 5 tools_expertise should be included in the output.\n- The application letter must be fully tailored to the job description and emphasize relevant experience\n- Always end the application letter with:\n\nSincerely,  \n<your name>  \n"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "12f2baf2-f14b-4e84-b8a0-67cf3cb7053d",
      "name": "OpenAI 聊天模型1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -320,
        768
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5-mini",
          "cachedResultName": "gpt-5-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "8814JRU0x3fI9btT",
          "name": "evenkik4"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "ed668501-c588-48c2-9dcb-ea2c5277f97c",
      "name": "简单记忆1",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -192,
        768
      ],
      "parameters": {
        "sessionKey": "={{ $json.message.from.id }}",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "db7a86f1-dfbc-4b25-bbd7-39a47ca74d42",
      "name": "经验表",
      "type": "n8n-nodes-base.dataTableTool",
      "position": [
        -64,
        768
      ],
      "parameters": {
        "operation": "get",
        "returnAll": true,
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "uD4RCsZ5q6GncPRD",
          "cachedResultUrl": "/projects/ty2N3FKN04d75oM7/datatables/uD4RCsZ5q6GncPRD",
          "cachedResultName": "experience"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d69e9a32-9769-476d-9f94-c64c9f25687c",
      "name": "在表格中追加行",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        880,
        656
      ],
      "parameters": {
        "columns": {
          "value": {
            "link": "={{ $('Telegram Trigger').item.json.message.link_preview_options.url }}",
            "company": "={{ $('AI Agent1').item.json.output.company }}",
            "surat-lamaran": "={{ $('AI Agent1').item.json.output.application_letter }}\n\nsorry before, but i think action works more then just some words, what i want to say is this job aplying process is actualy using n8n automation workflow. that i can explain more at interview.",
            "job description": "={{ $('AI Agent1').item.json.output.job_description }}"
          },
          "schema": [
            {
              "id": "company",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "company",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "job description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "job description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "surat-lamaran",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "surat-lamaran",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "resume",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "resume",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "link",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rG2779EUEX07MP36GwOUGmuoCOuoh4d-oUHIkEIhknk/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1rG2779EUEX07MP36GwOUGmuoCOuoh4d-oUHIkEIhknk",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rG2779EUEX07MP36GwOUGmuoCOuoh4d-oUHIkEIhknk/edit?usp=drivesdk",
          "cachedResultName": "loker"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "sfqqyfzW1J0bX5FQ",
          "name": "evenkik4"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "4c0b027e-9e1f-4327-88d8-feab5efb824b",
      "name": "在表格中追加或更新行",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        128,
        208
      ],
      "parameters": {
        "columns": {
          "value": {
            "resume": "={{ $json.webContentLink }}",
            "company": "={{ $('github change trigger').item.json.body.message }}",
            "surat-lamaran": "="
          },
          "schema": [
            {
              "id": "company",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "company",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "job description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "job description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "surat-lamaran",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "surat-lamaran",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "resume",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "resume",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "link",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "company"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rG2779EUEX07MP36GwOUGmuoCOuoh4d-oUHIkEIhknk/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1rG2779EUEX07MP36GwOUGmuoCOuoh4d-oUHIkEIhknk",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rG2779EUEX07MP36GwOUGmuoCOuoh4d-oUHIkEIhknk/edit?usp=drivesdk",
          "cachedResultName": "loker"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "sfqqyfzW1J0bX5FQ",
          "name": "evenkik4"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "ce6bb6f0-7b8f-42b2-bc28-dbcad6cd0cc0",
      "name": "上传文件",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -96,
        208
      ],
      "parameters": {
        "name": "=resume-{{ $json.body.message }}.pdf",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1f3IB0LnlUjaFFTiLL1grQYnbBxuduPpi",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1f3IB0LnlUjaFFTiLL1grQYnbBxuduPpi",
          "cachedResultName": "resume"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "8tLk3lFFsYWUlGSC",
          "name": "evenkik4"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "ef72e3a6-aca5-4931-8805-e76dc1000556",
      "name": "发送短信",
      "type": "n8n-nodes-base.telegram",
      "position": [
        352,
        208
      ],
      "webhookId": "05addb7a-0469-4b4f-bda4-c92103d6dfc2",
      "parameters": {
        "text": "Done...",
        "chatId": "<add your telegram chat ID>",
        "additionalFields": {
          "appendAttribution": true
        }
      },
      "credentials": {
        "telegramApi": {
          "id": "7OxI4doOLkHDQgqo",
          "name": "Appointment"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "a7497b30-26ed-405f-9417-cb0c31dcbb45",
      "name": "当收到聊天消息时",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        -544,
        1152
      ],
      "webhookId": "87922fe9-11f1-4ba0-963d-cc17819c411a",
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "e73b3a9d-ea8f-44b7-94af-585ed3c9788e",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -608,
        960
      ],
      "parameters": {
        "width": 1040,
        "height": 560,
        "content": "## 经验输入代理"
      },
      "typeVersion": 1
    },
    {
      "id": "eafb9833-a865-43bb-ae73-74e3d0a507db",
      "name": "Telegram 触发器",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        -544,
        592
      ],
      "webhookId": "9646c094-54df-4127-9285-4537f87f15fa",
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "id": "UxiL30D1VgHvDBqi",
          "name": "MAP_demo"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "977d5a7a-478a-430f-af1d-ef818fe056c6",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -608,
        96
      ],
      "parameters": {
        "color": 6,
        "width": 1184,
        "height": 288,
        "content": "## 简历下载与链接传输"
      },
      "typeVersion": 1
    },
    {
      "id": "7df0a64b-f251-4e43-94c3-f757fe7f86e9",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -512,
        208
      ],
      "webhookId": "fc896fbb-4a70-48d2-a416-564a3eeeae91",
      "parameters": {
        "path": "fc896fbb-4a70-48d2-a416-564a3eeeae91",
        "options": {}
      },
      "typeVersion": 2.1
    },
    {
      "id": "5e7da90c-db6c-4d45-8d7b-0f81019a1fbe",
      "name": "style.css",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -608,
        416
      ],
      "parameters": {
        "color": 4,
        "width": 1696,
        "height": 512,
        "content": "## 职位分析代理(主代理)"
      },
      "typeVersion": 1
    },
    {
      "id": "51668f0e-825f-47d9-9377-5334f16c9ab9",
      "name": "JSON 输出",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        64,
        768
      ],
      "parameters": {
        "jsonSchemaExample": "{\n    \"company\": \"\",\n  \"job_description\": \"\",\n  \"skills\": [\n    \"skills\",\n    \"skills\",\n    \"skills\"\n  ],\n  \"tools_expertise\": [\n    \"tool\",\n    \"tool\",\n    \"tool\"\n  ],\n\"application_letter\": \"\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "cb28789d-0675-4f15-aaa3-ba6f0db75316",
      "name": "github",
      "type": "n8n-nodes-base.github",
      "position": [
        688,
        656
      ],
      "webhookId": "9236ca99-d548-4ea9-b8c7-4ea98f0d9394",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "url",
          "value": "https://github.com/<username>"
        },
        "filePath": "docs/index.html",
        "resource": "file",
        "operation": "edit",
        "repository": {
          "__rl": true,
          "mode": "list",
          "value": "Job-apply"
        },
        "fileContent": "={{ $json.html }}",
        "commitMessage": "={{ $('AI Agent1').item.json.output.company }}"
      },
      "credentials": {
        "githubApi": {
          "id": "vMhubFcRObu0bu0w",
          "name": "GitHub account"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "0b427fa3-4612-40ec-a139-404738acfe9d",
      "name": "HTML 代码",
      "type": "n8n-nodes-base.html",
      "position": [
        496,
        656
      ],
      "parameters": {
        "html": "<!DOCTYPE html>\n<html lang=\"en\">\n\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Lorem Ipsum Resume</title>\n    <link rel=\"stylesheet\" href=\"https://public.codepenassets.com/css/reset-2.0.min.css\">\n    <link rel=\"stylesheet\" href=\"./style.css\">\n  </head>\n    \n  <body>\n  <!-- FONTS -->\n  <link href='https://fonts.googleapis.com/css?family=Open+Sans:300,400,600' rel='stylesheet' type='text/css'>\n  <link href='https://fonts.googleapis.com/css?family=Raleway:100' rel='stylesheet' type='text/css'>\n  <link href='https://fonts.googleapis.com/css?family=Montserrat' rel='stylesheet' type='text/css'>\n\n  <!-- PAGE STUFF -->\n  <div class=\"rela-block page\">\n    <div class=\"rela-block top-bar\">\n      <div class=\"caps name\">\n        <div class=\"abs-center\">\n          Lorem Ipsum\n          <div class=\"contact-info\">\n            <p>1234 Dolor Sit Street</p>\n            <p>Amet City, Consectetur 56789</p>\n            <p>+00 123 456 7890</p>\n            <p>lorem.ipsum@example.com</p>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"side-bar\">\n      <div class=\"mugshot\">\n        <div class=\"logo\">\n          <svg viewbox=\"0 0 80 80\" class=\"rela-block logo-svg\">\n            <path d=\"M 10 10 L 52 10 L 72 30 L 72 70 L 30 70 L 10 50 Z\" stroke-width=\"2.5\" fill=\"none\"/>\n          </svg>\n          <p class=\"logo-text\">LIP</p>\n        </div>\n      </div><br>\n      <p class=\"rela-block social twitter\">lorem_ipsum</p>\n      <p class=\"rela-block social linked-in\">lorem-ipsum-dolor</p>\n\n      <p class=\"rela-block caps side-header\">Skills</p>\n      <p class=\"rela-block list-thing\">Lorem Ipsum</p>\n      <p class=\"rela-block list-thing\">Dolor Sit</p>\n      <p class=\"rela-block list-thing\">Amet Consectetur</p>\n\n      <p class=\"rela-block caps side-header\">Expertise</p>\n      <p class=\"rela-block list-thing\">Adipiscing Elit</p>\n      <p class=\"rela-block list-thing\">Sed Do Eiusmod</p>\n      <p class=\"rela-block list-thing\">Tempor Incididunt</p>\n    </div>\n\n    <div class=\"rela-block content-container\">\n      <h2 class=\"rela-block caps title\">Lorem Ipsum Developer</h2>\n      <div class=\"rela-block separator\"></div>\n\n      <div class=\"rela-block caps greyed\">Profile</div>\n      <p class=\"long-margin\">\n        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n        Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n      </p>\n\n      <div class=\"rela-block caps greyed\">Experience</div>\n\n      <h3>#1 job</h3>\n      <p class=\"light\">job description</p>\n      <p class=\"justified\">\n        Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n        Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n      </p>\n        \n      <h3>#2 job</h3>\n      <p class=\"light\">Job description</p>\n      <p class=\"justified\">\n        Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n        Integer nec odio. Praesent libero. Sed cursus ante dapibus diam.\n      </p>\n        \n      <div class=\"rela-block caps greyed\">Education</div>\n      <h3>Bachelor of Lorem Engineering</h3>\n      <p class=\"light\">At Ipsum University, Dolorland - 2023</p>\n\n      <div class=\"rela-block caps greyed\">Language</div>\n      <h3>Loremese - native</h3>\n      <h3>Ipsumish - fluent</h3>\n    </div>\n  </div>\n    \n  <script src='https://code.jquery.com/jquery-2.2.4.min.js'></script>\n  <script src=\"./script.js\"></script>\n\n  </body>\n</html>\n"
      },
      "typeVersion": 1.2
    },
    {
      "id": "c801830f-6fb9-464d-9509-e8629f6d722c",
      "name": "将 JSON 转换为 HTML",
      "type": "n8n-nodes-base.code",
      "position": [
        272,
        656
      ],
      "parameters": {
        "jsCode": "// Function to trim LinkedIn job URLs\nconst trimLinkedInJobUrl = (url) => {\n  const match = url.match(/^(https:\\/\\/www\\.linkedin\\.com\\/jobs\\/view\\/\\d+)/);\n  return match ? match[1] : url;\n};\n\n// Main n8n Code node\nreturn items.map(item => {\n    // Access data\n    const skills = item.json.output.skills || [];\n    const tools = item.json.output.tools_expertise || [];\n\n    // Get LinkedIn URL from Telegram Trigger\n    const rawUrl = $('Telegram Trigger').first().json.message.link_preview_options.url;\n    const trimmedUrl = rawUrl ? trimLinkedInJobUrl(rawUrl) : null;\n\n    // Build HTML for skills\n    const htmlOutput = skills\n        .map(skill => `<p class=\"rela-block list-thing\">${skill}</p>`)\n        .join(\"\\n\");\n\n    // Build HTML for tools\n    const htmlTools = tools\n        .map(tool => `<p class=\"rela-block list-thing\">${tool}</p>`)\n        .join(\"\\n\");\n\n    // Return data\n    return {\n        json: {\n            skill: htmlOutput,\n            tool: htmlTools,\n            trimmed_url: trimmedUrl\n        }\n    };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "c122c601-741b-4ee4-b005-3ffa18cea1cb",
      "name": "当点击“执行工作流”时",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        528,
        1216
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "ee9faca1-649e-45ed-99c2-780398c076d7",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        464,
        960
      ],
      "parameters": {
        "color": 3,
        "width": 1152,
        "height": 416,
        "content": "## GITHUB 设置"
      },
      "typeVersion": 1
    },
    {
      "id": "9f8e5e61-65f6-4df7-9a1a-76aad7ba4479",
      "name": "style.css1",
      "type": "n8n-nodes-base.github",
      "position": [
        976,
        1216
      ],
      "webhookId": "9236ca99-d548-4ea9-b8c7-4ea98f0d9394",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "url",
          "value": "https://github.com/<username>"
        },
        "filePath": "docs/style.css",
        "resource": "file",
        "repository": {
          "__rl": true,
          "mode": "list",
          "value": "Job-apply"
        },
        "fileContent": "={{ $json.css }}",
        "commitMessage": "=style.css"
      },
      "credentials": {
        "githubApi": {
          "id": "vMhubFcRObu0bu0w",
          "name": "GitHub account"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "09b59cb1-78e6-48e5-9fc9-7b6cd1331505",
      "name": "css + yml 代码",
      "type": "n8n-nodes-base.set",
      "position": [
        752,
        1216
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "7b21573f-1530-4841-9b3a-9311b30237d2",
              "name": "css",
              "type": "string",
              "value": "* {\n  box-sizing: border-box;\n  transition: 0.35s ease;\n}\n\n.rela-block {\n  display: block;\n  position: relative;\n  margin: auto;\n}\n\n.rela-inline {\n  display: inline-block;\n  position: relative;\n  margin: auto;\n}\n\n.floated {\n  display: inline-block;\n  position: relative;\n  float: left;\n}\n\n.abs-center {\n  position: absolute;\n  top: 25%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  text-align: center;\n  width: 88%;\n}\n\nbody {\n  font-family: 'Open Sans';\n  font-size: 14px;\n  letter-spacing: 0;\n  font-weight: 400;\n  line-height: 14px;\n  background: url(\"http://kingofwallpapers.com/leaves/leaves-016.jpg\") right no-repeat;\n  background-size: cover;\n}\n\nbody:before {\n  content: \"\";\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: rgba(255, 255, 255, 0.92);\n}\n\n.caps {\n  text-transform: uppercase;\n}\n\n.justified {\n  text-align: justify;\n}\n\np.light {\n  color: #777;\n}\n\nh2 {\n  font-family: 'Open Sans';\n  font-size: 24px;\n  letter-spacing: 5px;\n  font-weight: 600;\n  line-height: 30px;\n  color: #000;\n}\n\nh3 {\n  font-family: 'Open Sans';\n  font-size: 21px;\n  letter-spacing: 1px;\n  font-weight: 600;\n  line-height: 15px;\n  color: #000;\n}\n\n.page {\n  width: 100%;\n  height: 100vh;\n  margin: 0;\n  background-color: #fff;\n  box-shadow: none;\n}\n\n.top-bar {\n  height: 150px;\n  background-color: #848484;\n  color: #fff;\n}\n\n.name {\n  position: absolute;\n  left: calc(200px + 5%);\n  right: 0;\n  height: 90px;\n  text-align: center;\n  font-family: 'Raleway';\n  font-size: 32px;\n  letter-spacing: 8px;\n  font-weight: 100;\n  line-height: 60px;\n}\n\n.name div {\n  width: 94%;\n}\n\n.side-bar {\n  position: absolute;\n  top: 40px;\n  left: 1%;\n  bottom: 40px;\n  width: 150px;\n  background-color: #f7e0c1;\n  padding: 220px 3px 2px;\n}\n\n.mugshot {\n  position: absolute;\n  top: 50px;\n  left: 25px;\n  height: 100px;\n  width: 100px;\n}\n\n.mugshot .logo {\n  margin: 0;\n}\n\n.logo {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 100;\n  color: #000;\n  height: 120px;\n  width: 120px;\n}\n\n.logo .logo-svg {\n  height: 100%;\n  width: 100%;\n  stroke: #000;\n  cursor: pointer;\n}\n\n.logo .logo-text {\n  position: absolute;\n  top: 45%;\n  right: 16%;\n  cursor: pointer;\n  font-family: \"Montserrat\";\n  font-size: 25px;\n  font-weight: 400;\n  line-height: 58px;\n}\n\n.social {\n  padding-left: 25px;\n  margin-bottom: 25px;\n  cursor: pointer;\n  position: relative;\n}\n\n.social:before {\n  content: \"\";\n  position: absolute;\n  top: -4px;\n  left: 0;\n  height: 20px;\n  width: 20px;\n  background-size: cover !important;\n}\n\n.social.twitter:before {\n  background: url(\"https://cdn4.iconfinder.com/data/icons/iconsimple-logotypes/512/github-256.png\") center no-repeat;\n}\n\n.social.github:before {\n  background: url(\"https://cdn3.iconfinder.com/data/icons/social-media-2026/60/Socialmedia_icons_Pinterest-23-128.png\") center no-repeat;\n}\n\n.social.linked-in:before {\n  background: url(\"https://cdn3.iconfinder.com/data/icons/social-media-2026/60/Socialmedia_icons_LinkedIn-128.png\") center no-repeat;\n}\n\n.side-header {\n  font-family: 'Open Sans';\n  font-size: 18px;\n  letter-spacing: 1px;\n  font-weight: 600;\n  line-height: 21px;\n  margin: 40px auto 10px;\n  padding-bottom: 5px;\n  border-bottom: 1px solid #888;\n}\n\n.list-thing {\n  padding-left: 25px;\n  margin-bottom: 10px;\n}\n\n.content-container {\n  margin-right: 0;\n  width: calc(95% - 150px);\n  padding: 25px 20px 50px;\n}\n\n.content-container > * {\n  margin: 0 auto 15px;\n}\n\n.content-container > h3 {\n  margin: 0 auto 10px;\n}\n\n.contact-block {\n  position: relative;\n  text-align: center;\n  width: 88%;\n"
            },
            {
              "id": "91801897-70b0-4ebb-91c4-a7097e2cf4e4",
              "name": "html",
              "type": "string",
              "value": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\">\n  <title>Lorem Ipsum Resume</title>\n  <link rel=\"stylesheet\" href=\"https://public.codepenassets.com/css/reset-2.0.min.css\">\n  <link rel=\"stylesheet\" href=\"./style.css\">\n</head>\n\n<body>\n  <!-- FONTS -->\n  <link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,600\" rel=\"stylesheet\" type=\"text/css\">\n  <link href=\"https://fonts.googleapis.com/css?family=Raleway:100\" rel=\"stylesheet\" type=\"text/css\">\n  <link href=\"https://fonts.googleapis.com/css?family=Montserrat\" rel=\"stylesheet\" type=\"text/css\">\n\n  <!-- PAGE STUFF -->\n  <div class=\"rela-block page\">\n    <div class=\"rela-block top-bar\">\n      <div class=\"caps name\">\n        <div class=\"abs-center\">\n          Lorem Ipsum\n          <div class=\"contact-info\">\n            <p>1234 Dolor Sit Street</p>\n            <p>Amet City, Consectetur 56789</p>\n            <p>+00 123 456 7890</p>\n            <p>lorem.ipsum@example.com</p>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"side-bar\">\n      <div class=\"mugshot\">\n        <div class=\"logo\">\n          <svg viewBox=\"0 0 80 80\" class=\"rela-block logo-svg\">\n            <path d=\"M 10 10 L 52 10 L 72 30 L 72 70 L 30 70 L 10 50 Z\" stroke-width=\"2.5\" fill=\"none\" />\n          </svg>\n          <p class=\"logo-text\">LIP</p>\n        </div>\n      </div>\n      <br>\n      <p class=\"rela-block social twitter\">lorem_ipsum</p>\n      <p class=\"rela-block social linked-in\">lorem-ipsum-dolor</p>\n\n      <p class=\"rela-block caps side-header\">Skills</p>\n      <p class=\"rela-block list-thing\">Lorem Ipsum</p>\n      <p class=\"rela-block list-thing\">Dolor Sit</p>\n      <p class=\"rela-block list-thing\">Amet Consectetur</p>\n\n      <p class=\"rela-block caps side-header\">Expertise</p>\n      <p class=\"rela-block list-thing\">Adipiscing Elit</p>\n      <p class=\"rela-block list-thing\">Sed Do Eiusmod</p>\n      <p class=\"rela-block list-thing\">Tempor Incididunt</p>\n    </div>\n\n    <div class=\"rela-block content-container\">\n      <h2 class=\"rela-block caps title\">Lorem Ipsum Developer</h2>\n      <div class=\"rela-block separator\"></div>\n\n      <div class=\"rela-block caps greyed\">Profile</div>\n      <p class=\"long-margin\">\n        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore\n        magna aliqua.\n        Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n      </p>\n\n      <div class=\"rela-block caps greyed\">Experience</div>\n\n      <h3>#1 Job</h3>\n      <p class=\"light\">Job description</p>\n      <p class=\"justified\">\n        Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n        Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n      </p>\n\n      <h3>#2 Job</h3>\n      <p class=\"light\">Job description</p>\n      <p class=\"justified\">\n        Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n        Integer nec odio. Praesent libero. Sed cursus ante dapibus diam.\n      </p>\n\n      <div class=\"rela-block caps greyed\">Education</div>\n      <h3>Bachelor of Lorem Engineering</h3>\n      <p class=\"light\">At Ipsum University, Dolorland - 2023</p>\n\n      <div class=\"rela-block caps greyed\">Language</div>\n      <h3>Loremese - native</h3>\n      <h3>Ipsumish - fluent</h3>\n    </div>\n  </div>\n\n  <script src=\"https://code.jquery.com/jquery-2.2.4.min.js\"></script>\n  <script src=\"./script.js\"></script>\n</body>\n\n</html>\n"
            },
            {
              "id": "6872f821-95f7-4815-8929-d3bb23a30681",
              "name": "yml",
              "type": "string",
              "value": "name: Notify n8n on GitHub Pages Deploy\n\non:\n  workflow_run:\n    workflows: [\"pages-build-deployment\"]\n    types:\n      - completed\n\njobs:\n  notify:\n    if: ${{ github.event.workflow_run.conclusion == 'success' }}\n    runs-on: ubuntu-latest\n    steps:\n      - name: Get commit message\n        id: get_message\n        run: |\n          COMMIT_MESSAGE=$(curl -s \\\n            -H \"Accept: application/vnd.github+json\" \\\n            -H \"Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}\" \\\n            https://api.github.com/repos/${{ github.repository }}/commits/${{ github.event.workflow_run.head_sha }} \\\n            | jq -r '.commit.message')\n          echo \"message=$COMMIT_MESSAGE\" >> $GITHUB_OUTPUT\n\n      - name: Send POST to n8n webhook\n        run: |\n          curl -X POST \\\n            -H \"Content-Type: application/json\" \\\n            -d \"{\\\"status\\\": \\\"deployed\\\", \\\n                 \\\"repo\\\": \\\"${{ github.repository }}\\\", \\\n                 \\\"branch\\\": \\\"${{ github.ref_name }}\\\", \\\n                 \\\"commit\\\": \\\"${{ github.event.workflow_run.head_sha }}\\\", \\\n                 \\\"message\\\": \\\"${{ steps.get_message.outputs.message }}\\\"}\" \\\n            <your_webhook_url>"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "588cea32-465d-464d-a1e7-60d6fe3293bb",
      "name": "index.html 设置",
      "type": "n8n-nodes-base.github",
      "position": [
        1200,
        1216
      ],
      "webhookId": "9236ca99-d548-4ea9-b8c7-4ea98f0d9394",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "url",
          "value": "https://github.com/<username>"
        },
        "filePath": "docs/index.html",
        "resource": "file",
        "repository": {
          "__rl": true,
          "mode": "list",
          "value": "Job-apply"
        },
        "fileContent": "={{ $json.html }}",
        "commitMessage": "index.html"
      },
      "credentials": {
        "githubApi": {
          "id": "vMhubFcRObu0bu0w",
          "name": "GitHub account"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "af933dd6-1a3a-4887-96f5-16f9f963bbe9",
      "name": "yml 设置",
      "type": "n8n-nodes-base.github",
      "position": [
        1424,
        1216
      ],
      "webhookId": "9236ca99-d548-4ea9-b8c7-4ea98f0d9394",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "url",
          "value": "https://github.com/<username>"
        },
        "filePath": "github/workflows/notify-n8n.yml",
        "resource": "file",
        "repository": {
          "__rl": true,
          "mode": "list",
          "value": "Job-apply"
        },
        "fileContent": "={{ $json['notify-n8n'].yml }}",
        "commitMessage": "=notify-n8n.yml"
      },
      "credentials": {
        "githubApi": {
          "id": "vMhubFcRObu0bu0w",
          "name": "GitHub account"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "d616be1b-9745-4449-8838-467ae97036fa",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        544
      ],
      "parameters": {
        "height": 272,
        "content": "## HTML 模板"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "callerPolicy": "workflowsFromSameOwner",
    "errorWorkflow": "p3JNAkab4FftCjPL",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "4829d028-5a80-4a2a-9fa9-2abd8f697bd1",
  "connections": {
    "github": {
      "main": [
        [
          {
            "node": "Append row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Insert row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent1": {
      "main": [
        [
          {
            "node": "change JSON to HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTML code": {
      "main": [
        [
          {
            "node": "github",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "style.css1": {
      "main": [
        [
          {
            "node": "index.html setup",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "JSON Output": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent1",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Upload file": {
      "main": [
        [
          {
            "node": "Append or update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Upload file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "AI Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "css +yml code": {
      "main": [
        [
          {
            "node": "style.css1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory1": {
      "ai_memory": [
        [
          {
            "node": "AI Agent1",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Telegram Trigger": {
      "main": [
        [
          {
            "node": "AI Agent1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "experience table": {
      "ai_tool": [
        [
          {
            "node": "AI Agent1",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "index.html setup": {
      "main": [
        [
          {
            "node": "yml setup",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "change JSON to HTML": {
      "main": [
        [
          {
            "node": "HTML code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "When chat message received": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append or update row in sheet": {
      "main": [
        [
          {
            "node": "Send a text message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking ‘Execute workflow’": {
      "main": [
        [
          {
            "node": "css +yml code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级 - 文档提取, AI RAG 检索增强

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量31
分类2
节点类型19
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

作者
Michael A Putra

Michael A Putra

@michael-ap

My journey with automation began in mechanical engineering, where I learned the fundamentals of machines. This curiosity led me to explore mechatronics, blending mechanics with electronics, and eventually sparked my passion for AI and advanced automation, where I now focus on creating intelligent systems that simplify complex processes.

外部链接
在 n8n.io 查看

分享此工作流