跳到正文
GitHub·· 6 天前AI 评分60

OpenJob 开源 AI 求职工作台:本地采集岗位、五维评分并生成定制简历

Batianxieshen1/OpenJob

AI 导读

OpenJob 是一个运行在本机的开源 AI 求职工作台,把岗位采集、去重、五维评分、简历定制、招呼语生成和回复监测串成一条可审阅的工作流,所有对外发送动作都需人工确认。

正文

CI Python License Release Stars

OpenJob 是运行在你自己电脑上的 AI 求职工作台。它把“找岗位、去重、评分、改简历、准备招呼语、跟进回复”串成一条可审阅的工作流;是否投递、发什么、何时发,始终由你确认。

它面向的是希望提高求职准备效率、同时保留个人判断与账号控制权的求职者。岗位数据、简历、素材库和 API Key 默认只保存在本机,不是代投服务,也不是无人值守的海投机器人。

界面一览

一段动图看完主流程——工作台 → 岗位池 → 投递确认闸门(演示数据):

主流程演示

工作台 · 绛夜主题——今日待办、投递额度、求职流程进度,打开就能读完:

工作台总览(绛夜主题,演示数据)

岗位池 · 晨刊主题——采集入库的岗位按 AI 评分排序,评分理由逐条可见;投递确认 · 人工闸门——AI 只建议,你拍板:

岗位池(晨刊主题) 投递确认 · 人工闸门
岗位池 投递确认

市场画像——每轮采集自动更新城市/薪资/学历分布与市场结论;简历定制——三步流程:底稿 → 选岗 → 按 JD 改写导出:

市场分析 简历工作台
市场分析 简历工作台

截图均为内置演示数据(公司名带 mock 标记),非真实岗位。支持明暗双主题;在线预览宣传页 →

我的求职流程被它变成了这样:

岗位自动入库 → 打分排序 → 生成定制简历和招呼语 → 我审核放行 → 发出去 → 回复有提醒

你遇到的摩擦 OpenJob 的处理方式 最终决定者
每天反复搜索、翻页、筛掉重复岗位 在专用浏览器中采集、去重、过滤并入库 你决定关键词、城市和采集时间
同一份简历难以同时匹配不同 JD 从真实底稿和 XLSX 素材库中选取证据,生成可审阅的定制版本 你决定采用、修改或放弃
高分岗位积压、投递过程容易遗漏 工作台按评分排序,所有外发前进入确认队列 你逐条确认对外发送
不想为了采集长期占用自己的电脑 工作台存活期间可在指定时点短暂执行“采集 + AI 评分” 你控制是否启用与何时暂停

新用户请先阅读 产品与使用指南。其中包含首次安装、专用 Chrome、日常工作流、定时采集、素材库、故障排查和安全边界。


它解决我的什么问题

集中找工作那段时间,我每天的时间都耗在三件事上:反复刷搜索结果、把同一份简历改来改去、挨个点"立即沟通"。这三件事全是重复劳动,但中间夹着的判断——这个岗位值不值得投、简历里该突出什么——又不能交给机器。

所以这个工具的分工是:

  • 机器做重复的:翻页采集、去重入库、逐条打分、按 JD 改简历文字、定时盯回复
  • 我做判断的:投不投、确认每一条发出的消息、决定简历最终版本
  • 机器不许碰的:任何对外发送动作。所有打招呼、发简历、回复 HR 都先进确认队列,我放行才发——代码层面不存在绕过路径

功能一览

🔍 岗位采集

  • BOSS 直聘搜索结果自动翻页采集,关键词与城市可配置;可选开启个性化推荐页采集(默认关闭,与搜索流共用去重/过滤/评分与安全额度;「最多处理候选数」限制进入详情解析的候选数,重复岗位不占用额度)
  • 推荐页采集:抓取平台推荐流,覆盖搜索漏掉的岗位
  • 定向猎捕:针对目标公司清单分批定点采集
  • 工作台运行期间可定时采集:到点后只采集并 AI 评分;错过时段、Chrome 未连接或风控锁生效都会记录跳过,绝不补跑
  • 实习/正式岗识别过滤,采集阶段即可生效

🎯 AI 评分

  • 五维评分:职责匹配 40 / 证据强度 25 / 硬性要求 15 / 工具技能 10 / 实际可行性 10
  • 弱迁移封顶:没有直接证据的技能不虚高
  • 公司黑名单与 JD 一票否决词,命中直接出局
  • 评分阶段零页面访问,纯文本分析,不占风控额度

📄 定制简历

  • 多方向底稿:上传多份 Word 底稿(如数据分析 / AI 产品 / 新媒体),按岗位方向自动选稿
  • JD 定向改写:逐行等长换写——换动词、融入岗位关键词、调整语序
  • 排版零损伤渲染:照片、栏目标题、联系方式、版式永不改动,只替换正文文字
  • 一页硬保障:逐行字数预算管控,超长自动回退,AI 腔自动清洗,输出单页 docx
  • 编造拦截:新增事实/数字/经历自动检测,不通过则生成失败

