Gmail到Slack:AI评分的Upwork工作提醒,使用OpenRouter

中级

这是一个Personal Productivity、AI Summarization领域的自动化工作流,包含 14 个节点。主要使用 Set、Gmail、Slack、Filter、Markdown 等节点。 Gmail到Slack:AI评分的Upwork工作提醒,使用OpenRouter

前置要求
  • Google 账号和 Gmail API 凭证
  • Slack Bot Token 或 Webhook URL
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "meta": {
    "instanceId": "9192ad8880fb52b25f18408be81eae9d996a6784a1da3c68d52d3b7ef01d482b",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "0dc258f0-4d50-4bbf-9063-b252f597c245",
      "name": "转换为 Markdown",
      "type": "n8n-nodes-base.markdown",
      "position": [
        440,
        -20
      ],
      "parameters": {
        "html": "={{ $('Get Filtered Messages').item.json.textAsHtml }}",
        "options": {},
        "destinationKey": "markdown"
      },
      "typeVersion": 1
    },
    {
      "id": "fced2dd2-720f-4534-a459-94f6cd13314b",
      "name": "OpenRouter聊天模型",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        748,
        200
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "id": "muXopBcyQsze8BOD",
          "name": "OpenRouter | Paper Jam"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4b04a2bf-29a6-42f6-8e72-c264f092780e",
      "name": "标记为已读",
      "type": "n8n-nodes-base.gmail",
      "position": [
        220,
        -20
      ],
      "webhookId": "212c90ed-2d69-4f54-9f96-7009214490d7",
      "parameters": {
        "messageId": "={{ $json.id }}",
        "operation": "markAsRead"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "dZkZW7tKXuK6yfDP",
          "name": "Gmail | Paper Jam"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "5c208e16-c987-4bf0-b3f6-27d560b3ce5e",
      "name": "获取筛选后的消息",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        0,
        -20
      ],
      "parameters": {
        "simple": false,
        "filters": {
          "q": "from:(donotreply@upwork.com) subject:(New job:)"
        },
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyX",
              "unit": "minutes",
              "value": 10
            }
          ]
        }
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "dZkZW7tKXuK6yfDP",
          "name": "Gmail | Paper Jam"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "6674d03e-91ca-4c6b-8091-b956920e7d9a",
      "name": "发送 Slack 警报",
      "type": "n8n-nodes-base.slack",
      "position": [
        1860,
        -20
      ],
      "webhookId": "f0b47490-d6ac-40ce-9f4f-8c115d6ef51b",
      "parameters": {
        "text": "=🚨 *New Upwork Job Opportunity!*\n----\n\n*{{ $json.job.jobName.toUpperCase() }}*\n_{{ $json.job.descriptionSnippet }}..._\n\n🗺️ {{ $json.job.country }}\n{{ $json.output.paymentVerified ? \"✅ Payment verified\" : \"❌ Payment not verified\"  }}\n🕧 {{ $json.job.jobType }} | {{ $json.job.price }}\n🏷️ {{ $json.job.tags.map(tag => `\\`${tag}\\``).join(', ') }}\n⭐ {{ $json.job.clientRating }}\n💰 {{ $json.job.amountSpent }}\n🏆 {{ $json.job.experienceLevel }}\n📆 Posted {{ $json.job.postedAt }}\n\n----\n*AI EVALUATION*\nScore: *{{ $json.evaluation.score }}*\n_{{ $json.evaluation.reasoning }}_\n---\n\n_View this job:_ {{ $json.job.jobDetailUrl }}\n\n",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C090EHUFGEN",
          "cachedResultName": "testing"
        },
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "credentials": {
        "slackApi": {
          "id": "awboaOk6Kh1kQZ7N",
          "name": "Slack | Paper Jam"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "0b9a8a79-3639-4a83-ac4d-9bbd22adef5e",
      "name": "OpenRouter聊天模型1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        1124,
        200
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "id": "muXopBcyQsze8BOD",
          "name": "OpenRouter | Paper Jam"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e282e1a2-70c7-40ca-a394-33e33976f855",
      "name": "编辑字段",
      "type": "n8n-nodes-base.set",
      "position": [
        1440,
        -20
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "43e777e8-2442-4cc9-8b58-65f1e8f591e5",
              "name": "evaluation",
              "type": "object",
              "value": "={{ $json.output }}"
            },
            {
              "id": "a2c26763-047f-4360-984a-272b88fe3bcc",
              "name": "job",
              "type": "object",
              "value": "={{ $('Job Data Extractor').item.json.output }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "37767da3-90bc-42c5-8fe4-a8d45be89cf3",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -60,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 660,
        "height": 460,
        "content": "## 获取并格式化邮件"
      },
      "typeVersion": 1
    },
    {
      "id": "96107c5a-8311-4836-a51e-09ce43994892",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 460,
        "content": "## 从工作中提取数据"
      },
      "typeVersion": 1
    },
    {
      "id": "a8e422da-0984-4090-abde-eb2344dc2b28",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1000,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 340,
        "height": 460,
        "content": "## 评估技能匹配度"
      },
      "typeVersion": 1
    },
    {
      "id": "51b4e572-fe95-41ca-8ef1-e6638d6cbe8c",
      "name": "按分数筛选",
      "type": "n8n-nodes-base.filter",
      "position": [
        1640,
        -20
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "ab20e70f-c9e3-4873-ab6a-e975dffefa35",
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ $json.evaluation.score }}",
              "rightValue": 7
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "bf621b43-05bd-47c2-bd29-4484400dff62",
      "name": "机会评分器",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        1040,
        -20
      ],
      "parameters": {
        "text": "=**Situation**\nYou are an expert job matching analyst specializing in freelance opportunities. You'll evaluate the compatibility between my professional profile (skills, experience, and preferences) and Upwork job listings to determine how well we match.\n\n**Task**\nAnalyze the provided Upwork job details against my skills and preferences, then generate a comprehensive match score on a scale of 1-10, where 10 indicates an exceptional match and 1 indicates a poor fit.\n\n**Objective**\nHelp me identify the most suitable job opportunities that align with my capabilities and preferences, saving me time by focusing only on highly compatible positions.\n\n**Knowledge**\n- The job information includes: job name, job type (hourly/fixed), price range, description snippet, country, payment verification status, client rating, amount spent, relevant tags, posting date, and required experience level\n- The description snippet provides limited information about the job requirements\n- Primary matching factors: job name, description snippet, and tags\n- Secondary matching factors: experience level, job type, and payment amount\n- My skills and preferences will be provided in my request\n\nWhen analyzing the match:\n1. Evaluate technical skill alignment based on job name, description snippet, and tags first and foremost\n2. Consider experience level requirements\n3. Factor in my stated job type preferences (hourly vs. fixed), if provided\n4. Account for payment range alignment with my expectations, if provided\n5. Assess if the job description suggests requirements outside my capabilities\n6. Consider any specific preferences I've mentioned (location, industry, etc.)\n\nYou must provide a nuanced, honest assessment of the match quality rather than inflating scores. For each match score, provide brief but specific reasoning explaining why the score was assigned, highlighting both strengths and potential misalignments.\n\n<my_profile>\nREPLACE THIS WITH YOUR PROFILE. BELOW IS AN EXAMPLE PROFILE.\nI’m a seasoned web designer with over 8 years of experience crafting modern, user-friendly websites for startups, agencies, and global brands. My work spans across responsive design, UI/UX optimization, and full website redesigns that prioritize both aesthetic appeal and functional performance. I’m highly proficient with tools like Figma, Adobe XD, Webflow, WordPress, and Shopify, and I frequently collaborate with developers to ensure seamless handoff using platforms like Zeplin or Storybook. Whether you’re looking to improve conversions, refresh your brand’s digital presence, or build something entirely new, I bring a strong design eye, clear communication, and a results-driven approach to every project.\n\nI have a slight preference for hourly projects with a rate about $30/hour. \n</my_profile>\n\n<job>\n{{ JSON.stringify($json.output, null, 2) }}\n</job>",
        "options": {},
        "schemaType": "manual",
        "inputSchema": "{\n\t\"type\": \"object\",\n    \"additionalProperties\": false,\n    \"required\": [\n      \"score\",\n      \"reasoning\"\n    ],\n\t\"properties\": {\n        \"score\": {\n          \"type\": \"integer\",\n          \"minimum\": 1,\n          \"maximum\": 10\n        },\n        \"reasoning\": {\n          \"type\": \"string\"\n        }\n\t}\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "f768b4e4-3eba-41b1-a6aa-c34c14dead7c",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1380,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 620,
        "height": 460,
        "content": "## 将筛选后的通知发送到 Slack"
      },
      "typeVersion": 1
    },
    {
      "id": "ffbe5e44-4e6d-4b88-92cd-042a47fdc77c",
      "name": "工作数据提取器",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        660,
        -20
      ],
      "parameters": {
        "text": "=Below is a job alert email received from Upwork. Please extract the requested information in valid JSON format.\n\nSubject: {{ $('Get Filtered Messages').item.json.subject }}\nBody: {{ $json.markdown }}",
        "options": {},
        "schemaType": "manual",
        "inputSchema": "{\n\t\"type\": \"object\",\n    \"additionalProperties\": false,\n    \"required\": [\n      \"jobName\",\n      \"jobType\", \n      \"jobDetailUrl\", \n      \"price\", \n      \"descriptionSnippet\", \n      \"country\", \n      \"paymentVerified\",\n      \"clientRating\",\n      \"amountSpent\",\n      \"tags\",\n      \"postedAt\",\n      \"experienceLevel\"\n    ],\n\t\"properties\": {\n        \"jobName\": {\n          \"type\": \"string\"\n        },\n\t\t\"jobType\": {\n\t\t\t\"enum\": [\"Hourly\", \"Fixed\"]\n\t\t},\n        \"price\": {\n          \"type\": \"string\"\n        },\n        \"jobDetailUrl\": {\n          \"type\": \"string\"\n        },\n        \"descriptionSnippet\": {\n          \"type\": \"string\",\n          \"description\": \"The description of the job before the 'more' link\"\n        },\n      \"country\": {\n        \"type\": \"string\"\n      },\n      \"paymentVerified\": {\n        \"type\": \"boolean\"\n      },\n      \"clientRating\": {\n        \"type\": \"number\"\n      },\n      \"amountSpent\": {\n        \"type\": \"string\"\n      },\n      \"tags\": {\n        \"type\": \"array\",\n        \"description\": \"List of categories with a link typically found below the country. Just include the tag name, not the url.\",\n        \"items\": {\n          \"type\": \"string\"\n        }\n      },\n      \"postedAt\": {\n        \"type\": \"string\"\n      },\n      \"experienceLevel\": {\n        \"enum\": [\"Entry\", \"Intermediate\", \"Expert\"]\n      }\n\t}\n}"
      },
      "typeVersion": 1.2
    }
  ],
  "pinData": {},
  "connections": {
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Filter By Score",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mark as Read": {
      "main": [
        [
          {
            "node": "Convert To Markdown",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter By Score": {
      "main": [
        [
          {
            "node": "Send Slack Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Job Data Extractor": {
      "main": [
        [
          {
            "node": "Opportunity Scorer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Opportunity Scorer": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert To Markdown": {
      "main": [
        [
          {
            "node": "Job Data Extractor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Filtered Messages": {
      "main": [
        [
          {
            "node": "Mark as Read",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Job Data Extractor",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Opportunity Scorer",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

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

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

这是一个中级难度的工作流,适用于Personal Productivity、AI Summarization等场景。适合有一定经验的用户,包含 6-15 个节点的中等复杂度工作流

需要付费吗?

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

工作流信息
难度等级
中级
节点数量14
分类2
节点类型9
难度说明

适合有一定经验的用户,包含 6-15 个节点的中等复杂度工作流

作者
James Francis

James Francis

@paperjam

👋 Hi, I'm James. I run an AI automation agency focused on building small, focused workflows that have a direct and measurable impact on business growth or optimization.

外部链接
在 n8n.io 上查看 →

分享此工作流