Skip to content

Releases: handsomekai924/boss-automatic-delivery

v1.2.3

Choose a tag to compare

@handsomekai924 handsomekai924 released this 19 Oct 06:44

修复

  • 城市级联选到省级:点「广东」这类顶层省节点只展开下一级、不再取值,搜索只吃市 / 区 code;旧配置里的省级 code 载入时清成「不限」,直辖市(如北京两层同码)不受影响。

v1.2.2

Choose a tag to compare

@handsomekai924 handsomekai924 released this 19 Oct 05:02

新增

  • 行业数据改走接口:优先调行业接口拉取行业树,接口不可用时自动降级回内置行业表。
  • 级联选择器保留滚动位置:切换父级时不再丢失各列浏览位置,勾选 / 清空也不会跳回顶部。

修复

  • SQLite 连接并发安全:改为每线程独立连接,多线程并发读写不再串线。
  • 「版本更新」圆点不显示:进入设置页后圆点按缓存正确绘制,忽略版本后立即熄灭。

v1.2.1

Choose a tag to compare

@handsomekai924 handsomekai924 released this 14 Oct 16:34

新增

  • 侧边栏仓库徽章:Gitee / GitHub 各挂一个星标徽章,点开对应仓库页——想 star、想提 issue 不用再翻 README

修复

  • 【致命】1.2.0 的发行 zip 少了 _internal\base_library.zip,装完程序根本起不来

    • make_zip.py 为了不把 dist 里的残留物打进去,按后缀一刀切跳过 *.zip——但 PyInstaller 的 onedir 布局里 _internal\base_library.zip 装的是整个 stdlib(含 encodings),被顺手丢了
    • 症状:双击 exe 直接闪退 / 报 No module named 'encodings'
    • 改法:跳过规则给 base_library.zip 开白名单(KEEP_ZIP_NAMES);打完包自我核对一遍 REQUIRED_MEMBERS(BossAutoDelivery.exe + _internal/base_library.zip),缺了就把坏包删掉并拒绝发货——坏包留在 dist\ 里迟早被当成好包发出去
    • apply_update.bat 加第三道守卫:解压后缺 base_library.zip 就停在原地报错,不许换文件。残缺包换上去比不更新还糟(旧的能用胜过没有),所以守卫必须排在删安装目录之前
    • 校验放宽到「一层子目录包着也算」:真出过 BossAutoDelivery\ 布局,按根路径硬比会误判成缺文件
  • 更新永远卡在 85%「closing old app」:spawn_bat 原来用 DETACHED_PROCESS 起 bat,cmd 完全没有控制台,bat 里任何管道都会永久挂死——tasklist ... | findstr ... 正好是「等旧进程退出」循环的第一句,更新一声不响停在 85%;同一环境下 tasklist 重定向出来是空的、pause 也会挂住。改用 CREATE_NO_WINDOW——给一个真实存在只是没窗口的控制台,管道 / tasklist / pause 全部正常;失败原因看 update.log(「系统设置 → 版本更新」能就地看)

  • 更新完成后标签页被关掉,用户手上一个页面都不剩:重启的 exe 带 --no-browser 不会再开浏览器,而 window.close() 对「用户自己开的、没有历史记录」的标签页照关不误(try/catch 也拦不住,浏览器只打一条 console 警告)。改成自动刷新到新版本:

    • 延迟 1.5 秒再刷,让用户看清更新到了哪一版;按钮从「知道了」换成「立即刷新」
    • 刷新前用 sessionStorage 记「这页处理过哪一版的回执」,防「看到回执 → 刷新 → 又看到回执 → 再刷新」无限刷(回执是进程内缓存的,不记标记必死循环)
    • sessionStorage 被浏览器禁了就降级为提示手动 F5——宁可让用户自己刷,也不能刷不完
    • 每个标签页拿到回执都统一刷新,不只是发起更新的那个,保证手上这页一定不跑旧代码

改进

  • 发行 zip 打完自我核对关键成员,坏包自动删掉;打包脚本、bat 守卫、创建标志都有回归用例钉着