📬 确认式投递

  • 确认队列:所有打招呼/发送简历先入队,逐条放行
  • 招呼语定制:基于 JD 与简历生成,可编辑后发送
  • 三重防重复:岗位级 + 会话级 + 历史台账
  • 节奏控制:每日上限、随机间隔、发送时间窗、模拟浏览行为

📡 回复监测

  • HR 回复监听:定时检查新会话,桌面通知提醒
  • 跟进管理:跟进间隔可配置(默认关闭)

🛠️ 工程化

  • Web 工作台:岗位池 / 评分 / 简历工作台 / 投递确认 / 市场分析
  • GitHub Actions 将 Python 测试、静态检查、前端构建与关键 UI 验收作为合并门禁
  • 每日自动备份数据库与简历;明暗双主题;本地数据完全自持

🚀 快速开始

前置要求:Python 3.10+、Chrome 浏览器、一个 AI 服务 API Key(默认 DeepSeek)。Windows 用户也可以使用桌面快捷启动器。

# 1. 安装依赖
pip install -e .

# 2. 运行配置向导(生成 config.yaml,API Key 只写入本地)
python scripts/setup.py

# 3. 启动工作台
openjob web
# 浏览器打开 http://127.0.0.1:8686

在工作台完成首次配置:

  1. 上传简历底稿(.docx 一页式,可上传多份对应不同求职方向)
  2. 核对采集关键词与城市(向导中已填,可随时改)
  3. 启动浏览器调试模式:关闭全部 Chrome 窗口后执行
    chrome --remote-debugging-port=9222
    并在该浏览器中登录招聘平台
  4. 先以少量关键词和 1 页采集范围验证连接,再在工作台点击相应任务;岗位会经历采集 → 评分 → 人工审核 → 确认发送。

第一次使用不要直接大批量投递。建议先仅执行“采集 + 自动评分”,确认岗位、评分和简历素材都符合预期后,再处理确认队列。

日常使用节奏

时机 动作
定时(可配) 自动采集新岗位并评分入库
早上 打开工作台,审核高分岗位,勾选进确认队列
确认投递 逐条放行打招呼/简历发送
白天 HR 回复桌面通知提醒,去平台回复
夜间 自动备份数据

定时任务只在 OpenJob 工作台与专用 Chrome 都保持运行时生效。它到点短暂运行一轮“采集 + AI 评分”后即停止,不会自动投递、发消息、回复 HR,也不会在错过时段后补跑。


⚙️ 配置

所有配置在 config.yaml(由向导生成,工作台可视化修改)。常用项:

配置 说明
search.keywords / cities 采集关键词与城市
profile.recruitment_type campus 实习 / experienced 正式 / both
scoring.threshold 评分阈值(默认 70),低于不进候选
ai.service / api_key AI 服务商与密钥(支持环境变量 DEEPSEEK_API_KEY 等)
throttle.daily_limit 每日投递上限
throttle.send_windows 允许发送的时间窗
monitor.* HR 回复监听频率与上限
collection_schedule.* 工作台运行期间的定时采集与自动评分(不发送、不补跑)

完整字段说明见 config.example.yaml 内注释。

有关每个页面如何使用、如何启动专用 Chrome、如何查看任务进度,以及常见的“Chrome 未连接 / 采集跳过 / 配置不生效”问题,请查看 产品与使用指南。


📚 简历素材库

定制简历的内容可以引用你维护的 XLSX 素材库(经历/奖项/学生工作/项目/技能佐证),让 AI 改写有据可依、杜绝虚构。两条路径:

路径一:标准模板(新用户推荐)

  1. 配置页 → 下载模板(.xlsx,只有一个「素材库」工作表)
  2. 按列填写真实素材:id(稳定唯一)、type、title、description(必填),其余选填
  3. 上传后系统自动校验并生成带哈希的本地索引

路径二:智能导入自己的 Excel(已有表格直接用)

  1. 配置页 →「导入自己的 Excel(智能识别)」
  2. 系统自动扫描:定位表头行(支持表头不在第一行)、按中文别名推测字段映射、按 Sheet 名/类别列推断素材类型
  3. 检查映射与预览:确认每个原始列对应的字段;低置信度映射会标注;缺标题/缺描述的行会显示真实 Excel 行号和原因
  4. 确认导入:二次确认后替换正式素材库(确认前不会替换;非法导入同样不会破坏旧库)

注意:

  • title 和 description 是最终必需字段,缺失的行会被标记,需排除或补齐后导入
  • 旧版 .xls 暂不支持,请先转换为 .xlsx
  • 资料只保存在本机 data/ 目录,确认前不会替换正式库;source、notes 不发送给 AI
  • 你主动排除的行不会进入简历优化;确认后的素材会参与 JD 匹配和简历优化

