OpenJob 开源 AI 求职工作台:本地采集岗位、五维评分并生成定制简历
Batianxieshen1/OpenJob
OpenJob 是一个运行在本机的开源 AI 求职工作台,把岗位采集、去重、五维评分、简历定制、招呼语生成和回复监测串成一条可审阅的工作流,所有对外发送动作都需人工确认。
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
在工作台完成首次配置:
- 上传简历底稿(
.docx一页式,可上传多份对应不同求职方向) - 核对采集关键词与城市(向导中已填,可随时改)
- 启动浏览器调试模式:关闭全部 Chrome 窗口后执行
chrome --remote-debugging-port=9222
并在该浏览器中登录招聘平台 - 先以少量关键词和 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 改写有据可依、杜绝虚构。两条路径:
路径一:标准模板(新用户推荐)
- 配置页 → 下载模板(
.xlsx,只有一个「素材库」工作表) - 按列填写真实素材:
id(稳定唯一)、type、title、description(必填),其余选填 - 上传后系统自动校验并生成带哈希的本地索引
路径二:智能导入自己的 Excel(已有表格直接用)
- 配置页 →「导入自己的 Excel(智能识别)」
- 系统自动扫描:定位表头行(支持表头不在第一行)、按中文别名推测字段映射、按 Sheet 名/类别列推断素材类型
- 检查映射与预览:确认每个原始列对应的字段;低置信度映射会标注;缺标题/缺描述的行会显示真实 Excel 行号和原因
- 确认导入:二次确认后替换正式素材库(确认前不会替换;非法导入同样不会破坏旧库)
注意:
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 由四个组件构成,全部跑在本机:
- 采集器:通过 Chrome DevTools Protocol 驱动 Chrome 打开平台页面,解析岗位入库;单日页面额度硬上限保护账号
- AI 管线:岗位 JD → 五维评分 → 方向选稿 → 逐段等长改写 → 汇总校验(编造检测 / 结构校验 / 字数预算)
- 渲染器:把改写后的文字写回 Word 底稿——固定区(照片/标题/联系方式)白名单保护,正文槽位写入,不增删任何结构
- 确认队列:所有发送动作落地为队列条目,人工放行后经浏览器执行,全程按风控节奏
🧪 测试
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