升级说明

  • 别再下载 / 分发 BossAutoDelivery-1.2.0.zip——那个包是残缺的,解压后 exe 起不来。已经下过的请改下 BossAutoDelivery-1.2.1.zip
  • 1.2.0 的用户没法用「立即更新」升上来:1.2.0 自己生成的 bat 有挂死 bug,会卡在 85% 一动不动(安装目录不会被动,旧程序还能用)。请手动下载 BossAutoDelivery-1.2.1.zip,解压到任意目录,再把旧安装目录里的 data\ 拷进去(简历 / 登录态 / 职位全在 boss.db 里)
  • 行为变化:更新完成后不再关标签页,改为自动刷新到新版本(停留约 1.5 秒让你看清版本号,也可点「立即刷新」)
  • 从 1.2.1 起「立即更新」恢复正常,而且换文件前会多一道 base_library.zip 守卫
  • 数据库无迁移、无新表、无新列
  • 源码用户:git pull 即可,无额外步骤

测试

  • 新增打包用例(base_library.zip 必须进包 / 好包自检通过 / 缺件拒绝发货并删坏包)、bat 第三道守卫(缺 base_library.zip 停在原地不换)、spawn_bat 创建标志(必须 CREATE_NO_WINDOW、不许 DETACHED_PROCESS)
  • 前端契约同步「更新完成只刷新不关页」:旧断言还在盯 window.close(),已改成盯 location.reload() + sessionStorage 防循环 + F5 兜底
  • 当前全套 1206 项通过、4 项跳过

v1.2.0

Choose a tag to compare

@handsomekai924 handsomekai924 released this 14 Oct 13:52