平台能力边界

OpenJob 的“多平台”不等于所有平台都可以一键自动投递。每个平台的能力如下:

平台 岗位采集 AI 评分 招呼语生成 自动化发送 HR 回复监听
BOSS 直聘 支持 支持 支持 支持,且必须人工确认 支持
智联招聘 支持 支持 支持 不支持 不支持
前程无忧 支持 支持 支持 不支持 不支持

对智联招聘和前程无忧,OpenJob 只会生成可参考的招呼语文本,并提供原平台链接;实际投递需在原平台完成,再在工作台中手动标记。所有平台的任何对外发送动作都不能绕过人工确认。

🔒 安全与风控

这是本项目最重要的部分,请务必阅读。

  • 人工确认铁律:打招呼、发送简历、回复 HR,任何对外发送动作都必须人工确认。代码层面不存在绕过路径。
  • 平台风控保护:单日页面访问硬上限、风险信号随机冷却、投递冷却窗口、模拟真人浏览节奏。参数保守设置,宁可慢不可封。
  • 数据本地自持:岗位数据、简历、数据库全部存本地 data/ 目录(已在 .gitignore),不上传任何服务器。
  • 密钥安全:API Key 只写入本地 config.yaml(已被 .gitignore 排除),支持环境变量注入,接口展示一律脱敏掩码。
  • 风险告知:自动化操作招聘平台存在账号封禁风险,请自行评估并控制使用强度。详细守则见 docs/risk-guide.md。

🏗️ 项目结构

OpenJob/
├── src/openjob/
│   ├── collection/        # 平台采集(BOSS/智联/51job)与岗位模型
│   ├── ai/                # 评分、招呼语、简历引擎(JD 解析→改写→校验→渲染)
│   ├── executor/          # 投递执行与确认队列
│   ├── browser/           # CDP 浏览器自动化运行时
│   ├── web/               # 工作台服务器与前端
│   ├── db.py              # SQLite 存储层
│   └── notify.py          # 桌面通知
├── scripts/               # setup.py 配置向导、采集辅助脚本
├── tests/                 # Python 自动化测试
├── docs/                  # 风控守则等文档
├── config.example.yaml    # 配置模板(复制为 config.yaml)
└── SKILL.md / CLAUDE.md   # AI 编码助手集成说明

🧠 工作原理

OpenJob 由四个组件构成,全部跑在本机:

  1. 采集器:通过 Chrome DevTools Protocol 驱动 Chrome 打开平台页面,解析岗位入库;单日页面额度硬上限保护账号
  2. AI 管线:岗位 JD → 五维评分 → 方向选稿 → 逐段等长改写 → 汇总校验(编造检测 / 结构校验 / 字数预算)
  3. 渲染器:把改写后的文字写回 Word 底稿——固定区(照片/标题/联系方式)白名单保护,正文槽位写入,不增删任何结构
  4. 确认队列:所有发送动作落地为队列条目,人工放行后经浏览器执行,全程按风控节奏

🧪 测试

python -m pytest -q                 # 全量 Python 测试
python -m pytest tests/test_resume_engine.py -q   # 仅简历引擎
cd src/openjob/web/frontend && npm ci && npm run build  # 前端构建

❓ 常见问题

Q: 会被招聘平台封号吗? 工具内置保守的频率控制(每日上限 / 时间窗 / 随机冷却 / 人工确认),但自动化操作平台本身存在风险,请自行评估使用强度,详见风控守则。

Q: 支持哪些 AI 模型? 默认 DeepSeek,同时兼容豆包、Anthropic 与任意 OpenAI 兼容接口(ai.service / ai.base_url 可配)。

Q: 简历底稿必须用 Word 格式吗? 推荐 .docx(渲染器直接复刻其排版与样式),也支持 Markdown 与带文字层的 PDF。

Q: 我的数据会上传到云端吗? 不会。岗位、简历、数据库全部保存在本地 data/ 目录;唯一的外发请求是对 AI 服务的 API 调用。

Q: 为什么投递前必须人工确认? 这是设计而非限制:求职是高利害动作,每一条发给 HR 的消息都应该经过你的眼睛。

🗺️ Roadmap

  • 投后状态回流:已读/回复/约面状态写回岗位池
  • 回复工作台:HR 消息聚合视图与快捷回复
  • 转化漏斗分析:投递→回复→面试转化率统计,评分权重校准
  • 每晚预生成:定时为过线岗位预生成定制简历

🤝 贡献

欢迎 Issue 与 PR,见 CONTRIBUTING.md。平台选择器失效请使用 selector_broken 模板。

📄 License

MIT © OpenJob Contributors


更多作品与札记 → 蓝纸 · 造物与札记

来源:GitHub · github.com