8
n8n 中文网amn8n.com

我的工作流

高级

这是一个自动化工作流,包含 27 个节点。主要使用 Set, Code, Html, Wait, Gmail 等节点。 使用 LinkedIn、Google Sheets 和 AI 简历评分与求职信自动化职位搜索

前置要求
  • Google 账号和 Gmail API 凭证
  • Google Drive API 凭证
  • 可能需要目标 API 的认证凭证
  • Google Sheets API 凭证
  • Google Gemini API Key

分类

-
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "SrQYoBJKHtuSzi6B",
  "meta": {
    "instanceId": "1da5d9ac3e2974ca203c09fc21d9eb832e61e497fa9e11c9fbcaae0e18a9c185",
    "templateCredsSetupCompleted": true
  },
  "name": "我的工作流",
  "tags": [],
  "nodes": [
    {
      "id": "9dd871da-bb3b-4ebe-963b-128fcff34099",
      "name": "下载文件",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        208,
        0
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "url",
          "value": ""
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "AcZcDztmyUtsa3Kc",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "6bdbd596-b061-427a-b97c-e789fe7090a4",
      "name": "从文件提取",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        416,
        0
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "484e0f62-0d1a-4637-8b58-4942d6d0a4e0",
      "name": "获取工作表中的行",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        624,
        0
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g/edit#gid=0",
          "cachedResultName": "Filter"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g/edit?usp=drivesdk",
          "cachedResultName": "Job Search N8N"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "oD5JyqmvqMOPNTeR",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "c4bc1e36-3acb-4637-a867-085a3079eb14",
      "name": "LinkedIn 搜索 URL",
      "type": "n8n-nodes-base.code",
      "position": [
        832,
        0
      ],
      "parameters": {
        "jsCode": "let url = \"https://www.linkedin.com/jobs/search/?f_TPR=r86400\"\n\nconst keyword = $input.first().json.Keyword\nconst location = $input.first().json.Location\nconst experienceLevel = $input.first().json['Experience Level']\nconst remote = $input.first().json.Remote\nconst easyApply = $input.first().json['Easy Apply']\n\nif (keyword != \"\") {\n  url += `&keywords=${keyword}`;\n}\n\nif (location != \"\") {\n  url += `&location=${location}`;\n}\n\nif (experienceLevel !== \"\") {\n  // Transform experience levels to LinkedIn codes\n  // Internship -> 1, Entry level -> 2, Associate -> 3\n  // Mid-Senior level -> 4, Director -> 5, Executive -> 6\n  const transformedExperiences = experienceLevel\n    .split(\",\")\n    .map((exp) => {\n      switch (exp.trim()) {\n        case \"Internship\": return \"1\";\n        case \"Entry level\": return \"2\";\n        case \"New Grad\": return \"3\";\n        default: return \"\";\n      }\n    })\n    .filter(Boolean);\n  url += `&f_E=${transformedExperiences.join(\",\")}`;\n}\n\nif (remote.length != \"\") {\n  // Transform remote options to LinkedIn codes\n  // On-Site -> 1, Remote -> 2, Hybrid -> 3\n  const transformedRemote = remote\n    .split(\",\")\n    .map((e) => {\n      switch (e.trim()) {\n        case \"Remote\": return \"2\";\n        case \"Hybrid\": return \"3\";\n        case \"On-Site\": return \"1\";\n        default: return \"\";\n      }\n    })\n    .filter(Boolean);\n  url += `&f_WT=${transformedRemote.join(\",\")}`;\n}\n\nif (easyApply != \"\") {\n  url += \"&f_EA=true\";\n}\n\nreturn {url}\n"
      },
      "typeVersion": 2
    },
    {
      "id": "dc8f887e-81e6-44bf-a356-13f61d6a0388",
      "name": "从 LinkedIn 获取职位",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1040,
        0
      ],
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "c9e59fa5-49df-47bb-89c0-87ab7845fd2f",
      "name": "HTML",
      "type": "n8n-nodes-base.html",
      "position": [
        1248,
        0
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "jobs",
              "attribute": "href",
              "cssSelector": "ul.jobs-search__results-list li div a[class*=\"base-card\"]",
              "returnArray": true,
              "returnValue": "attribute"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c2aec608-8302-4bcd-a00b-2e3d293b89bf",
      "name": "拆分输出",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1456,
        0
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "jobs"
      },
      "typeVersion": 1
    },
    {
      "id": "00612b80-a789-4615-9942-e62584e22fdf",
      "name": "遍历项目",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1568,
        816
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "293a9da0-abfd-491c-9ee6-926fb6de30f1",
      "name": "等待",
      "type": "n8n-nodes-base.wait",
      "position": [
        -32,
        208
      ],
      "webhookId": "12409f66-fbe7-48bd-b9d7-68449f197264",
      "parameters": {
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "2f0cb178-8831-458f-9c8c-f9fbbc52abbc",
      "name": "HTTP请求",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        176,
        208
      ],
      "parameters": {
        "url": "={{ $json.jobs }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "33d05837-7b57-4f7d-9aa1-d79fe3e71753",
      "name": "HTML1",
      "type": "n8n-nodes-base.html",
      "position": [
        384,
        208
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "Title",
              "cssSelector": "div h1"
            },
            {
              "key": "Company",
              "cssSelector": "div span a"
            },
            {
              "key": "Location",
              "cssSelector": "div span[class*='topcard__flavor topcard__flavor--bullet']"
            },
            {
              "key": "Description",
              "cssSelector": "div.description__text.description__text--rich"
            },
            {
              "key": "Job ID",
              "attribute": "data-semaphore-content-urn",
              "cssSelector": "a[data-item-type='semaphore']",
              "returnValue": "attribute"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "43feb566-7427-455c-9109-2a6ba56764f7",
      "name": "编辑字段",
      "type": "n8n-nodes-base.set",
      "position": [
        592,
        208
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "240418dc-3349-48d5-ba59-3aa590d71950",
              "name": "Description",
              "type": "string",
              "value": "={{ $json.Description.replaceAll(/\\s+/g, \" \")}}"
            },
            {
              "id": "7b24938f-8b47-488d-9f65-54d036dcffd5",
              "name": "Job ID",
              "type": "string",
              "value": "={{ $json['Job ID'].split(\":\").last() }}"
            },
            {
              "id": "d6addada-9e01-464f-a768-c19f6224c491",
              "name": "Apply Link",
              "type": "string",
              "value": "={{ \"https://www.linkedin.com/jobs/view/\"+ $json['Job ID'].split(\":\").last()  }}"
            },
            {
              "id": "21c89d3a-c8b6-44eb-9719-9ae5716a7c76",
              "name": "Title",
              "type": "string",
              "value": "={{ $json.Title }}"
            },
            {
              "id": "da713845-9a81-486e-bff2-1613105e424d",
              "name": "Company",
              "type": "string",
              "value": "={{ $json.Company }}"
            },
            {
              "id": "1a9a31dd-8d51-4f35-b6b6-ca8a348de5d7",
              "name": "Location",
              "type": "string",
              "value": "={{ $json.Location }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "8d9894bd-66fe-4069-aff0-84d351b8b5b4",
      "name": "AI 代理",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        32,
        464
      ],
      "parameters": {
        "text": "=You are a precise job-matching assistant.\n\nReturn ONE JSON object wrapped in ```json fences, followed by the line END_OF_JSON.\nNo extra prose. No Markdown inside the JSON. No comments.\n\nINPUTS\njob_description: {{ $json.Description }}\nmy_resume: {{ $('Extract from File').item.json.text }}\n\nTASKS\n1) Parse job_description → job_analysis with keys:\n   title (string), company (string), must_have_skills (string[]), nice_to_have_skills (string[]),\n   responsibilities (string[]), years_of_experience (string), education_certifications (string),\n   location_constraints (string), domain_industry_focus (string), tech_stack (string[]), measurable_kpis (string[])\n\n2) Parse my_resume → resume_analysis:\n   core_skills (string[]),\n   tools_tech { programming_languages[], frontend_technologies[], backend_technologies[], databases_devops[] },\n   years_of_experience_key_areas (object of short strings),\n   accomplishments_with_metrics (string[]),\n   education_certs (string[]), domains (string[]), roles_titles (string[]),\n   leadership_collaboration (string[]), location_work_auth (string)\n\n3) Scoring (integer 0–100):\n   - Skills/Tools overlap: 40\n   - Relevant experience & seniority: 25\n   - Responsibilities alignment: 15\n   - Education/Certs fit: 10\n   - Domain/industry fit: 5\n   - Logistics (location/work auth/availability): 5\n   Allow partial credit; deduct up to 10 via red_flags. Clamp to [0,100], integer.\n\n4) Explain the score:\n   For each bucket, provide 1–3 concise evidence bullets. Cite \"JD\" or \"Resume\" and include short quoted fragments (escape quotes).\n\n5) Gaps & Suggestions:\n   List missing/weak requirements with 1–2 concrete upskilling steps per gap.\n\n6) Cover letter:\n   150–220 words (2–4 short paragraphs), tailored to the role/company.\n   Concrete impacts; no greeting/signature. JSON-safe: escape all \" as \\\", use \\n for newlines.\n\nSTRICT CONTENT RULES (to prevent invalid JSON)\n- Do NOT paste raw paragraphs, markdown (**bold**, lists), headings, or multi-line blocks into any array fields.\n- Every array element must be a short phrase (≤ 140 characters), single line, no line breaks, no asterisks, no bullets.\n- If a JD section is long, summarize into short phrases before placing into arrays.\n- Do NOT include unrelated job text inside arrays or objects. Keep each value semantically atomic.\n- Never invent company/title; use \"\" if unknown.\n- No trailing commas anywhere.\n\nSTRICT OUTPUT RULES\n- Output exactly the following schema (keys and types). No extra keys.\n\nSCHEMA\n```json\n{\n  \"job_analysis\": {\n    \"title\": \"\",\n    \"company\": \"\",\n    \"must_have_skills\": [],\n    \"nice_to_have_skills\": [],\n    \"responsibilities\": [],\n    \"years_of_experience\": \"\",\n    \"education_certifications\": \"\",\n    \"location_constraints\": \"\",\n    \"domain_industry_focus\": \"\",\n    \"tech_stack\": [],\n    \"measurable_kpis\": []\n  },\n  \"resume_analysis\": {\n    \"core_skills\": [],\n    \"tools_tech\": {\n      \"programming_languages\": [],\n      \"frontend_technologies\": [],\n      \"backend_technologies\": [],\n      \"databases_devops\": []\n    },\n    \"years_of_experience_key_areas\": {},\n    \"accomplishments_with_metrics\": [],\n    \"education_certs\": [],\n    \"domains\": [],\n    \"roles_titles\": [],\n    \"leadership_collaboration\": [],\n    \"location_work_auth\": \"\"\n  },\n  \"match_score\": 0,\n  \"score_explanation\": [\n    { \"category\": \"Skills/Tools overlap (40 points)\", \"score\": 0, \"evidence\": [] },\n    { \"category\": \"Relevant experience depth & seniority (25 points)\", \"score\": 0, \"evidence\": [] },\n    { \"category\": \"Responsibilities alignment (15 points)\", \"score\": 0, \"evidence\": [] },\n    { \"category\": \"Education/Certs fit (10 points)\", \"score\": 0, \"evidence\": [] },\n    { \"category\": \"Domain/industry fit (5 points)\", \"score\": 0, \"evidence\": [] },\n    { \"category\": \"Logistics (location, work auth, availability) (5 points)\", \"score\": 0, \"evidence\": [] }\n  ],\n  \"red_flags\": [],\n  \"gaps_and_suggestions\": [\n    { \"gap\": \"\", \"suggestion\": \"\" }\n  ],\n  \"cover_letter\": \"\"\n}\n",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "cc137b01-1f25-4ba5-955d-6fb7f947bcd6",
      "name": "Google Gemini 聊天模型",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        32,
        640
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "id": "g6RyTSgLpUyQXe6T",
          "name": "Google Gemini(PaLM) Api account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4ef714a7-1e5d-4c45-b1fd-d961592ec459",
      "name": "编辑字段1",
      "type": "n8n-nodes-base.set",
      "position": [
        432,
        656
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={{ (() => {\n  // 0) Read model output from AI Agent node\n  const raw = String(($('AI Agent').item.json.output ?? ''));\n\n  // 1) Strip code fences\n  let s = raw\n    .replace(/`{2,3}(?:json)?\\s*/gi, '')\n    .replace(/\\s*`{3}\\s*$/gi, '');\n\n  // 1b) Normalize curly quotes (Gemini sometimes emits them)\n  s = s.replace(/[\\u201C\\u201D]/g, '\"').replace(/\\u2019/g, \"'\");\n\n  // 2) Cut at END_OF_JSON if present\n  const endIdx = s.indexOf('END_OF_JSON');\n  if (endIdx !== -1) s = s.slice(0, endIdx);\n\n  // 3) Extract first complete { ... } by brace counting\n  const start = s.indexOf('{');\n  if (start < 0) return {};\n  let depth = 0, inStr = false, esc = false, end = -1;\n  for (let i = start; i < s.length; i++) {\n    const ch = s[i];\n    if (inStr) {\n      if (esc) { esc = false; }\n      else if (ch === '\\\\') { esc = true; }\n      else if (ch === '\"') { inStr = false; }\n    } else {\n      if (ch === '\"') inStr = true;\n      else if (ch === '{') depth++;\n      else if (ch === '}') { depth--; if (depth === 0) { end = i + 1; break; } }\n    }\n  }\n  if (end < 0) return {};\n\n  const cleaned = s.slice(start, end).trim();\n\n  try {\n    return JSON.parse(cleaned);   // JSON mode expects an OBJECT\n  } catch (e) {\n    // As a last resort, return an empty object to keep the run alive\n    return {};\n  }\n})() }}\n"
      },
      "typeVersion": 3.4
    },
    {
      "id": "b4795633-1f39-4d56-b19d-d2837d987d89",
      "name": "AI 代理1",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        736,
        656
      ],
      "parameters": {
        "text": "You are a ruthless resume editor. Compare the inputs and output ONLY crisp, point-wise changes to improve job fit.\n\nInputs:\n- job_description: {{ $json.Description }}\n- my_resume: {{ $('Extract from File').item.json.text }}\n\nInstructions:\n- Output a numbered list; highest-impact first.\n- One line per point; <= 14 words.\n- Start each line with a tag: [ADD], [REMOVE], [REWRITE], [ORDER], [QUANTIFY], [KEYWORDS], [FORMAT], [FOCUS].\n- Base every point on gaps vs. the job_description; do not invent experience.\n- Prefer concrete actions: skills to add, bullets to rewrite, sections to reorder/remove.\n- Include one line: 'Missing keywords: term1, term2, ...' (only if any).\n- No intros, explanations, code fences, or extra text - points only.\n\nOutput: points only, exactly as specified above.",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "5e3518b8-e203-45ba-9d02-356edf668c0c",
      "name": "Google Gemini 聊天模型1",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        736,
        816
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "id": "g6RyTSgLpUyQXe6T",
          "name": "Google Gemini(PaLM) Api account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ca1e037d-bb59-455c-8738-f1e1ce89f2b4",
      "name": "在 sheet1 中追加或更新行",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1072,
        656
      ],
      "parameters": {
        "columns": {
          "value": {
            "Link": "={{ $('Edit Fields').item.json['Apply Link'] }}",
            "Score": "={{ $('Edit Fields1').item.json.match_score }}",
            "Title": "={{ $('Edit Fields').item.json.Title }}",
            "Skills": "={{ $('Edit Fields1').item.json.resume_analysis.core_skills }}",
            "Locaton": "={{ $('Edit Fields').item.json.Location }}",
            "Company ": "={{ $('Edit Fields').item.json.Company }}",
            "Cover Letter": "={{ $('Edit Fields1').item.json.cover_letter }}",
            "Improvements": "={{ $json.output }}"
          },
          "schema": [
            {
              "id": "Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company ",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Locaton",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Locaton",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Link",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Cover Letter",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Cover Letter",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Skills",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Skills",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Improvements",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Improvements",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Link"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 11035642,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g/edit#gid=11035642",
          "cachedResultName": "Result"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g/edit?usp=drivesdk",
          "cachedResultName": "Job Search N8N"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "oD5JyqmvqMOPNTeR",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "d2b5241e-c511-42c9-8301-e75c1b5c22c9",
      "name": "发送消息",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1984,
        800
      ],
      "webhookId": "f0d6158b-a72b-4e84-8f3e-0e8ecfaeda72",
      "parameters": {
        "sendTo": "<your e-mail address>",
        "message": "Hey, your job search results with resume changes are ready in your sheet for today",
        "options": {},
        "subject": "Job search results",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "Zd1C7CJsZcTcApAG",
          "name": "Gmail account"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "9100d62e-1108-4ba2-b6dd-91576b1c015b",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        112,
        -240
      ],
      "parameters": {
        "height": 192,
        "content": "## 添加 Google Cloud 凭据"
      },
      "typeVersion": 1
    },
    {
      "id": "ff1c1aad-5ab0-49c3-805a-092e1e371985",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        576,
        -224
      ],
      "parameters": {
        "height": 176,
        "content": "## 添加 Google Cloud 凭据"
      },
      "typeVersion": 1
    },
    {
      "id": "9d6df7e1-3a16-483b-add7-9d0e2fc95498",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1904,
        592
      ],
      "parameters": {
        "content": "## 添加 Google Cloud 凭据"
      },
      "typeVersion": 1
    },
    {
      "id": "986e4584-7f86-4a56-97d4-f6a09835808e",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1008,
        448
      ],
      "parameters": {
        "height": 176,
        "content": "## 添加 Google Cloud 凭据"
      },
      "typeVersion": 1
    },
    {
      "id": "b4e4313d-e9e1-4e81-a613-de7de233eec1",
      "name": "便签4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -16,
        784
      ],
      "parameters": {
        "height": 176,
        "content": "## 添加 Gemini 免费层级 API 密钥"
      },
      "typeVersion": 1
    },
    {
      "id": "65c1327d-e61b-47ee-bd55-8ddf43c58cd8",
      "name": "便签5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        464
      ],
      "parameters": {
        "height": 176,
        "content": "## 添加 Gemini 免费层级 API 密钥"
      },
      "typeVersion": 1
    },
    {
      "id": "94653150-71a5-411b-bed3-a0771b9fef44",
      "name": "由 Github 模型提供支持",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -48,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 5
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c28849bf-1393-41d1-88e7-aa2d1c8c3c8c",
      "name": "### 需要帮助?",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        -624
      ],
      "parameters": {
        "height": 320,
        "content": "# 终极职位搜索工作流 - @jugaldb"
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "25e5c7d3-60ea-47bf-b4bc-cb62a22a3ad7",
  "connections": {
    "HTML": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTML1": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Edit Fields1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent1": {
      "main": [
        [
          {
            "node": "Append or update row in sheet1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields1": {
      "main": [
        [
          {
            "node": "AI Agent1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "HTML1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download file": {
      "main": [
        [
          {
            "node": "Extract from File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Download file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract from File": {
      "main": [
        [
          {
            "node": "Get row(s) in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get row(s) in sheet": {
      "main": [
        [
          {
            "node": "LinkedIn Search URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "LinkedIn Search URL": {
      "main": [
        [
          {
            "node": "Fetch jobs from LinkedIn",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch jobs from LinkedIn": {
      "main": [
        [
          {
            "node": "HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Append or update row in sheet1": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

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

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

高级

需要付费吗?

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

工作流信息
难度等级
高级
节点数量27
分类-
节点类型15
难度说明

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

作者

Master’s in US 🇺🇸 | Travel | Jobs SDE @amazon👨‍💻 MSCS @illinois1867 🚀 for FREE, ask me how Yapping about education abroad! Free Resources👇🏻

外部链接
在 n8n.io 查看

分享此工作流