新增

  • 应用内自动更新(v1.1.1 的「检测 + 提示」补完下半截)

    • 发现新版本的弹窗里多了**「立即更新」**;四个出口变成:立即更新 / 前往 Gitee / 前往 GitHub / 忽略此版本

    • 更新全流程:

      下载 zip(弹窗上有百分比)─► 校验 zip 能解开、里面有 BossAutoDelivery.exe
      ─► 生成 %TEMP% 下的 apply_update.bat(黑窗会短暂出现,是正常的)
      ─► bat 先验后删:zip 不在 / 解压不出 exe 就退出,安装目录一个文件都不动
      ─► 停服务 ─► 换程序文件(保留 data\)─► 按原来的端口重启
      
    • 目录语义:BossAutoDelivery.exe + _internal\ 是程序文件,升级时整换;data\ 是用户数据(boss.db / chrome_profile\ / logs\),升级时一个字节都不动

    • 全程 WebSocket(/api/system/update/ws)推进度;换文件那几秒页面会断开,新服务起来后自动接上,显示「更新完成,可以关闭此标签页了」

    • 失败的话黑窗停在原因上按任意键关闭,日志在 %TEMP%\BossAutoDelivery-update\update.log——把它发出来就能定位

    • 只在装在本地目录里的 exe 上提供:源码跑请用 git pull,在压缩包预览里跑请先解压——这两种情况弹窗里不会出现「立即更新」

    • 打包形态变了:从单文件 exe(onefile)改成 onedir + 发行 zip(BossAutoDelivery-x.y.z.zip)。单文件 exe 会把自己解到 %TEMP% 再跑,升级时没法就地替换,也没法让 data\ 跟着安装目录走;onedir 启动快,而且换得动自己

    • packaging\build.bat 每次先清空 dist\ 再打,避免旧布局残留被发出去;打包前用 find_spec 预检 hiddenimports,缺 segno / uvicorn / python-docx 直接报错,不再出「双击闪退」或「二维码裂图」

    • README 补了「发版清单」:改 __version__ → 打 zip → 在 Gitee 建 Release(版本判断只认 Gitee)→ zip 作附件挂上(BossAutoDelivery 开头、.zip 结尾)→ 别勾「预发布」(会被跳过)

  • 系统设置 → 「版本更新」页签(更新出问题不用再翻 %TEMP%)

    • 普通用户不知道 %TEMP%\BossAutoDelivery-update\ 在哪,以前更新失败只能干瞪眼。现在系统设置里多了第三个页签「版本更新」,日志就摆在网页上
    • 五个按钮:检查更新(强制走一次 Gitee,出结果 toast)/ 立即更新(有新版且装在本地目录里才出现)/ 打开更新窗口(复用原有的「发现新版本」弹窗,含更新说明、忽略、下载链接)/ 刷新日志 / 复制诊断信息
    • 就地看更新过程日志:update.log 与 progress.log 的尾部(默认 64 KB,超长只取尾部并丢掉残行)直接显示在页面上;文件不存在 / 被别的进程锁住都当数据处理(永远 200,页面上写明原因),不会弹一个看不懂的接口错误
    • 出错时一张截图就是一份反馈:错误横幅里直接写「当前版本 vX · 安装方式(源码运行 / 压缩包临时运行 / 安装版)+ 失败原因」,完整日志紧挨在下面;点「复制诊断信息」得到一份可直接贴进微信 / 邮件的纯文本(导出时间 / 版本 / 安装方式 / 目录 / 上次检查结果 / 忽略版本 / 最近更新阶段 + 两份日志尾部),浏览器拦剪贴板时退化成弹框手动 Ctrl+C
    • 每 5 分钟自动检测(后端守护线程打 Gitee,与打开几个网页无关);前端每分钟只读缓存,发现没提醒过的新版就 toast 一句「发现新版本 vX,到『系统设置 → 版本更新』看看」,并在页签标题上点一个小圆点
    • 轻提示,不重复弹窗:首屏那个「发现新版本」弹窗仍且只弹一次;挂机期间绝不再弹窗,同一版本也只 toast 一次;点过「忽略此版本」的版本连 toast 都没有(忽略水位线继续生效)
    • 新接口 GET /api/system/update/log:回日志尾部 + 一份只读缓存的诊断信息(不打 Gitee,诊断页不会卡 8 秒);更新完成回执 done.json 只给真正的消费方,看日志不会把它吃掉
  • 抓取任务历史档案(抓取从内存对象变成可追溯记录)

    • 新表 crawl_tasks(任务条件 / 统计 / 时间)+ crawl_task_jobs(任务 ↔ 岗位归属);fetch_pages 加 task_id,页级流水挂到任务上
    • 「职位匹配 → 抓取任务」目录里能回看每一次抓取:条件、统计、带回了哪些岗位(点开看本批岗位列表)
    • 对本批岗位一键发起匹配:不必再「一键匹配全部」(全库)或手动翻页勾选;工作台会显示匹配范围条(抓取任务 #xxxx · N 个职位),可一键清掉范围
    • 抓取记录只进不删;正在跑的任务也会出现在列表里(带 live 进度)
    • 命令行 / 任务参数都带 crawl_task_id,批量匹配可以限定到某一次抓取
  • 30 天招呼语发送冷却(重抓岗位不再重复骚扰同一位 HR)

    • jobs 表加 last_greeted_at,以岗位为粒度记发送史(以前只记在 analysis 快照的 delivered_at 里,跨分析完全失效)
    • 判定口径:可发送 ⇔ now - 最近发送时间 ≥ 30 天;恰好 30 天整允许再发;「最近发送时间」取岗位维度 last_greeted_at 与本条分析 delivered_at 中较晚者——上线前已发出的岗位也算数
    • 发送前统一校验,冷却中跳过并标 30 天内已发送(MM-DD);发送成功后双写岗位维度与条目维度
    • 重抓 UPSERT 不会覆盖 last_greeted_at(发送史不被下一次抓取抹掉)
    • 匹配结果卡片 / 发送清单上的状态会带冷却信息(待发 / 冷却中 / 已发送 / 失败原因)
    • 30 天窗写死常量(GREET_COOLDOWN_DAYS),不进配置——以后要调再进 deliver_config
  • 职位匹配页拆成四个目录(消除一屏塞满的状态)

    • 沿用「系统配置」的左右目录范式,长页变控制台:

      目录 内容
      匹配工作台(默认) 简历选择 + 解析状态、匹配范围条、一键匹配当前范围 / 匹配选中、批量匹配任务面板、双栏(岗位列表 | 匹配结果)
      批量发送 当前分析上下文条、一键发送全部 / 选中、评分阈值(自动保存)、批量投递任务面板、发送清单
      抓取任务 历史抓取档案分页、任务详情、本批岗位列表、一键匹配本批
      分析历史 analysis 列表载入 / 删除(不再是夹在中间的 200px 小窗)
    • 匹配主流程(岗位 → 结果)首屏就是工作区;匹配结果卡片、详情弹窗(分析 / 职位信息 / 招呼语手改 / 重新生成 / 重新匹配 / 单条发送)全部保留

    • 页面状态(简历、勾选、当前分析、两个长任务)收进各自的子模块,后续加功能不用再往一页上堆

  • 启动时登录态自检(首屏状态不再需要手动刷新)

    • GET /api/auth/status 只看库里有没有凭证,不问服务端——凭证过期后照样报「已登录」,点「开始抓取」才撞见失效。现在启动时拿库里的凭证打一次用户信息接口验真伪
    • 四态结论:valid(服务端认,顺手刷 user)/ expired(服务端明说失效 → 清掉库里那份)/ absent(本来就没登录,不发请求)/ unknown(网络不通 / 别的错 → 不动库,断网不该把好凭证抹掉)
    • 「是不是真的失效」有判据:话术里明说了登录问题才算;getUserInfo 回个「系统繁忙」不会清库
    • CLI 启动流程改为等自检出结果再开浏览器(上限 20s,超时先开别干等)——网页一打开看到的会话状态就是定论
    • 首页卡片跟随 boss:session 事件更新;/api/ 响应加 Cache-Control: no-store,防浏览器缓存旧状态

修复

  • 未登录时采集接口返回 500:create_client() 抛的 JobApiError 现在转成 UpstreamError(502);app 层加 JobError 全局兜底,不再漏 500;「本地没有登录态」的提示改成指向**「登录」页**,错误文案去掉重复的「失败」前缀
  • 二维码图片加载失败无提示:裂图变成把服务端的 message 显示出来,不再静默;WebError 顺手补日志(5xx warning / 4xx info),报问题时有迹可循
  • 打包漏依赖:segno 显式进 boss_web.spec 的 hiddenimports,打包前预检缺了直接报错;requirements.txt 补 UTF-8 声明

改进

  • 黑名单规则列表每行加状态指示圆点(绿 = 启用带发光、灰 = 停用),title 提示当前状态
  • 职位列表分页按钮在没有下一页 / 加载中时会禁用,不再点空
  • 设置导航栏 sticky 偏移修正,长列表滚动时目录不再被页头盖住

升级说明

  • 数据库自动迁移,不用手动改表:首次启动会补 crawl_tasks / crawl_task_jobs 两张表,以及 jobs.last_greeted_at、fetch_pages.task_id 两列(CREATE TABLE IF NOT EXISTS 不会补列,靠 _migrate_columns())。旧数据不回填——历史抓取不补档案,只对升级后的新抓取生效
  • 打包形态变了:从 v1.1.x 的单文件 exe 换成 zip 解压版。旧的 BossAutoDelivery.exe(onefile)没法就地升到 1.2.0——那上面没有「立即更新」按钮,也没有可替换的 _internal\。请去 Releases 下一次 BossAutoDelivery-1.2.0.zip,解压后把旧 data\ 拷进新安装目录(简历 / 登录态 / 职位全在 boss.db 里)。从这一版起才吃得到「立即更新」
  • 行为变化一:30 天发送冷却。以前「已发不重发」只在同一条分析内有效,跨分析会把同一岗位再发一遍;现在 30 天内发过的岗位,再抓到 / 再匹配 / 一键发送一律跳过。想立刻再发同一岗位的,等 30 天或手动改库里的 last_greeted_at
  • 行为变化二:启动会自检登录态。服务端确认过期会清掉本地登录态(首页如实显示未登录);断网 / 系统繁忙不会动库。首屏比以前多等最多几秒才出结论
  • 行为变化三:后台每 5 分钟自动检测版本。挂机时发现新版只 toast 一句 + 「版本更新」页签点个小圆点,不会再弹窗;同一版本只提醒一次,点过「忽略此版本」的连 toast 都没有
  • 源码用户:git pull + pip install -r requirements.txt 即可,无额外步骤;打包用户注意 packaging\build.bat 会先删整个 dist\,要留档先拷走

测试

  • 新增抓取任务档案(落库 / 任务↔岗位归属 / 重抓不覆盖发送史 / 冷却判定)、登录态自检(四态 / 不误清库)、应用内更新(下载 / 校验 / 先验后删 / 失败留日志)、版本更新页签(日志尾部截断 / 读失败不抛 / 诊断不打 Gitee / 周期检测守护线程 / 前端轻提示不重复弹窗)、打包脚本预检、前端契约等用例;当前全套 1202 项通过、4 项跳过
  • 更新流程不打真网:zip 校验与 apply_update.bat 生成都在假环境里跑;Gitee 拉发行版沿用 v1.1.1 的离线夹具;看日志 / 复制诊断也不会去访问 Gitee

v1.1.2

Choose a tag to compare

@handsomekai924 handsomekai924 released this 14 Oct 01:38

新增

  • 求职期望流采集(第三条检索路径,与「关键词搜索」并列)

    • 四档形态,对齐站点前端 getFormData() 的四个分支:

      档位 主参数 站点对应
      推荐 city + encryptExpectId + mixExpectType 推荐 tab(混合期望)
      兼职 jobType=1903 + encryptExpectId 兼职 tab
      我的期望 encryptExpectId 指定期望 tab
      临时期望 expectInfo(JSON 串) 「快速添加」的临时检索
    • 期望流不带关键词:站点点期望 tab 时会删掉 query,这是站点行为不是我们省略;要关键词就走搜索流的「期望 + 关键词」组合(搜索流新增 encrypt_expect_id)

    • 筛选维度(城市 / 薪资 / 经验 / 学历 / 行业 / 规模,兼职态换成 payType / partTime)与搜索流共用同一套 code 与拼法

    • 期望列表在线拉(GET /api/collection/expects):期望 id 是账号维度的,不能写死;配置页下拉分三组(我的期望 / 推荐 / 兼职)+「临时期望(快速添加)」

    • 采集来源在「系统配置 → 采集配置」里二选一(关键词搜索 / 求职期望);职位页摘要会写清当前走的是哪条流

    • 命令行:--expect 与 --filter 互斥(两者都在选「这次走哪条检索」)

      python -m boss_jobs fetch --expect recommend          # 推荐(混合)期望
      python -m boss_jobs fetch --expect part_time          # 兼职期望
      python -m boss_jobs fetch --expect expect:<id>        # 指定期望
      python -m boss_jobs fetch --expect temp:<file.json>   # 临时期望(expectInfo)
    • 旧「推荐页」(special/zone)流已下线——那是站点删掉的路径,空条件不再兜底到它

  • APP 扫码登录(与「短信验证码」并列的第二条登录路径)

    • 按站点真实协议走完整六步,不模拟界面:

      captcha/randkey ─► qrcode/scan(长轮询) ─► getSecondKey
                     ─► scanSecond(与 1 秒兜底赛跑) ─► getHeadImg
                     ─► qrcode/scanLogin(长轮询) ─► qrcode/dispatcher
      
    • 两阶段二维码票据:起手 qrId 就是码内容;手机扫过之后 getSecondKey 换发 secondUuid,码内容跟着换——所以网页上扫码后二维码会更新一次,这是对的

    • 登录态与短信一样,全靠 Set-Cookie(响应体里没有 token);dispatcher 回完把 Cookie 落进本地状态库

    • 命令行:python -m boss_login qr,终端直接画二维码;还支持 --svg / --png 导出

    • 网页:登录页顶上「短信登录 / APP 扫码」两个页签,扫码有独立面板(生成 → 等扫 → 已扫 → 完成),二维码用 GET /api/auth/qr/{id}/image 现画

    • 同一时刻只跑一条登录流,任务快照带 kind(sms / qr),前端按它分派界面,不靠状态字符串猜

    • 二维码渲染依赖 segno(可选,已进 requirements.txt);没装会明确报「请 pip install segno」,不影响短信登录

    • 跟滑块一样是人机协作:码是你自己用 BOSS APP 扫、自己点确认,不是绕过风控

v1.1.1

Choose a tag to compare

@handsomekai924 handsomekai924 released this 12 Oct 10:18

新增

  • 版本更新检测

    • 程序内写死当前版本号,启动后后台比一次 Gitee 发行版;开页面时直接用结果,不卡网络
    • 版本判断只认 Gitee(GitHub 发版节奏可能不一致,以 Gitee 为准);GitHub 仅作为另一个下载入口
    • 不用 Gitee 的 /releases/latest——它按发布时间挑,tag 顺序一乱就返回旧版(实测 v1.1.0 已发布时它还回 v1.0.0);改为拉列表自己比大小,跳过预发布 / 草稿
  • 打开页面弹「发现新版本」

    • 显示 当前 v1.x → 最新 v1.y 与更新说明
    • 四个出口:前往 Gitee 下载 / 前往 GitHub 下载 / 忽略此版本 / 取消
    • 取消(含 Esc、点空白处)什么都不记,下次打开页面照样弹
    • 忽略此版本 记进本地设置,这一版不再弹
  • 忽略是水位线,不是白名单:忽略 v1.2.0 再忽略 v1.3.0 ⇒ v1.3.0 及以下一律静音,v1.4.0 一发就重新提醒;不必担心被旧版本回头骚扰

  • 控制台版本信息:启动后在横幅下按行补打

      当前版本     v1.1.1
      发行版本     v1.1.1
      是否需要更新 否,已是最新
    

    有新版时追加 Gitee / GitHub 两行下载地址;检测失败也会把当前版本打全,并写明原因(不影响程序其它功能)

  • 首页环境卡显示当前版本号;健康检查接口带上版本号,方便报问题时先说清「我这是哪一版」

改进

  • 版本检测结果缓存 30 分钟,连续开多个页面不会反复撞 Gitee
  • 检测接口挂了也不影响使用:前端静默跳过,不额外弹错误框;服务端返回 200 + error 字段,而不是让整页报错

升级说明

  • 直接覆盖运行即可,本地设置库会自动新增「忽略的版本」字段
  • 版本判断只打 Gitee;想要 GitHub 的包,在弹窗里点「前往 GitHub 下载」就行
  • 从 v1.1.0 及以前升上来的包没有更新提示(那时还没这功能),升到本版后才会开始提醒
  • 想让已经忽略过的版本重新提醒:删掉本地设置里的忽略记录即可(或者等下一次真正更新的版本)

测试

  • 新增版本号解析 / 比较、Gitee 列表挑最新、忽略水位线、缓存、HTTP 接口、控制台文案、前端弹窗契约等用例

v1.1.0

Choose a tag to compare

@handsomekai924 handsomekai924 released this 12 Oct 08:03

新增

  • 职位黑名单规则
    • 支持公司名、JD 关键词两类规则,规则与命中记录分别落库(blacklist_rules / blacklist_hits),可审计是谁在什么时候被哪条规则拦下
    • 采集时两阶段过滤:先按公司名过滤,再补 JD 详情后做关键词过滤
    • 命中的职位会打上 is_blacklisted / matched_rule_ids 等标记,采集统计新增跳过数与命中数
    • 全链路生效:匹配结果会冻结一份安全快照,命中黑名单或安全状态不完整的职位一律禁止自动投递
  • 采集配置:搜索条件(城市 / 求职类型 / 薪资 / 经验 / 学历 / 行业 / 规模)从职位页迁到「系统配置 → 采集配置」,黑名单也在同一处管理;设置页改为 Tab 布局。原 /llm 路由迁至 /settings,旧地址仍可访问
  • 简历解析截断自动重试:读取 finish_reason,输出被 length 截断时以 16384 tokens 上限自动重试一次;仍失败会明确提示「缩短简历或换更高输出上限的模型」,而不是返回半截 JSON

修复

  • JD 抓取失败后无法重试:引入 jd_status 区分「抓取失败」与「JD 为空」——失败的会进补抓名单、下次继续抓,空 JD 的不再反复撞接口

改进

  • LLM max_tokens 按场景拆档:简历解析 8192、人岗匹配 4096、通用调用 2048,长简历不再被默认上限截断
  • 打招呼话术的格式约束抽成独立模块统一维护,匹配与简历分析共用同一套规则,改一处两边同步
  • 上传体积限制写进前端提示:Word / PDF ≤ 8MB,Markdown / 纯文本 ≤ 2MB
  • 前端新增多选下拉、级联复选框组件,设置页交互重做

升级说明

  • 数据库会自动新增黑名单相关表与职位安全标记字段,直接覆盖运行即可
  • 旧的匹配分析结果没有安全快照,不会进入自动投递;重新匹配一次即可恢复正常投递
  • 「AI 设置」入口改名为「系统配置」,收藏了 /llm 的用户会自动跳转

测试

  • 新增黑名单规则、爬虫过滤、投递策略、前端契约等用例共约 1300 行,JD 失败重试行为也有覆盖

v1.0.0

Choose a tag to compare

@handsomekai924 handsomekai924 released this 09 Oct 14:31

登录 → 找职位 → 简历匹配 → AI 写招呼语 → 一键投递,一条龙跑通。
登录、搜索、投递全部走站点真实接口与真实帧格式,不做前端界面模拟。

📦 下载

方式 适合谁 说明
BossAutoDelivery.exe 不想碰命令行 Windows 单文件,双击即用,目标机器不需要 Python / venv / pip
Source code 想改代码 / 用 macOS、Linux 克隆后按 README 装依赖运行

打包版的数据是便携的,全在 exe 同目录:

data\boss.db          ← 简历 / 登录态 / 职位 / AI 配置,全在这一个文件里
data\chrome_profile\  ← 取安全令牌用的 Chrome 工作目录
data\logs\boss.log    ← 出问题时把这个文件发出来

换机器请整个文件夹一起拷,别只拷 exe,否则简历和登录状态会丢。

✨ 功能

环节 说明
登录 手机验证码登录。滑块验证是人机协作:脚本出图、你本人拖动官方组件,不绕过风控
筛选条件 城市 / 求职类型 / 薪资 / 经验 / 学历 / 行业 / 规模 7 个维度,优先打真实 wapi,接口挂了自动退回内置兜底表
找工作 分页抓取 + 即时清洗 + 入库,页间硬性节流。__zp_stoken__ 由真 Chrome(CDP)自动计算,不用手抄 Cookie
简历解析 支持 .docx / .pdf / .md / .txt,提取基本信息、求职意向、工作经历、项目经历、教育经历、技能、自我评价
智能匹配 对选中职位并行调用 AI,产出匹配度、优缺点与个性化招呼语;支持重新匹配、单条重生成
一键投递 建会话后走 MQTT over WebSocket + protobuf 帧,把招呼语正文真正发出去
Web 控制台 FastAPI + 原生前端,登录 / 职位 / 简历 / 匹配 / AI 设置五页工作台,双光照主题

🖥 环境要求

  • Windows 10/11(打包版)或 Python 3.10+(源码版,开发环境为 3.12)
  • Chrome 浏览器 —— 抓 __zp_stoken__ 时需要走 CDP 拉起真浏览器
  • 一个能收短信的手机号(登录用)
  • 你自己的 OpenAI 兼容 AI 接口 Key(DeepSeek / Kimi / 本地 vLLM 都行),只存本地 data\boss.db,回显打码

⚠️ 首次运行注意

  • 首次运行 Windows 可能弹「已保护你的电脑」(exe 未做代码签名)。点 更多信息 → 仍要运行。这是无签名 exe 的通病。
  • 别在压缩包里直接双击。Windows 会先解压到临时目录,数据会写进 %TEMP% 并在退出时清掉;程序检测到这种情况会在首页顶部弹红条提醒。
  • 放在 C:\Program Files 这类写不进去的目录时,数据会自动改存到 %LOCALAPPDATA%\BossAutoDelivery\data\,首页会告诉你实际路径。
  • 想核对打包是否完整,跑 BossAutoDelivery.exe --self-check,会打印资源根 / 前端目录 / 状态库 / 日志目录 / Chrome 检测结果。

🚀 快速开始

  1. 登录 —— 填手机号收码,滑块验证时按页面提示在浏览器里完成拼图
  2. AI 设置 —— 填 API Key / 接口地址 / 模型名,先「测试连接」再保存(页面上有分步图文引导)
  3. 找职位 —— 配置筛选条件,一键分页搜索,浏览 / 管理职位库
  4. 上传简历 —— 传 .docx / .pdf / .md / .txt,自动触发解析
  5. 看匹配 —— 选职位跑匹配,卡片弹窗里看分析、优缺点和招呼语
  6. 投递 —— 确认后一键投递

也可以走命令行:python -m boss_login login / python -m boss_jobs fetch / python -m boss_web,详见 README。

🚧 已知限制

  • 打包版仅 Windows;macOS / Linux 请用源码方式运行
  • 依赖站点实时接口与风控策略,上游改版可能导致功能临时失效(尤其 __zp_stoken__ 挑战与登录滑块流程)
  • 抓取刻意压到人手滚动的量级,没有并发和高速抓取,请勿调高频率压接口
  • 未做自动更新,新版本需手动下载替换

🐞 出问题怎么办

把 data\logs\boss.log 发到 Issues 里。界面上的报错是翻译过的「人话」,StokenError 原文、上游 HTTP 响应体、requests 栈信息这类技术细节只进日志,不在界面上摆出来。

⚖️ 免责声明

本项目仅供学习与技术研究使用。使用即表示你同意:遵守 BOSS 直聘用户协议与相关法律法规,账号行为自负;不得用于批量骚扰、数据倒卖或任何商业牟利用途;请控制抓取频率,不要对目标站点造成压力。因使用本项目导致的任何账号限制、封禁
或法律后果,作者不承担责任。若平台方认为本项目不妥,联系即下架。

License

MIT