网申填写扩展逆向架构
§1摘要与结论
对 Chrome MV3 网申自动填写扩展的逆向架构分析:梳理 popup、content、background、options 四模块职责,解剖 12 个站点适配器、双通道消息协议与隐私脱敏机制,并评估其零依赖零构建选型。
别名:OpenJobAutofill 逆向、Chrome MV3 扩展架构分析、适配器驱动表单填写 | 英文:OpenJobAutofill Reverse Architecture Analysis | 类型:案例 / case-study
§2局部关系图
§3原理 · 为什么
逆向一个成品扩展的价值在于还原「为什么这样分层」。该案例的显著主张有三条:其一,把「如何适配不同招聘网站」从核心逻辑中分离为可注册的站点适配器,用域名正则、置信度、探测选择器与容器选择器描述站点差异,运行时评分选择最佳适配器,使新增站点只加数据不改引擎;其二,把「处理页面的能力」与「持有密钥、调用 AI 的能力」拆到不同进程,content 永不接触 API 密钥、background 永不操作 DOM,二者经明确的消息命名空间与统一响应信封通信;其三,隐私优先以脱敏函数在发送前拦截真实简历值,模型只接收字段名与结构。这种「显式外置」也解释了为何一个功能看似简单的扩展会有近万行代码:复杂度并未消失,而是被搬到边界与适配层集中管理;反过来说,若把适配逻辑写进引擎、把密钥放进页面脚本、把真值直接发给模型,短期代码更少,长期每一次站点改版、每一次隐私审计都会放大成本。
§4机制 · 如何运作
四模块职责清晰:popup 是用户操作入口,经 tabs 通道下发页面级指令;content 是注入页面的引擎,承担表单扫描、字段标签提取、语义桶匹配、候选评分、控件填写与绿橙标记;background 是 Service Worker 中枢,持有配置、代理 AI 调用、巡检更新并经 runtime 通道路由十余种消息;options 管理结构化简历、AI 接口配置与导入导出。核心机制包括适配器模式(站点探测与统一注入扫描管线)、评分链模式(硬过滤后经文本分、语义桶加分、重复项序号匹配加权,达阈值才自动填写)、双通道协议(页面操作走 tabs、服务调用走 runtime,消息以命名空间隔离)、以及为兼容 React/Vue 受控组件的原生 setter 加事件派发写入法。值得注意的取舍是「谁来做决策」:站点探测在页面进程做,AI 调用与密钥在后台进程做,二者以消息解耦,使替换 AI 后端或新增站点互不影响;标记系统用颜色把「已自动填写」与「待人工确认」分开,本质上把模型置信度外化为可见信号,而非静默替用户决定。
§5工程 · 怎么落地
工程上以零 package、零 node_modules、零打包器实现,Load unpacked 直接加载,把部署复杂度压到最低,代价是全部逻辑靠手写原生 JS 承载,核心文件达数千行。隐私以「发送前脱敏、提示词只含字段结构」落实,避免简历真值出域;更新检查用定时闹钟加发行接口并配徽标提示;面板状态以会话存储加 LRU 控制上限;填写入口用运行标识双重检查防重入;面板持久化加防抖。文档化方面配套模块依赖与数据流图、核心流程时序图与适配器机制图,把逆向结论沉淀为可复用资料。整个扩展的可审计性正来自「无构建」:源码即产物,任何人拿到压缩包即可逐行检查其网络请求与数据处理,这对处理敏感简历的工具有现实意义;代价是没有依赖管理,跨文件复用只能靠约定与全局常量,演进到更大规模时需要重构而非简单加包。
§6权衡卡
零构建选型以可维护性换来了交付简单与审计透明:省去工具链却失去类型检查与模块打包,数千行单文件与全局常量使大型化后风险陡增;适配器驱动降低新增站点成本,但适配器质量参差会直接决定填写准确率,且站点改版时适配器需持续维护。
AI 调用无缓存,每次填写独立请求,准确率提升以用户 API 成本为代价。
更深的张力在自动化程度:自动填写越激进,用户越省事,误填风险也越大,本案例用阈值加颜色标记把不确定交还用户,是保守但有据的选择;另一个被低估的成本是站点维护,适配器增长后每个都是一条需持续回归的测试路径,缺少自动化站点测试时维护负担会随覆盖站点数上升。
双通道协议边界清晰,却需要人工维护十余种消息与两端契约,缺少自动化交叉校验时易出现漏接与静默失败。
- 隐私脱敏是强承诺,却依赖单点函数正确,漏一个字段即失效。
权衡原文仅按显式标记词归栏引用(收益 / 代价 / 反例),其余句子按原序列为「原文要点」;内容逐字引用未改写。
§7案例带
去中心化聊天架构逆向
对一个仅有 58 份设计文档、尚未实现的开源去中心化聊天项目做架构逆向:从设计文本提炼 18 个模块及其依赖关系,重建模块依赖 DAG 与三条核心数据流 DAG,并输出全景理解与深度需求分析。
网申 v3 多模块解耦
一套面向高可扩展性的网申信息速查扩展架构:以 schema.js 为唯一数据驱动源,把数据模型、存储、纯函数与渲染组织为严格单向依赖的共享层,供 popup 与页面浮层双容器复用,并先立跨模块接口契约。
网申 v2 深度重构
一次由「改一处漏多处」症状触发的深度重构:定位到接口定义散落 12 个文件、存在 7 种接口形态的根因后,以单一契约源、dispatch 消息表与能力注册中心重建三层契约系统,恢复可审计与可校验性。
preset 通道耦合分析
对 harness「委派工具层→续用管理器→preset 服务→MCP 服务器」这条通道做耦合分析:识别契约、服务定位、数据契约、组合语义、路径与装配一致性六类耦合点,定位「静默丢弃特化」与「装配漂移」两处实质缝隙。
dsh-manager 插件深度分析
以「编译依赖、运行时注入、组合装配」三硬依据加源码行号,对第三方插件做依赖、功能、需求溯源与设计问题裁决,并复用上游 DAG 知识库节点标识,使分析结果可与主图互查。
harness 源码架构解析
对 deepseek-harness 官方源码做分层解析:镜像官方架构文档,按九个层与九十余模块建立文档集群,产出跨层联动矩阵与七条关键路径,并钉住「模型可见即已记录」、能力缝三角等设计不变量。
dsh 插件依赖增量定位
以官方插件 DAG 为蓝本,对一个官方清单之外的全新社区插件做功能定位与依赖位置增量分析,产出可下钻交互依赖图与多形态文档的源码级架构逆向案例。
Hermes 七层架构总览
对八千余文件的工业级 AI Agent 项目做七层架构总览逆向,揭示其「越用越聪明」的自进化闭环如何在层间传导的控制型架构案例。
MCP 四件套选型对比
对四个同类 MCP 服务器做源码级能力与成本对比,并以常驻 token 预算为轴给出分级接入策略的技术选型实战案例。
Claude Code 架构逆向
以社区逆向源码、系统提示词与官方文档三源交叉验证,还原一个商业 Agent 的查询引擎、子Agent、工具与权限体系的逆向分析案例。
控制理论⊗Agent 设计
将控制理论五维(负反馈 / 状态估计 / PID / 鲁棒 / 分层)系统映射到 Agent 工程环节,并以真实产品案例验证的跨学科方法论案例。
§8信源与核验
核验结论:该扩展虽无构建与依赖,仍以适配器、评分链、双通道与脱敏等结构承载复杂变化点,架构设计量并未因零构建而减少 [LOC-021]
§9原始关系清单
展开:本节点的全部原始关系边(4 条,含边 ID 与方向)
| 关系 | 方向 | 对端节点 | 说明 |
|---|---|---|---|
| 案例印证 | → ESS-G-03 | 边界与接口隔离 E-943 | 印证:以双通道与密钥隔离划清信任与能力边界 |
| 案例印证 | → ESS-G-05 | 架构风格 E-941 | 印证:以适配器与事件驱动组合出可扩展的架构风格 |
| 案例印证 | → MTH-O-03 | 技术选型的够用原则 E-942 | 印证:零依赖零构建按约束选择刚好够用的技术 |
| 案例印证 | → TEC-M-03 | 可修改性战术实现 E-13 | 印证:适配器外置站点差异,隔离变化点缩小影响半径 |