1. 项目概述一个帮你自动找工作的智能助手最近在折腾一个挺有意思的项目叫 OpenClaw Job Hunter。说白了这就是一个帮你自动找工作的“数字猎头”。我自己作为开发者深知手动刷招聘网站有多耗时耗力BOSS直聘、牛客、小红书、各种技术社区……每天光是把这些平台逛一圈一两个小时就没了信息还零散容易错过机会。这个项目的核心思路很简单用自动化代替重复劳动用智能筛选代替人肉浏览。它基于 OpenClaw 这个智能体框架每天定时运行自动从多个预设的渠道比如BOSS直聘、小红书、牛客、力扣等抓取最新的招聘或内推信息。抓取到信息后它并不是一股脑地全塞给你而是会结合你提前配置好的求职偏好比如期望城市、薪资范围、技术栈和你的简历内容让 AI 对每个职位进行匹配度打分。最后所有经过筛选和打分的信息会被自动整理并推送到飞书的多维表格里你只需要在手机上打开飞书就能一目了然地看到今天有哪些新机会哪个最匹配。它最大的价值在于“解放注意力”。你不再需要被算法推荐的信息流绑架也不用担心错过某个小众论坛的内推帖。系统会按照你的指令7x24小时地、不知疲倦地帮你监控整个求职市场并把最相关的结果结构化地呈现给你。虽然项目内置的渠道主要针对中国大陆市场但它的技能Skill架构设计得非常灵活你完全可以自己添加 LinkedIn、Indeed 或者其他任何地区的招聘源定制属于你自己的求职信息流。2. 核心设计思路与架构解析2.1 为什么选择 OpenClaw 作为底层框架在决定做这个自动化工具时我评估过几种方案自己从头写爬虫调度、用现成的 RPA 工具或者基于某个 AI Agent 框架。最终选择 OpenClaw主要基于以下几点考量工具链集成度高OpenClaw 原生集成了web_search网络搜索、web_fetch抓取网页内容、browser控制真实浏览器等多种工具。这意味着我不需要自己再去处理 HTTP 请求、反爬策略、浏览器自动化驱动等底层细节可以直接在 Skill 的 Prompt 里声明“用浏览器打开这个页面”或“用搜索引擎搜这个关键词”框架会去调用合适的工具执行。这大大降低了开发复杂度。智能决策能力OpenClaw 的核心是一个 LLM 驱动的智能体。我可以告诉它“去牛客网找 Java 后端的内推帖只找今天发布的。” 它能够理解这个任务并自主决定如何导航网站、点击翻页、识别和提取帖子中的关键信息公司、岗位、要求。这种基于自然语言理解的抓取比写死 XPath 或 CSS Selector 的爬虫要灵活得多尤其对付结构经常微调的网站。可编排的工作流一个完整的求职信息处理流程包括渠道触发、内容抓取、信息清洗、去重比对、AI 匹配、结果推送。OpenClaw 的 Skill 机制天然支持将这一系列步骤编排成一个连贯的工作流。我可以在一个 Skill 定义文件里清晰地规划出“先做什么、后做什么、遇到问题怎么办”的逻辑。当然它也有学习成本你需要理解其 Skill、Tool、Agent 的概念和配置方式。但对于构建一个需要一定智能判断的自动化任务来说这个投入是值得的。2.2 多渠道采集策略的设计逻辑“多渠道”是这个项目的关键。单一平台的信息是片面的组合起来才能拼出完整的市场图景。我的策略是根据不同渠道的技术特性和内容形式选择最合适的采集方式渠道类别代表平台首选采集方式原因与策略传统招聘平台BOSS直聘web_search这类平台反爬虫机制极其严格直接请求其网站或 API 很容易被屏蔽。策略是绕过其主站通过搜索引擎如 Brave Search来搜索“site:zhipin.com Java 上海 今日”。这样获取的是公开的、被搜索引擎索引的职位信息虽然可能不是全量但稳定且合法。社交媒体/内容社区小红书、微信公众号browser这类平台大量采用客户端渲染SPA数据通过 Ajax 加载且很多内容需要登录后才能查看完整。browser工具可以启动一个真实的浏览器如 Chromium模拟用户登录、滚动、点击等行为完整地渲染出页面内容后再进行抓取是最可靠的方式。技术开发者社区牛客、力扣、V2EX、掘金browser社区帖子结构相对规整但同样存在登录态、动态加载和反爬问题。使用browser可以稳定处理翻页、展开隐藏内容等交互确保抓取到完整的帖子列表和详情。统一用浏览器也简化了代码逻辑。补充与兜底公司官网、个人博客等web_searchweb_fetch用于捕捉那些未被上述平台收录的“长尾”机会比如某个技术 leader 在自己博客发布的内推。先用web_search找到相关页面再用web_fetch快速抓取页面内容进行分析。注意使用browser工具抓取需要登录的网站时你需要在 OpenClaw 的浏览器环境中预先登录好相应账号。这通常意味着你需要以“已登录状态”启动 OpenClaw 服务或者配置其使用一个包含 cookies 的用户数据目录。这种混合策略的核心思想是在成功率、稳定性和效率之间取得平衡。对反爬强的用搜索迂回对动态内容用浏览器硬刚对静态页面用快速抓取。2.3 三层去重机制避免信息轰炸的关键如果只是简单抓取你很快就会被大量重复的、过时的职位信息淹没。我设计了三层去重过滤网确保推送给你的每一条都是“新”且“唯一”的。第一层本地 SQLite 缓存 每次运行脚本都会将抓取到的职位 URL或唯一ID存入本地的crawl_cache.db数据库。下次运行时会先查询缓存直接过滤掉历史上已经处理过的 URL。这是最快、最轻量的一层去重避免了重复抓取和计算。第二层飞书表格历史比对 有些职位可能在不同平台重复发布比如一个岗位同时在 BOSS 直聘和牛客发布。本地缓存只能防止同一 URL 重复无法跨平台去重。因此在准备向飞书写入新数据前系统会先读取飞书多维表格中已有的所有记录主要是公司名职位名组合与本次抓取的结果进行比对。如果发现疑似重复的记录则进入下一层判断。第三层AI 语义匹配去重 这是最智能的一层。对于第二层筛选出的疑似重复项系统不会武断地丢弃。它会将两条记录的文本描述如职位要求、工作内容交给 LLM 进行语义相似度判断。例如A平台发布的“高级Java开发工程师”和B平台发布的“Java技术专家”如果工作内容和要求高度重合AI 会判定为同一职位从而只保留更优或更新的那一条。这有效解决了“同一职位不同表述”导致的去重难题。这三层过滤下来最终能进入你表格的基本都是真正新增的、有价值的机会信息噪音被降到了最低。3. 详细配置与实操部署指南3.1 环境准备与 OpenClaw 基础配置首先你需要一个已经可运行的 OpenClaw 环境。假设你已经在本地或服务器上部署好了 OpenClaw Gateway。启用必要的工具确保 OpenClaw 的配置中浏览器工具和网络工具已启用。检查你的~/.openclaw/openclaw.json配置文件{ tools: { browser: { enabled: true, headless: false // 初次调试可设为 false方便观察浏览器行为 }, web: { enabled: true, fetch: {enabled: true}, search: { enabled: true, provider: brave, // 推荐使用 Brave Search braveApiKey: YOUR_BRAVE_API_KEY // 需要申请 } } } }提示Brave Search API Key 是进行web_search的关键你需要去 Brave 官网免费申请一个。它是这个项目能绕过一些平台反爬的“钥匙”。配置飞书机器人在飞书开放平台创建一个企业自建应用。为这个应用添加“多维表格”的读写权限。获取应用的App ID和App Secret用于生成访问令牌。在飞书中创建一个多维表格并记录下它的app_token和table_id。这两个值将用于告诉 Skill 往哪里写数据。3.2 技能安装与目录结构解析将项目克隆到 OpenClaw 的技能目录下# 假设你的 OpenClaw skills 目录在默认位置 git clone https://github.com/boat2moon/openclaw-job-hunter.git ~/.openclaw/skills/job-hunter让我们仔细看看这个技能包的结构这有助于你后续自定义job-hunter/ ├── SKILL.md # 核心文件定义了整个技能的触发词、工作流、工具调用逻辑和飞书写入配置。 ├── references/ │ ├── job-profile.md # 你的求职偏好配置文件。这是AI为你匹配打分的依据。 │ └── resume.md # 你的简历信息。可以放在线简历链接也可以直接粘贴文本内容。 ├── scripts/ │ └── cache_manager.py # 一个独立的Python脚本负责管理本地的SQLite缓存增删改查。 └── data/ └── crawl_cache.db # SQLite数据库文件由脚本自动生成被.gitignore忽略。SKILL.md是这个技能的大脑它是一份给 OpenClaw Agent 的“任务说明书”用自然语言和特定格式描述了整个工作流。你需要重点修改其中关于飞书配置的部分... 技能描述部分 ... - 将匹配度高于 70 分的职位信息写入飞书多维表格。 - 表格地址https://open.feishu.cn/base/YOUR_APP_TOKEN?tableYOUR_TABLE_ID ...将YOUR_APP_TOKEN和YOUR_TABLE_ID替换成你刚才记下的实际值。3.3 个性化配置让 AI 真正懂你接下来是最关键的一步告诉系统你想要什么。这主要通过修改references/目录下的两个文件实现。1. 编辑job-profile.md这个文件定义了你的求职画像。写得越具体AI 匹配越精准。# 我的求职偏好 ## 基本信息 - **目标职位**后端开发工程师、Java开发工程师、云原生工程师 - **首选城市**上海、杭州、北京远程机会也可考虑 - **工作类型**全职 ## 薪资期望 - **最低年薪**40万元人民币 - **期望范围**40-70万元人民币 ## 公司偏好 - **行业**互联网、金融科技、企业服务、云计算 - **公司规模**B轮及以上创业公司或中型以上互联网企业 - **文化倾向**技术驱动工程师文化浓厚加班有度 ## 技术栈偏好 - **核心语言**Java, Go - **熟悉框架**Spring Boot, Spring Cloud, MyBatis, Gin - **数据库**MySQL, PostgreSQL, Redis, MongoDB - **中间件/云**Kafka, RabbitMQ, Docker, Kubernetes, AWS/Aliyun - **加分项**有微服务治理、高并发系统、数据库优化经验者优先 ## 其他要求 - 希望团队有较好的技术分享氛围。 - 不接受大小周。2. 编辑resume.md这里提供你的简历作为 AI 匹配的另一个核心依据。有两种方式方式一推荐上传你的简历到某个可公开访问的链接如 GitHub Gist、个人网站然后在这里只放 URL。例如https://gist.githubusercontent.com/yourname/xxx/raw/resume.md方式二直接将简历全文粘贴进来。注意保持格式清晰包含你的技能、项目经验、工作经历等。实操心得在job-profile.md中尽量使用关键词并区分“必需”和“优先”。AI 会根据这些关键词与职位描述的重合度、以及你的排斥项如“不接受大小周”进行打分。简历内容则提供了更丰富的背景信息帮助 AI 判断你的经验与岗位的匹配深度。3.4 首次运行与调试完成配置后重启你的 OpenClaw Gateway 服务让新技能生效。触发技能在 OpenClaw 的对话界面中输入触发指令例如 帮我找一下最新的Java后端岗位或者使用项目中定义好的斜杠命令 /job-hunter观察执行过程首次运行时建议将浏览器配置为headless: false这样你可以亲眼看到 OpenClaw 如何自动打开浏览器、登录网站如果你已提前登录、搜索、翻页、抓取信息。这是一个非常直观的调试过程。检查结果执行完毕后打开你的飞书多维表格。你应该能看到自动创建好的表头如“公司”、“职位”、“匹配度”、“来源”、“链接”等以及第一批抓取到的、经过打分的职位信息。4. 核心工作流程与 AI 匹配打分机制详解4.1 从触发到推送的完整流程链当你在 OpenClaw 中输入指令后整个系统就像被按下了启动按钮开始执行一个精密编排的流水线作业指令解析与技能加载OpenClaw 的 Gateway 接收到你的自然语言指令识别出这与job-hunter技能匹配于是加载并执行SKILL.md中定义的工作流。上下文准备系统会读取references/job-profile.md和resume.md的内容将它们作为本次任务执行的“背景知识”或“约束条件”注入到 AI 的上下文中。多渠道并行/串行抓取根据SKILL.md中定义的渠道列表AI 会规划执行顺序。对于独立的渠道如 BOSS直聘 和 牛客它可以并行发起抓取任务以提高效率。对于每个渠道决策AI 根据渠道名称决定使用web_search、browser还是web_fetch。执行调用相应的工具执行具体操作。例如对于“牛客”它会命令browser工具“打开牛客网求职板块搜索‘Java 后端 内推’筛选发布时间为今天的帖子提取前20条帖子的标题、公司、链接和主要内容。”解析工具返回原始的 HTML 或页面文本AI 需要从中识别并结构化地提取出职位信息公司、职位、薪资、要求、链接等。这一步非常依赖 LLM 的文本理解能力。数据清洗与归一化不同渠道抓取的数据格式五花八门。AI 需要将所有信息清洗并映射到一个统一的数据模型中例如{ company: 某某科技有限公司, title: 高级Java开发工程师, salary: 30-60K·16薪, location: 上海·浦东, description: 职位描述文本..., requirement: 任职要求文本..., url: https://example.com/job/123, source: boss_zhipin, publish_date: 2023-10-27 }三层去重过滤如上节所述经过本地缓存、飞书历史、AI语义三层去重剔除重复条目。AI 匹配度打分这是核心智能环节。对于每一个去重后的职位系统会构造一个这样的 Prompt 给 LLM“请根据以下求职者偏好和简历评估该职位的匹配度0-100分。 求职者偏好[此处插入 job-profile.md 内容] 求职者简历[此处插入 resume.md 内容摘要] 职位信息[此处插入清洗后的职位信息] 请从技术栈匹配度、经验要求符合度、薪资范围符合度、公司文化匹配度、地点匹配度等维度综合考虑给出分数和简要理由。”LLM 会基于你的个性化资料为每个职位生成一个匹配分和评语。结果推送至飞书最后系统将匹配度高于设定阈值例如70分的职位按照飞书多维表格的 API 格式组装数据批量写入到你指定的表格中。每条记录包含公司、职位、匹配度、评语、来源链接等字段。4.2 匹配打分模型的调优心得默认的匹配逻辑可能不完全符合你的个人标准。你可以通过修改SKILL.md中给 AI 的评分指令来进行调优。以下是一些经验权重调整如果你特别看重技术栈可以在指令中强调“技术栈匹配度权重占50%如果职位要求的技术栈与我的技能高度重合即使地点稍有不符也应给予较高分数。”一票否决可以加入硬性条件“如果职位描述中包含‘大小周’或‘996’则直接匹配度为0分不予推荐。”薪资解析薪资字段往往是“20-40K·15薪”这样的文本。你需要指示 AI 如何解析和比较。例如“将薪资文本换算为预估年薪范围并与我的期望年薪40-70万进行比较。若其上限低于我的下限扣分若其范围与我的期望有重叠加分。”模糊匹配对于技术栈指示 AI 进行同义词和关联词识别。例如职位要求“微服务架构经验”而你的简历写的是“Spring Cloud 项目经验”这应该被视为强相关。注意事项匹配打分非常消耗 LLM 的 Token尤其是当一次性抓取到几十个职位时。这可能会导致 API 调用成本升高或速度变慢。一个优化策略是设置一个初步筛选门槛例如先用一些简单规则如城市完全匹配、包含核心关键词过滤掉明显不相关的职位只对剩下的候选职位进行详细的 AI 打分。5. 高级自定义与扩展玩法5.1 如何添加一个新的招聘渠道假设你想增加“电鸭社区”这个远程工作平台作为新的渠道。分析渠道特性电鸭社区是一个网页论坛内容静态无需登录即可浏览大部分帖子。因此使用web_fetch直接抓取页面可能是最高效的。修改SKILL.md在技能定义文件的渠道列表部分添加一个新的渠道条目。你需要告诉 AI渠道名称dianya采集目标抓取电鸭社区“远程工作”板块下标题包含“后端”、“Java”、“Go”等关键词的今日新帖。采集方式web_fetchURL 模式/搜索词https://eleduck.com/categories/5?sortnewest这是电鸭远程工作板块按最新排序的链接信息提取规则从列表页抓取帖子标题、链接、发布时间然后进入详情页抓取职位描述、联系方式和薪资如果公开。你需要用清晰的指令描述这个流程例如“使用web_fetch获取上述URL的页面内容解析出帖子列表。对于每个帖子提取标题、链接和发布时间。如果发布时间是今天则进一步抓取帖子详情页提取正文内容作为职位描述。”测试与调试添加后手动触发一次技能观察 AI 是否能正确理解你的指令并抓取到电鸭社区的数据。可能需要根据实际的网页结构微调你的指令。5.2 调整推送策略与表格样式默认的推送策略是“每日定时运行匹配度70的写入飞书”。你可以根据自己需求调整变更推送频率修改 OpenClaw 的 cron 定时任务配置可以改为每12小时一次或每周一上午运行。变更推送阈值在SKILL.md中修改匹配度过滤条件比如只推送85分的顶级匹配职位或者放宽到60分以看到更多机会。丰富飞书表格自动添加标签根据分数区间让 AI 在推送时自动添加“优先考虑”、“一般匹配”、“保持关注”等标签。添加操作列可以在表格中增加一列“状态”你手动标记为“已投递”、“已沟通”、“已拒绝”等方便跟踪求职进度。关联日历利用飞书多维表格的“关联”功能将高匹配度的职位自动创建一个面试提醒事件到飞书日历中。5.3 处理网络环境问题Clash TUN 模式如果你在运行 OpenClaw 的机器上使用了 Clash Verge 等工具的 TUN增强模式可能会遇到一个特定问题web_fetch工具无法访问某些地址因为它被 OpenClaw 的 SSRF服务器端请求伪造保护策略拦截了该策略默认会拦截 RFC 2544 测试地址段198.18.0.0/15而 TUN 模式有时会用到这个段。解决方案在 OpenClaw 的配置文件openclaw.json中显式允许这个地址段。{ tools: { web: { fetch: { ssrfPolicy: { allowRfc2544BenchmarkRange: true } } } } }修改后重启 OpenClaw Gateway 即可。这是一个比较底层的网络配置问题只有特定环境下才会遇到但一旦遇到就会导致抓取失败知道这个解决方案能省去很多排查时间。6. 常见问题与故障排查实录在实际部署和运行过程中你可能会遇到以下问题。这里记录了我的排查经验和解决方案。问题现象可能原因排查步骤与解决方案技能触发无反应1. 技能未正确安装或加载。2. OpenClaw Gateway 未重启。1. 检查~/.openclaw/skills/目录下是否存在job-hunter文件夹且结构完整。2. 检查openclaw.json中skills.load.extraDirs配置是否正确如果用了自定义目录。3.重启 OpenClaw Gateway 服务这是加载新技能的必要步骤。浏览器工具启动失败1. 系统中未安装 Chromium/Chrome。2. 浏览器驱动版本不匹配。1. 确保系统已安装 Chrome/Chromium。在终端输入which chromium或which google-chrome检查。2. OpenClaw 的browser工具通常依赖 Playwright。尝试在 OpenClaw 环境内运行npx playwright install chromium来安装所需的浏览器和驱动。抓取结果为空或很少1. 搜索关键词太窄或渠道策略失效。2. 网站反爬导致web_fetch或browser拿不到数据。3. 需要登录的网站未提前登录。1. 检查job-profile.md中的“目标职位”关键词是否合适。尝试更宽泛或更具体的关键词。2. 对于web_search渠道检查 Brave Search API Key 是否配置正确且额度充足。3. 对于browser渠道手动用该浏览器环境打开目标网站确认是否处于已登录状态。这是最常见的原因。4. 临时将浏览器设为非无头模式 (headless: false)观察抓取过程看是否被验证码拦截或页面结构已变。AI 匹配打分全部很低或不准1.job-profile.md或resume.md配置过于模糊或与职位市场脱节。2. LLM 的评分指令理解有偏差。1.细化你的个人资料。将“熟悉 Java”改为“有3年 Spring Boot 微服务项目经验熟悉 JVM 调优”。2.调整评分 Prompt。在SKILL.md中更清晰地定义打分维度、权重和一票否决项。例如“地点匹配占30分技术栈匹配占50分薪资符合度占20分。”3. 检查 LLM 返回的评分理由看它基于什么做出了判断据此反向优化你的资料和指令。飞书表格写入失败1. App Token 或 Table ID 错误。2. 飞书应用权限不足。3. 网络问题。1. 仔细核对SKILL.md中的YOUR_APP_TOKEN和YOUR_TABLE_ID是否替换正确且没有多余的空格或换行。2. 登录飞书开放平台检查应用是否添加了“多维表格”的读写权限并确认已发布最新版本。3. 尝试在命令行用curl命令模拟飞书 API 调用看是否能成功以排除 OpenClaw 环境外的网络问题。运行速度非常慢1.browser工具抓取多个页面是串行且耗时的。2. 抓取的职位数量太多导致 AI 打分步骤耗时剧增。1.接受合理的慢。模拟真人浏览器操作本身就需要时间这是用browser工具换取稳定性的代价。可以考虑减少browser渠道的翻页数或并发数如果支持。2.优化抓取范围。在渠道策略中更精确地限定搜索条件如“今日发布”、“前3页”减少无效抓取。3.设置预过滤。在进入耗时的 AI 打分前先用简单的规则如城市、关键词过滤掉一批明显不匹配的职位。这个项目本质上是一个高度可定制的信息聚合与过滤管道。它的效果很大程度上取决于你的配置精度和渠道策略的有效性。初期可能需要花一两天时间调试和磨合但一旦跑顺它就能成为一个为你持续工作的、不知疲倦的求职信息助理显著提升你获取机会的效率和广度。
基于OpenClaw框架的智能求职信息聚合与AI匹配系统实践
发布时间:2026/7/10 8:56:28
1. 项目概述一个帮你自动找工作的智能助手最近在折腾一个挺有意思的项目叫 OpenClaw Job Hunter。说白了这就是一个帮你自动找工作的“数字猎头”。我自己作为开发者深知手动刷招聘网站有多耗时耗力BOSS直聘、牛客、小红书、各种技术社区……每天光是把这些平台逛一圈一两个小时就没了信息还零散容易错过机会。这个项目的核心思路很简单用自动化代替重复劳动用智能筛选代替人肉浏览。它基于 OpenClaw 这个智能体框架每天定时运行自动从多个预设的渠道比如BOSS直聘、小红书、牛客、力扣等抓取最新的招聘或内推信息。抓取到信息后它并不是一股脑地全塞给你而是会结合你提前配置好的求职偏好比如期望城市、薪资范围、技术栈和你的简历内容让 AI 对每个职位进行匹配度打分。最后所有经过筛选和打分的信息会被自动整理并推送到飞书的多维表格里你只需要在手机上打开飞书就能一目了然地看到今天有哪些新机会哪个最匹配。它最大的价值在于“解放注意力”。你不再需要被算法推荐的信息流绑架也不用担心错过某个小众论坛的内推帖。系统会按照你的指令7x24小时地、不知疲倦地帮你监控整个求职市场并把最相关的结果结构化地呈现给你。虽然项目内置的渠道主要针对中国大陆市场但它的技能Skill架构设计得非常灵活你完全可以自己添加 LinkedIn、Indeed 或者其他任何地区的招聘源定制属于你自己的求职信息流。2. 核心设计思路与架构解析2.1 为什么选择 OpenClaw 作为底层框架在决定做这个自动化工具时我评估过几种方案自己从头写爬虫调度、用现成的 RPA 工具或者基于某个 AI Agent 框架。最终选择 OpenClaw主要基于以下几点考量工具链集成度高OpenClaw 原生集成了web_search网络搜索、web_fetch抓取网页内容、browser控制真实浏览器等多种工具。这意味着我不需要自己再去处理 HTTP 请求、反爬策略、浏览器自动化驱动等底层细节可以直接在 Skill 的 Prompt 里声明“用浏览器打开这个页面”或“用搜索引擎搜这个关键词”框架会去调用合适的工具执行。这大大降低了开发复杂度。智能决策能力OpenClaw 的核心是一个 LLM 驱动的智能体。我可以告诉它“去牛客网找 Java 后端的内推帖只找今天发布的。” 它能够理解这个任务并自主决定如何导航网站、点击翻页、识别和提取帖子中的关键信息公司、岗位、要求。这种基于自然语言理解的抓取比写死 XPath 或 CSS Selector 的爬虫要灵活得多尤其对付结构经常微调的网站。可编排的工作流一个完整的求职信息处理流程包括渠道触发、内容抓取、信息清洗、去重比对、AI 匹配、结果推送。OpenClaw 的 Skill 机制天然支持将这一系列步骤编排成一个连贯的工作流。我可以在一个 Skill 定义文件里清晰地规划出“先做什么、后做什么、遇到问题怎么办”的逻辑。当然它也有学习成本你需要理解其 Skill、Tool、Agent 的概念和配置方式。但对于构建一个需要一定智能判断的自动化任务来说这个投入是值得的。2.2 多渠道采集策略的设计逻辑“多渠道”是这个项目的关键。单一平台的信息是片面的组合起来才能拼出完整的市场图景。我的策略是根据不同渠道的技术特性和内容形式选择最合适的采集方式渠道类别代表平台首选采集方式原因与策略传统招聘平台BOSS直聘web_search这类平台反爬虫机制极其严格直接请求其网站或 API 很容易被屏蔽。策略是绕过其主站通过搜索引擎如 Brave Search来搜索“site:zhipin.com Java 上海 今日”。这样获取的是公开的、被搜索引擎索引的职位信息虽然可能不是全量但稳定且合法。社交媒体/内容社区小红书、微信公众号browser这类平台大量采用客户端渲染SPA数据通过 Ajax 加载且很多内容需要登录后才能查看完整。browser工具可以启动一个真实的浏览器如 Chromium模拟用户登录、滚动、点击等行为完整地渲染出页面内容后再进行抓取是最可靠的方式。技术开发者社区牛客、力扣、V2EX、掘金browser社区帖子结构相对规整但同样存在登录态、动态加载和反爬问题。使用browser可以稳定处理翻页、展开隐藏内容等交互确保抓取到完整的帖子列表和详情。统一用浏览器也简化了代码逻辑。补充与兜底公司官网、个人博客等web_searchweb_fetch用于捕捉那些未被上述平台收录的“长尾”机会比如某个技术 leader 在自己博客发布的内推。先用web_search找到相关页面再用web_fetch快速抓取页面内容进行分析。注意使用browser工具抓取需要登录的网站时你需要在 OpenClaw 的浏览器环境中预先登录好相应账号。这通常意味着你需要以“已登录状态”启动 OpenClaw 服务或者配置其使用一个包含 cookies 的用户数据目录。这种混合策略的核心思想是在成功率、稳定性和效率之间取得平衡。对反爬强的用搜索迂回对动态内容用浏览器硬刚对静态页面用快速抓取。2.3 三层去重机制避免信息轰炸的关键如果只是简单抓取你很快就会被大量重复的、过时的职位信息淹没。我设计了三层去重过滤网确保推送给你的每一条都是“新”且“唯一”的。第一层本地 SQLite 缓存 每次运行脚本都会将抓取到的职位 URL或唯一ID存入本地的crawl_cache.db数据库。下次运行时会先查询缓存直接过滤掉历史上已经处理过的 URL。这是最快、最轻量的一层去重避免了重复抓取和计算。第二层飞书表格历史比对 有些职位可能在不同平台重复发布比如一个岗位同时在 BOSS 直聘和牛客发布。本地缓存只能防止同一 URL 重复无法跨平台去重。因此在准备向飞书写入新数据前系统会先读取飞书多维表格中已有的所有记录主要是公司名职位名组合与本次抓取的结果进行比对。如果发现疑似重复的记录则进入下一层判断。第三层AI 语义匹配去重 这是最智能的一层。对于第二层筛选出的疑似重复项系统不会武断地丢弃。它会将两条记录的文本描述如职位要求、工作内容交给 LLM 进行语义相似度判断。例如A平台发布的“高级Java开发工程师”和B平台发布的“Java技术专家”如果工作内容和要求高度重合AI 会判定为同一职位从而只保留更优或更新的那一条。这有效解决了“同一职位不同表述”导致的去重难题。这三层过滤下来最终能进入你表格的基本都是真正新增的、有价值的机会信息噪音被降到了最低。3. 详细配置与实操部署指南3.1 环境准备与 OpenClaw 基础配置首先你需要一个已经可运行的 OpenClaw 环境。假设你已经在本地或服务器上部署好了 OpenClaw Gateway。启用必要的工具确保 OpenClaw 的配置中浏览器工具和网络工具已启用。检查你的~/.openclaw/openclaw.json配置文件{ tools: { browser: { enabled: true, headless: false // 初次调试可设为 false方便观察浏览器行为 }, web: { enabled: true, fetch: {enabled: true}, search: { enabled: true, provider: brave, // 推荐使用 Brave Search braveApiKey: YOUR_BRAVE_API_KEY // 需要申请 } } } }提示Brave Search API Key 是进行web_search的关键你需要去 Brave 官网免费申请一个。它是这个项目能绕过一些平台反爬的“钥匙”。配置飞书机器人在飞书开放平台创建一个企业自建应用。为这个应用添加“多维表格”的读写权限。获取应用的App ID和App Secret用于生成访问令牌。在飞书中创建一个多维表格并记录下它的app_token和table_id。这两个值将用于告诉 Skill 往哪里写数据。3.2 技能安装与目录结构解析将项目克隆到 OpenClaw 的技能目录下# 假设你的 OpenClaw skills 目录在默认位置 git clone https://github.com/boat2moon/openclaw-job-hunter.git ~/.openclaw/skills/job-hunter让我们仔细看看这个技能包的结构这有助于你后续自定义job-hunter/ ├── SKILL.md # 核心文件定义了整个技能的触发词、工作流、工具调用逻辑和飞书写入配置。 ├── references/ │ ├── job-profile.md # 你的求职偏好配置文件。这是AI为你匹配打分的依据。 │ └── resume.md # 你的简历信息。可以放在线简历链接也可以直接粘贴文本内容。 ├── scripts/ │ └── cache_manager.py # 一个独立的Python脚本负责管理本地的SQLite缓存增删改查。 └── data/ └── crawl_cache.db # SQLite数据库文件由脚本自动生成被.gitignore忽略。SKILL.md是这个技能的大脑它是一份给 OpenClaw Agent 的“任务说明书”用自然语言和特定格式描述了整个工作流。你需要重点修改其中关于飞书配置的部分... 技能描述部分 ... - 将匹配度高于 70 分的职位信息写入飞书多维表格。 - 表格地址https://open.feishu.cn/base/YOUR_APP_TOKEN?tableYOUR_TABLE_ID ...将YOUR_APP_TOKEN和YOUR_TABLE_ID替换成你刚才记下的实际值。3.3 个性化配置让 AI 真正懂你接下来是最关键的一步告诉系统你想要什么。这主要通过修改references/目录下的两个文件实现。1. 编辑job-profile.md这个文件定义了你的求职画像。写得越具体AI 匹配越精准。# 我的求职偏好 ## 基本信息 - **目标职位**后端开发工程师、Java开发工程师、云原生工程师 - **首选城市**上海、杭州、北京远程机会也可考虑 - **工作类型**全职 ## 薪资期望 - **最低年薪**40万元人民币 - **期望范围**40-70万元人民币 ## 公司偏好 - **行业**互联网、金融科技、企业服务、云计算 - **公司规模**B轮及以上创业公司或中型以上互联网企业 - **文化倾向**技术驱动工程师文化浓厚加班有度 ## 技术栈偏好 - **核心语言**Java, Go - **熟悉框架**Spring Boot, Spring Cloud, MyBatis, Gin - **数据库**MySQL, PostgreSQL, Redis, MongoDB - **中间件/云**Kafka, RabbitMQ, Docker, Kubernetes, AWS/Aliyun - **加分项**有微服务治理、高并发系统、数据库优化经验者优先 ## 其他要求 - 希望团队有较好的技术分享氛围。 - 不接受大小周。2. 编辑resume.md这里提供你的简历作为 AI 匹配的另一个核心依据。有两种方式方式一推荐上传你的简历到某个可公开访问的链接如 GitHub Gist、个人网站然后在这里只放 URL。例如https://gist.githubusercontent.com/yourname/xxx/raw/resume.md方式二直接将简历全文粘贴进来。注意保持格式清晰包含你的技能、项目经验、工作经历等。实操心得在job-profile.md中尽量使用关键词并区分“必需”和“优先”。AI 会根据这些关键词与职位描述的重合度、以及你的排斥项如“不接受大小周”进行打分。简历内容则提供了更丰富的背景信息帮助 AI 判断你的经验与岗位的匹配深度。3.4 首次运行与调试完成配置后重启你的 OpenClaw Gateway 服务让新技能生效。触发技能在 OpenClaw 的对话界面中输入触发指令例如 帮我找一下最新的Java后端岗位或者使用项目中定义好的斜杠命令 /job-hunter观察执行过程首次运行时建议将浏览器配置为headless: false这样你可以亲眼看到 OpenClaw 如何自动打开浏览器、登录网站如果你已提前登录、搜索、翻页、抓取信息。这是一个非常直观的调试过程。检查结果执行完毕后打开你的飞书多维表格。你应该能看到自动创建好的表头如“公司”、“职位”、“匹配度”、“来源”、“链接”等以及第一批抓取到的、经过打分的职位信息。4. 核心工作流程与 AI 匹配打分机制详解4.1 从触发到推送的完整流程链当你在 OpenClaw 中输入指令后整个系统就像被按下了启动按钮开始执行一个精密编排的流水线作业指令解析与技能加载OpenClaw 的 Gateway 接收到你的自然语言指令识别出这与job-hunter技能匹配于是加载并执行SKILL.md中定义的工作流。上下文准备系统会读取references/job-profile.md和resume.md的内容将它们作为本次任务执行的“背景知识”或“约束条件”注入到 AI 的上下文中。多渠道并行/串行抓取根据SKILL.md中定义的渠道列表AI 会规划执行顺序。对于独立的渠道如 BOSS直聘 和 牛客它可以并行发起抓取任务以提高效率。对于每个渠道决策AI 根据渠道名称决定使用web_search、browser还是web_fetch。执行调用相应的工具执行具体操作。例如对于“牛客”它会命令browser工具“打开牛客网求职板块搜索‘Java 后端 内推’筛选发布时间为今天的帖子提取前20条帖子的标题、公司、链接和主要内容。”解析工具返回原始的 HTML 或页面文本AI 需要从中识别并结构化地提取出职位信息公司、职位、薪资、要求、链接等。这一步非常依赖 LLM 的文本理解能力。数据清洗与归一化不同渠道抓取的数据格式五花八门。AI 需要将所有信息清洗并映射到一个统一的数据模型中例如{ company: 某某科技有限公司, title: 高级Java开发工程师, salary: 30-60K·16薪, location: 上海·浦东, description: 职位描述文本..., requirement: 任职要求文本..., url: https://example.com/job/123, source: boss_zhipin, publish_date: 2023-10-27 }三层去重过滤如上节所述经过本地缓存、飞书历史、AI语义三层去重剔除重复条目。AI 匹配度打分这是核心智能环节。对于每一个去重后的职位系统会构造一个这样的 Prompt 给 LLM“请根据以下求职者偏好和简历评估该职位的匹配度0-100分。 求职者偏好[此处插入 job-profile.md 内容] 求职者简历[此处插入 resume.md 内容摘要] 职位信息[此处插入清洗后的职位信息] 请从技术栈匹配度、经验要求符合度、薪资范围符合度、公司文化匹配度、地点匹配度等维度综合考虑给出分数和简要理由。”LLM 会基于你的个性化资料为每个职位生成一个匹配分和评语。结果推送至飞书最后系统将匹配度高于设定阈值例如70分的职位按照飞书多维表格的 API 格式组装数据批量写入到你指定的表格中。每条记录包含公司、职位、匹配度、评语、来源链接等字段。4.2 匹配打分模型的调优心得默认的匹配逻辑可能不完全符合你的个人标准。你可以通过修改SKILL.md中给 AI 的评分指令来进行调优。以下是一些经验权重调整如果你特别看重技术栈可以在指令中强调“技术栈匹配度权重占50%如果职位要求的技术栈与我的技能高度重合即使地点稍有不符也应给予较高分数。”一票否决可以加入硬性条件“如果职位描述中包含‘大小周’或‘996’则直接匹配度为0分不予推荐。”薪资解析薪资字段往往是“20-40K·15薪”这样的文本。你需要指示 AI 如何解析和比较。例如“将薪资文本换算为预估年薪范围并与我的期望年薪40-70万进行比较。若其上限低于我的下限扣分若其范围与我的期望有重叠加分。”模糊匹配对于技术栈指示 AI 进行同义词和关联词识别。例如职位要求“微服务架构经验”而你的简历写的是“Spring Cloud 项目经验”这应该被视为强相关。注意事项匹配打分非常消耗 LLM 的 Token尤其是当一次性抓取到几十个职位时。这可能会导致 API 调用成本升高或速度变慢。一个优化策略是设置一个初步筛选门槛例如先用一些简单规则如城市完全匹配、包含核心关键词过滤掉明显不相关的职位只对剩下的候选职位进行详细的 AI 打分。5. 高级自定义与扩展玩法5.1 如何添加一个新的招聘渠道假设你想增加“电鸭社区”这个远程工作平台作为新的渠道。分析渠道特性电鸭社区是一个网页论坛内容静态无需登录即可浏览大部分帖子。因此使用web_fetch直接抓取页面可能是最高效的。修改SKILL.md在技能定义文件的渠道列表部分添加一个新的渠道条目。你需要告诉 AI渠道名称dianya采集目标抓取电鸭社区“远程工作”板块下标题包含“后端”、“Java”、“Go”等关键词的今日新帖。采集方式web_fetchURL 模式/搜索词https://eleduck.com/categories/5?sortnewest这是电鸭远程工作板块按最新排序的链接信息提取规则从列表页抓取帖子标题、链接、发布时间然后进入详情页抓取职位描述、联系方式和薪资如果公开。你需要用清晰的指令描述这个流程例如“使用web_fetch获取上述URL的页面内容解析出帖子列表。对于每个帖子提取标题、链接和发布时间。如果发布时间是今天则进一步抓取帖子详情页提取正文内容作为职位描述。”测试与调试添加后手动触发一次技能观察 AI 是否能正确理解你的指令并抓取到电鸭社区的数据。可能需要根据实际的网页结构微调你的指令。5.2 调整推送策略与表格样式默认的推送策略是“每日定时运行匹配度70的写入飞书”。你可以根据自己需求调整变更推送频率修改 OpenClaw 的 cron 定时任务配置可以改为每12小时一次或每周一上午运行。变更推送阈值在SKILL.md中修改匹配度过滤条件比如只推送85分的顶级匹配职位或者放宽到60分以看到更多机会。丰富飞书表格自动添加标签根据分数区间让 AI 在推送时自动添加“优先考虑”、“一般匹配”、“保持关注”等标签。添加操作列可以在表格中增加一列“状态”你手动标记为“已投递”、“已沟通”、“已拒绝”等方便跟踪求职进度。关联日历利用飞书多维表格的“关联”功能将高匹配度的职位自动创建一个面试提醒事件到飞书日历中。5.3 处理网络环境问题Clash TUN 模式如果你在运行 OpenClaw 的机器上使用了 Clash Verge 等工具的 TUN增强模式可能会遇到一个特定问题web_fetch工具无法访问某些地址因为它被 OpenClaw 的 SSRF服务器端请求伪造保护策略拦截了该策略默认会拦截 RFC 2544 测试地址段198.18.0.0/15而 TUN 模式有时会用到这个段。解决方案在 OpenClaw 的配置文件openclaw.json中显式允许这个地址段。{ tools: { web: { fetch: { ssrfPolicy: { allowRfc2544BenchmarkRange: true } } } } }修改后重启 OpenClaw Gateway 即可。这是一个比较底层的网络配置问题只有特定环境下才会遇到但一旦遇到就会导致抓取失败知道这个解决方案能省去很多排查时间。6. 常见问题与故障排查实录在实际部署和运行过程中你可能会遇到以下问题。这里记录了我的排查经验和解决方案。问题现象可能原因排查步骤与解决方案技能触发无反应1. 技能未正确安装或加载。2. OpenClaw Gateway 未重启。1. 检查~/.openclaw/skills/目录下是否存在job-hunter文件夹且结构完整。2. 检查openclaw.json中skills.load.extraDirs配置是否正确如果用了自定义目录。3.重启 OpenClaw Gateway 服务这是加载新技能的必要步骤。浏览器工具启动失败1. 系统中未安装 Chromium/Chrome。2. 浏览器驱动版本不匹配。1. 确保系统已安装 Chrome/Chromium。在终端输入which chromium或which google-chrome检查。2. OpenClaw 的browser工具通常依赖 Playwright。尝试在 OpenClaw 环境内运行npx playwright install chromium来安装所需的浏览器和驱动。抓取结果为空或很少1. 搜索关键词太窄或渠道策略失效。2. 网站反爬导致web_fetch或browser拿不到数据。3. 需要登录的网站未提前登录。1. 检查job-profile.md中的“目标职位”关键词是否合适。尝试更宽泛或更具体的关键词。2. 对于web_search渠道检查 Brave Search API Key 是否配置正确且额度充足。3. 对于browser渠道手动用该浏览器环境打开目标网站确认是否处于已登录状态。这是最常见的原因。4. 临时将浏览器设为非无头模式 (headless: false)观察抓取过程看是否被验证码拦截或页面结构已变。AI 匹配打分全部很低或不准1.job-profile.md或resume.md配置过于模糊或与职位市场脱节。2. LLM 的评分指令理解有偏差。1.细化你的个人资料。将“熟悉 Java”改为“有3年 Spring Boot 微服务项目经验熟悉 JVM 调优”。2.调整评分 Prompt。在SKILL.md中更清晰地定义打分维度、权重和一票否决项。例如“地点匹配占30分技术栈匹配占50分薪资符合度占20分。”3. 检查 LLM 返回的评分理由看它基于什么做出了判断据此反向优化你的资料和指令。飞书表格写入失败1. App Token 或 Table ID 错误。2. 飞书应用权限不足。3. 网络问题。1. 仔细核对SKILL.md中的YOUR_APP_TOKEN和YOUR_TABLE_ID是否替换正确且没有多余的空格或换行。2. 登录飞书开放平台检查应用是否添加了“多维表格”的读写权限并确认已发布最新版本。3. 尝试在命令行用curl命令模拟飞书 API 调用看是否能成功以排除 OpenClaw 环境外的网络问题。运行速度非常慢1.browser工具抓取多个页面是串行且耗时的。2. 抓取的职位数量太多导致 AI 打分步骤耗时剧增。1.接受合理的慢。模拟真人浏览器操作本身就需要时间这是用browser工具换取稳定性的代价。可以考虑减少browser渠道的翻页数或并发数如果支持。2.优化抓取范围。在渠道策略中更精确地限定搜索条件如“今日发布”、“前3页”减少无效抓取。3.设置预过滤。在进入耗时的 AI 打分前先用简单的规则如城市、关键词过滤掉一批明显不匹配的职位。这个项目本质上是一个高度可定制的信息聚合与过滤管道。它的效果很大程度上取决于你的配置精度和渠道策略的有效性。初期可能需要花一两天时间调试和磨合但一旦跑顺它就能成为一个为你持续工作的、不知疲倦的求职信息助理显著提升你获取机会的效率和广度。