dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness plugin: Chrome DevTools Protocol automation
DeepSeek Harness 插件:用 CDP 驱动一个受控 Chrome 实例,附带「弹窗收集规则 + 文本可视化 + 无停机热替换」能力。
English | 中文
基于浏览器扩展的自动化通道驱动不了部分网站:
问题 · 表现 受控标签页被清空 · 目标站点会让被控制的标签页变空白 必须借用用户标签页 · 借来的标签页同样会变空白 成功弹窗不可信 · 页面报告了成功对话框,但操作并未真正生效
本插件因此自带一个受控 Chrome 实例、直接说 CDP 协议,并强制「可验证的操作流程」。
零运行时依赖 —— 只用 Node 内置的 fetch 与 WebSocket(要求 Node ≥ 22)。
项目 · 要求 DeepSeek Harness · `>=0.2.0-rc.2 <0.3.0-0`(即 engines.dsh,由 DSH 的兼容性判定直接校验);已验证 0.2.1-rc.2 / 0.2.1-rc.3 @deepseek-ai/dsh-tools · ^0.1.5-rc.3 \ · \ · ^0.2.0-rc.1 \ · \ · ^0.2.1-rc.2(peer,由宿主提供) @deepseek-ai/schemastery · ^3.18.2(peer,由宿主提供) @deepseek-ai/cordis · ^4.0.2(peer,由宿主提供) Node · ≥ 22(宿主自带 Node 24,无需另装)
`engines.dsh` 是 DSH 真正会校验的字段。 DSH 的 evaluatePluginCompatibility()在插件安装/启动时读取它;一旦声明,它单独决定兼容性(peerDependencies 不再参与判定)。本插件声明>=0.2.0-rc.2 <0.3.0-0:覆盖已验证的 0.2.x,并用<0.3.0-0
挡住 0.3 的预发布版本(<0.3.0在includePrerelease下会误放行0.3.0-rc.1)。
注意:DSH 升级后要拉齐两处 —— ① profile 里的 @deepseek-ai 包(应用更新不会自动刷新 profile 的依赖树);② 仓库里 devDependencies 指向的dsh-tools/dsh-app-boot(在仓库目录跑一次npm install)。第二处不是洁癖:
自检与测试用宿主的校验器验输出,本地版本落后时 selftest.mjs 会直接判失败(「输出校验用的不是宿主那一份校验器」),而不是给出一个假的「通过」。
详见 UPDATES.md。
各版本的封装产物、SHA256 与「该用哪个版本」见 RELEASES.md。
自查一条命令(在仓库目录执行;单元测试文件不随 npm 包分发):
node run-all-tests.mjsnpm i dsh-plugin-cdp或在 DSH 的插件配置里加入:
- id: cdp
name: "dsh-plugin-cdp"
config:
port: 9222首次使用时插件返回一份问卷,由 DSH 内置的 ask_user_question 弹窗询问,一屏收齐:
岗位方向 · 工作地点 · 薪资下限 · 投递平台 · 浏览器 · 排除规则
答案落盘后不再重复询问。
设计红线:所有规则字段默认为空,问卷的规则类问题不生成选项、不标 (Recommended)。一旦预置选项,就等于把某个人的规则当成新用户的默认答案。插件提供的是能力,不是内容。
不依赖浏览器、不依赖图表库,用 Unicode 字符画图:
── 薪资分布(月薪 · 按 salaryMin 分桶,n=80;日薪 1 单未计入) ───
<7k │████░░░░░░░░░░░░░│ 7
7-9k │██████████░░░░░░░│ 19
9-12k │█████████████████│ 34
12-15k │██████░░░░░░░░░░░│ 12
≥20k │█░░░░░░░░░░░░░░░░│ 2
薪资未明 │█░░░░░░░░░░░░░░░░│ 2
── 投递时间线 ──────────────────────────
▂▁▁▁█ (5 天,49 单) 峰值 44 单含薪资直方图、地点条形图、平台占比、判定构成、投递火花线、等宽明细表。中文按双宽计算,表格列不会错位。
采用 先起新的、再退旧的,而不是原地重启:
1. 用户改规则 → 写新快照,规则指纹变化
2. 起新一代进程,与老一代并存
3. 等新一代写出心跳,证明它真的活着
4. 老一代退位为什么不是原地重启:那必须先杀掉老进程,于是总有一段「没有任何进程在跑」的真空期。
为什么重叠期安全:两代共享同一份 append-only 的完成记录。已完成的事两边都读得到(不会重复做),新增记录只是追加(不会互相覆盖)。重叠本身就是「不断档」的实现手段。
失败回滚:新一代若在就绪窗口内没写出心跳,保留老一代继续运行,绝不在新规则起不来时把任务停掉。
工具 · 作用 cdp_status · 受控 Chrome 的状态、端口、标签页 cdp_navigate · 导航并等待加载 cdp_eval · 在标签页里执行 JS 并返回 JSON cdp_read · 读取标签页 URL / 标题 / 可见文本 cdp_screenshot · 截图到本地文件 cdp_new_tab / cdp_use_tab · 新建 / 切换受控标签页 cdp_apply_verified · 带校验的操作:等详情面板稳定且薪资与卡片一致才点击,且拒绝重复操作 cdp_resume_match · 简历 × JD 匹配打分:技能 / 方向 / 经验 / 学历,返回 0~1 分数与是否达标 cdp_prefs · 读取 / 写入偏好(含弹窗问卷) cdp_browser_info · 如实报告使用的浏览器与可执行文件是否存在 cdp_jobs_report · 岗位 / 薪资 / 地点文本可视化报告 cdp_jobs_data · 原始 JSON cdp_runner_status · 运行器状态,含「规则改了但还没生效」提示 cdp_runner_reload · 同步规则并热替换 cdp_runner_stop · 停止运行器
cdp_apply_verified 为什么存在一次「点错岗位」的操作长这样:点击列表卡片 → 右侧详情面板其实还没切换 → 此时点「申请」→ 申请到了上一个岗位。
这个工具强制三道闸门:
任何一条不过就返回 ok: false 并说明原因,绝不「看起来成功」。
⚠️ 成功对话框不等于操作已记录。请始终到站点自己的记录页复核。
cdp_resume_match)它只回答一个问题:这份招聘信息与这份简历有多像,并给出可解释的分项。
技能覆盖 55% + 方向命中 25% + 经验满足 12% + 学历满足 8%cdp_resume_match({}) // 用当前页面当 JD + 配置里的简历
cdp_resume_match({ text: jdText, threshold: 0.7 }) // 显式给 JD 与达标线返回 { score, pass, parts, matched, missing, reasons },reasons 逐条说明打分依据。
开启 applyRequiresMatch: true 后,cdp_apply_verified 在点击前会先算分,未达标直接拒绝并返回原因,不会「投了再说」。
简历文本可以是.txt/.md。PDF 需要先转成文本(例如pypdf提取),插件不做 PDF 解析。
- id: cdp
config:
chromePath: "" # 留空则自动探测
userDataDir: "你的独立浏览器目录"
port: 9222
windowSize: "1500,950"
defaultTimeoutMs: 120000 # 单条 CDP 命令超时
loadEventMs: 8000 # 等待页面加载事件的上限
settleMs: 600 # 导航后额外稳定等待
prefsPath: "偏好落盘路径"
stateDir: "运行器状态目录"
resumePath: "" # 简历文本文件(.txt/.md);留空=匹配不可用
matchThreshold: 0.7 # 达标线(只是默认值,使用者可改)
applyRequiresMatch: false # 是否让 cdp_apply_verified 强制要求达标注意:受控实例使用独立的用户目录,不复用你日常浏览器的配置,因此需要在该实例里单独登录一次目标站点。
node --test lib/jobs.test.mjs # 27 项
node --test lib/report.test.mjs # 28 项
node lib/plugin.test.mjs # 62 项
node lib/supervisor.test.mjs # 44 项
node --test lib/match.test.mjs # 11 项(简历匹配打分)
node lib/selftest.mjs # 插件加载自检自检覆盖三类只有宿主才会拒绝的错误,本地跑 execute() 是测不出来的:
output.schema 漏声明返回字段undefined(不是合法 JSON)validateJsonSchemaValueadditionalProperties: false,多一个字段就会在宿主里被拒MIT
A DeepSeek Harness plugin providing Chrome DevTools Protocol automation with a self-managed Chrome instance, plus:
ask_user_question and stores the answers.15 tools total. Zero runtime dependencies (Node ≥ 22 built-in fetch + WebSocket).
⚠️ A success dialog does not prove an action was recorded. Always verify on the site's own record page.