Skip to main content
Glama
README.md
# 网申求职半自动AI助手

LLM 驱动的求职投递工具,提供 **EXE 桌面客户端**(内置浏览器 + 智能填表)与 **CLI 全自动模式** 两种使用方式:解析简历 -> 推荐公司 -> 直达官网投递渠道 -> 内置浏览器一键填表 / 全自动提交。

## 下载安装

从 [Releases](https://github.com/ldq30000-tech/auto-apply/releases/latest) 下载 `auto-apply-Setup-x.x.x.exe`(即「网申求职半自动AI助手」安装向导),双击按常规安装向导完成安装(欢迎 → 选择目录 → 安装 → 完成):

- 默认安装到用户目录(`%LocalAppData%\Programs`),**无需管理员权限**
- 自动创建开始菜单与桌面快捷方式,支持完整卸载
- 支持 Windows 10/11 64 位

## 界面预览

**首次启动** —— 选择工作模式(MCP 模式 = 外部 AI 控制、无需 API Key;API 模式 = 软件内置 AI;之后可随时在「设置」中更改):

![首次启动模式选择](docs/screenshots/00-mode-dialog.png)

**六大功能页面**:

| 简历档案 | 公司推荐 |
|:---:|:---:|
| ![简历档案页](docs/screenshots/01-resume-profile.png) | ![公司推荐页](docs/screenshots/02-recommend.png) |
| 导入 PDF/Word 用 AI 解析为结构化档案,手动编辑经历与技能 | 按专业匹配度推荐公司(国企优先),权重可在设置中调节 |

| 职位扫描 | 内置浏览器 |
|:---:|:---:|
| ![职位扫描页](docs/screenshots/03-jobs.png) | ![内置浏览器页](docs/screenshots/04-browser.png) |
| 从 ATS 职位源抓取在招职位并打分排序 | 打开官网投递页,「智能填写」一键注入简历内容 |

| 投递记录 | 设置 |
|:---:|:---:|
| ![投递记录页](docs/screenshots/05-tracker.png) | ![设置页](docs/screenshots/06-settings.png) |
| 所有申请的 SQLite 记录汇总 | 语言/工作模式/模型 API/企查查/推荐偏好统一管理 |

## 桌面客户端(推荐)

PySide6 + QtWebEngine 构建的桌面应用,六大页面:

| 页面 | 功能 |
|---|---|
| 简历档案 | 导入 **PDF / Word(.docx)** 用 AI 解析为结构化档案;手动编辑教育/实习/工作/项目经历;技能/语言/兴趣爱好/获奖为**逐项输入框**(流式排列,可增删);个人评价等全部可选 |
| 公司推荐 | 基于**专业名称匹配度**推荐公司(内置 62 家公司库,专业/技能匹配 + **国企优先**加权,权重可在设置中调节),支持按地区/企业性质(国企/民企/外企/合资)/规模筛选与关键词搜索,筛选即时更新、结果缓存秒开;「**企查查搜索**」从企查查拉取公司,每张公司卡片可**直达企查查**查看工商/规模/性质信息 |
| 职位扫描 | 从配置的 ATS 职位源抓取在招职位,AI 打分排序 |
| 内置浏览器 | 打开投递渠道(**必应搜索**:地址栏输入关键词即搜),**「智能填写」一键注入预置简历内容**:文本/下拉/单选/复选/文件上传全自动,填写后人工检查提交(接管式,避免全自动风险) |
| 投递记录 | 所有申请的 SQLite 记录汇总 |
| 设置 | **中英文切换**、工作模式(MCP / API)、模型 API(拉取模型后**下拉选择**,按厂商分组、可输入过滤)、**企查查 API**(可选)、**推荐偏好权重**(专业匹配/技能匹配/国企优先)、MCP 服务接入配置 |

### 运行

```powershell
pip install -r requirements.txt
python main_gui.py
```

### 打包 EXE / 安装包

```powershell
# 方式一:绿色版(onedir,拷贝整个文件夹分发)
pyinstaller autoapply.spec --noconfirm
# 产物: dist/网申求职半自动AI助手/网申求职半自动AI助手.exe

# 方式二:安装向导安装包(推荐分发方式)
powershell -ExecutionPolicy Bypass -File build_installer.ps1
# 产物: installer/网申求职半自动AI助手-Setup-x.x.x.exe(Inno Setup 常规安装向导)
# 需安装 Inno Setup 6 + Languages/ChineseSimplified.isl 中文语言包
```

EXE 首次运行会弹出**模式选择对话框**(MCP / API),并在同目录生成 `config.yaml`(从 config.example.yaml 复制),数据存于 `data/`。

### MCP 模式(外部 AI 控制)

软件同时是一个 **MCP server**,可被 Codex / Claude 等 AI 客户端接管(无需 API Key):

```powershell
网申求职半自动AI助手.exe --mcp    # stdio JSON-RPC,协议为 Model Context Protocol
```

提供 8 个工具:`get_profile` / `set_profile`(读写简历档案)、`recommend_companies`(规则推荐,配置 Key 后 AI 优先)、`search_companies`、`record_application` / `list_applications`(投递记录)、`open_url` / `smart_fill`(GUI 运行中实时联动内置浏览器打开网页并智能填写)。接入命令与 Codex / Claude 配置见软件「设置 → MCP 服务」页,一键复制。

### 智能填写说明

- 在任意 ATS 申请表页面(Greenhouse/Lever/Workday/通用表单)点击「⚡ 智能填写」
- 规则引擎:姓名/邮箱/电话/地点/链接/EEO 隐私选项/工作许可/薪资等标准字段直接映射
- AI 引擎(配置 API Key 后):自定义问答题由 LLM 基于简历生成
- 文件上传:点击页面上传按钮时自动附加预置的简历文件
- 填充字段带绿色描边高亮,人工检查后手动提交;「记录投递」按钮将申请写入投递记录

## CLI 模式(全自动)

```
resume.pdf ──build-profile──> profile.json
                                  │
greenhouse/lever/workday API ──> 职位列表 ──> LLM 打分排序 ──> 逐个投递
                                                                  │
                                        Playwright + LLM 表单填充引擎(含验证码人工介入、截图留档)
                                                                  │
                                              SQLite 投递记录 / 答案缓存 / 求职信缓存
```

```powershell
playwright install chromium
copy config.example.yaml config.yaml   # 填入目标公司 board token 等
$env:OPENAI_API_KEY="sk-..."           # 或 DeepSeek/通义等任意 OpenAI 兼容 key

python main.py build-profile --resume data/resume/resume.pdf
python main.py scan                    # 只看匹配结果,不投递
python main.py run --dry-run           # 填表+截图但不提交,先检查效果
python main.py run                     # review 模式:每份确认后提交
python main.py run --auto --max 5      # 全自动,本轮最多 5 份
python main.py status                  # 查看投递记录
```

## 测试

```powershell
python test_form_fill_js.py   # 表单填充引擎(JS注入,GUI核心)
python test_pipeline.py       # CLI 管道(职位抓取+Playwright填表)
```

## 配置要点(config.yaml)

| 键 | 说明 |
|---|---|
| `llm.*` | 任意 OpenAI 兼容端点(base_url/model/api_key_env) |
| `sources.greenhouse_boards` | Greenhouse board token,如 `openai`;URL 中 `boards.greenhouse.io/<token>` |
| `sources.lever_companies` | Lever 公司名,如 `stripe` |
| `sources.workday_sites` | Workday 招聘站完整 URL(实验性) |
| `search.keywords / locations` | 标题/地点粗筛 |
| `apply.min_match_score` | LLM 打分低于该值不投 |
| `apply.daily_limit` | 每日提交上限 |
| `apply.mode` | `review`(逐个确认)/ `auto` |
| `apply.documents.resume` | 上传用的简历文件路径 |

## 扩展新 ATS 适配器

在 `apply/adapters.py` 的 `ADAPTERS` 注册一个类,实现 `apply(page, orch, job)`:
导航到 `job.apply_url` 后调用 `run_application(page, orch, job, submit_selectors, success_patterns, next_selectors)` 即可复用通用填充引擎。未知站点自动走 `GenericApply`。

## 行为与合规说明

- **验证码**:不绕过。有头模式会暂停等你手动解决;无头模式直接跳过并记录。
- **限速**:每次投递之间随机等待 `delay_min/max_seconds`,并有每日上限。
- **dry-run**:正式使用前先用 `--dry-run` 检查填表质量,所有关键步骤截图存于 `outputs/screenshots/`。
- 自动化提交可能违反部分网站服务条款,请仅用于本人真实求职、控制频率,并遵守目标网站规则。
- EEO/人口统计类问题默认选择最隐私保护的选项或跳过。