Chrome / Edge Manifest V3 扩展。在 BOSS 直聘职位页注入悬浮面板,读取左侧职位列表、按条件筛选、自动打招呼,并可选接入大模型自动回复聊天。
无构建流程,克隆后直接「加载已解压的扩展程序」即可使用。
筛选
- 主面板:职位关键词、工作地点、薪资、关键词模式(任一命中 / 全部命中)、排除职位词、每日上限
- 高级设置:公司包含、排除公司、招聘者活跃状态
- 关键词语法:
后端, Java, +Go, -实习- 逗号(中英文)、顿号、换行均可分隔
+词表示必须命中,-词表示排除- 3 个字符以内的英文按词边界匹配,
Go不会命中Google
- 地点带别名表,填
浦东能命中上海·浦东新区,填远程能命中「居家办公」等写法 - 薪资按区间重叠判断,
20-35K能命中15-25K;岗位写「面议」时不会被数字条件命中 - 四个一键预设:后端 / 前端 / 全栈 / 产品
运行
- 点「开始沟通」后先自动滚到列表底部读完懒加载列表,再开始逐个匹配
- 暂停后可从当前进度「继续沟通」,已处理过的职位不会重复;「结束本轮」才会清空本轮统计和跳过列表
- 进度条实时显示本轮完成度,预加载阶段显示为流动状态
- 匹配职位列表可直接点击定位,当前正在沟通的一条会高亮,支持「仅沟通此项」和「跳过」
- 每日上限 + 当日计数,跨天自动归零
- 检测到「无法进行沟通 / 今日已与 150 位 BOSS 沟通」弹窗时自动暂停
- 单个职位连续失败 3 次自动跳过,避免死循环
- 沟通记录最多保留 300 条,可导出 CSV
界面
- 面板可拖动,位置、最小化状态、列表折叠状态都会记住
- 最小化后收成一颗胶囊,仍然显示运行状态和本轮完成数
- 运行日志面板:记录每一步动作与失败原因,可一键复制或清空
- 跟随系统的深色模式,
prefers-reduced-motion下自动关闭动画
沟通
- 多条招呼语,支持随机轮换
- 变量:
{jobTitle}{companyName}{location}{salary} - 可选发送 JPG 图片简历(依赖页面存在可用上传入口,属 best-effort)
自动回复(可选)
- 支持 DeepSeek、豆包(火山方舟)、腾讯元宝/混元,以及任意 OpenAI 兼容接口
- 只在聊天输入框可见、且最后一条消息来自对方时才回复
- 携带最近 6 条上下文,同一条消息不会重复回复,两次回复间隔至少 6 秒
- API Key 只保存在本机
chrome.storage.local,请求由扩展后台直接发出,不会下发到网页脚本
- 打开
chrome://extensions/(Edge 为edge://extensions/) - 打开「开发者模式」
- 点击「加载已解压的扩展程序」,选择本项目根目录
加载后进入 BOSS 职位列表页,右上角会出现悬浮面板。面板可拖动,位置会被记住。
- 登录 BOSS,点顶部导航「职位」,确认左侧有职位卡片列表
- 在面板填职位关键词和工作地点,或直接点上方预设
- 点「开始沟通」
启动后的执行顺序:
- 自动滚动左侧列表到底部,尽量读完整个懒加载列表
- 计算哪些岗位命中条件
- 逐个点击岗位卡片,等右侧详情切换完成
- 在详情区找「立即沟通 / 打招呼」,出现「留在此页」时点它以留在列表页
- 聊天框出现后按需上传图片简历、填入招呼语、点击发送
- 通过输入框是否清空、聊天区是否出现该文案来二次确认发送成功
完整读取列表前,「职位」「匹配」「待沟通」会显示为 —,避免在列表没读完时给出误导性数字。
跑起来之后:右侧主按钮显示「进行中 / 沟通中」,副按钮是「暂停」。暂停后主按钮变成「继续沟通」,副按钮变成「结束本轮」。出问题时先展开面板底部的「运行日志」,里面有每一步的动作和失败原因,可以直接复制出来排查。
点面板右上角齿轮打开独立设置窗口,所有改动自动保存到 chrome.storage.local,刷新页面和重开浏览器都不会丢。
可配置项:薪资、公司、排除公司、招聘者状态、招呼语(每行一条,第一条为默认)、招呼语轮换、每日上限、轮询间隔、图片简历、自动打招呼、自动切下一个、自动回复及各服务商配置。
自动回复配置好后可以点「测试自动回复」,它只验证 API 是否可用,不会往聊天框发消息。
.
├─ manifest.json 扩展声明
├─ advanced.html 高级设置窗口
├─ icons/ 图标(由 tools/generate-icons.mjs 生成)
├─ src
│ ├─ background.js service worker:设置读写、开窗、模型请求代理
│ ├─ content.js 悬浮面板、职位解析、筛选、自动流程、自动回复
│ ├─ advanced.js 高级设置页逻辑
│ └─ shared
│ └─ settings.js 三个运行环境共用的设置定义与归一化
├─ tests/ 纯逻辑单测(node:test,无第三方依赖)
└─ tools/generate-icons.mjs
三个执行环境都通过 src/shared/settings.js 拿默认值和归一化函数,避免各写一份导致字段漂移。content script 通过 manifest 的 js 数组注入它,service worker 用 importScripts 引入,设置页用 <script> 引入。
chrome.storage.local是唯一的共享状态- 每个页面只写自己负责的字段(增量 patch),不做「读全量 → 改几个字段 → 写全量」,避免并发覆盖投递计数
- 内容脚本优先直读 storage,只有需要归一化或调用模型时才走消息通道,规避 service worker 休眠
- API Key、Endpoint、Model、system prompt 只在 service worker 侧读取,
boss-helper:get-settings返回的子集里不含这些字段
改完源码后:
- 到扩展管理页点「刷新 / Reload」
- 回 BOSS 页面整页强刷
- 观察面板状态条
检查与测试(无第三方依赖,不需要 npm install):
npm run check # 四个源文件语法检查
npm test # node:test 单测
npm run icons # 重新生成图标测试覆盖筛选引擎(关键词 / 地点 / 薪资 / 活跃状态)、设置归一化与增量写入、密钥隔离、模型请求错误分类、聊天气泡归属判定与面板状态文案。tests/content-logic.test.mjs 和 tests/background.test.mjs 用 node:vm 加载源码并注入最小的 DOM / chrome 桩,因此不需要浏览器环境。
面板样式集中在 buildStyles() 里,颜色全部走 CSS 变量,深色模式只覆盖 .panel 上的变量;高级设置页同理,变量定义在 :root。改配色时优先改变量,不要往组件规则里塞新的硬编码颜色。
- BOSS 页面 DOM 经常变化,按钮、弹窗、上传入口都可能失效,需要按实际页面继续适配
SELECTORS。 - 图片简历上传依赖页面暴露可用的
input[type=file],不保证所有账号和页面分组都能成功。 - 招聘者状态筛选依赖列表卡片上能提取到的文本,不是所有卡片都稳定带状态。
- 运行日志只存在内存里,关闭页面即清空;需要留存请用「复制」按钮。
- 聊天气泡归属优先按 class 词段判断,认不出时按气泡左右位置兜底;页面大改版后可能需要补充
SELF_MESSAGE_TOKENS/FRIEND_MESSAGE_TOKENS。 - 扩展不会绕过站点限制。页面不给沟通时只会记录失败或暂停。
改了代码但页面没变化:先在扩展管理页 Reload,再整页强刷 BOSS 页面。
提示没有命中职位:优先检查关键词是否过窄、地点是否过窄,以及高级选项里的薪资 / 公司 / 排除公司 / 招聘者状态是否卡得太死。面板的提示条会给出主要卡在哪一项。
沟通数量到上限还会继续点吗:不会。检测到上限弹窗后会自动暂停,并点掉提示框。
暂停后再开始,会把之前沟通过的再来一遍吗:不会。点「继续沟通」从当前进度接着跑;即使点「结束本轮」再重新开始,本次页面内已完成的职位也不会重复处理。
自动回复没反应:确认已开启开关、填了 API Key,并且当前聊天窗口最后一条消息来自对方。缺少 Key 时会暂停自动回复,填好后自动恢复。
本项目仅用于个人学习和浏览器扩展开发研究。使用时请自行评估风险,并遵守目标网站规则与适用法律法规。