spa-api-extract:WebFetch 失败时从 SPA 内部 JSON API 抽数据

前言

在 DeepSeek Harness(DSH)里做联网任务时,常见路径是用 WebFetch 把页面拉成可读文本。遇到 React、Vue、Next、Nuxt 等客户端渲染的单页应用(SPA)时,这条路径经常失灵:超时、只返回打包混淆后的 JS,或 HTML 里只剩空壳。真实数据往往在页面背后的 JSON API 里,而不是首屏 HTML。

下面介绍社区插件 spa-api-extract(维护者 sunwindy91,分类:联网工具)。它把一套可复现的 CLI 流水线写进 Agent Skill,在 WebFetch 失败时改走 curl、grep 与 Python,定位并只读调用页面内部使用的 JSON 接口,再把结构化结果落到 UTF-8 文件。插件本身只注册技能知识,加载时不发起网络请求、不暴露宿主工具。

这是什么

spa-api-extract 是一个 Agent Skill 插件,npm 包名为 @sunwindy91/dsh-spa-api-extract(当前资料中版本 0.1.2),许可证 MIT。仓库同时遵循开放 Agent Skills 约定(根目录 SKILL.md + frontmatter),也可整目录放入其他支持该格式的 harness 技能目录。

DSH 侧通过 Cordis patch 把技能挂到 ctx.skills;index.js 注入 skills 模块,lib/skills.js 注册根目录 SKILL.md。详细命令在 SKILL.md,grep 正则与 SPA 常见数据形态(REST、GraphQL、__NEXT_DATA__、window.__* 等)在按需加载的 reference.md。

核心功能

插件描述的能力可以概括为一条固定流水线(资料原文步骤):

  1. 确认失败信号 — 超时、仅 JS、空壳 → 判定为 SPA 场景。
  2. curl-probe — 带 -sS -m 拉取响应头与原始 HTML 骨架。
  3. grep — 在 HTML/JS 中找 fetch()、/api/ 端点、<script src> 以及 BASE 路径推导线索。
  4. 重建并请求 JSON API — 只读 GET,必要时携带 URL 上的鉴权 query(例如 ?t=xxxx)。
  5. Python 解析 — 先看结构,再提取到 UTF-8 文件(避免 Windows 下 GBK 乱码)。
  6. 校验 — 记录数、字段完整性、输出非空。

When to use(资料列举):

  • 目标页是客户端渲染的 SPA。
  • 真实数据在 JSON API,不在初始 HTML。
  • URL 带 token 类 query 参数。
  • WebFetch 已超时或只返回脚本。

安全与合规(资料强调):

  • 默认只读,仅使用 GET;写操作需用户明确授权。
  • Token 视为秘密,不得写入最终输出、提交日志或共享文件。
  • 仅访问有权访问的目标,遵守 ToS、robots 与限速。
  • 无遥测、无监听、无回传;正文为纯指令与占位示例(HOST / PATH / TOKEN)。

安装与启用

安装前需已有 @deepseek-ai/dsh-base(挂载技能注册表)。在 dsh 部署中执行(命令来自仓库 README):

dsh plugin --profile web add github:sunwindy91/spa-api-extract

仓库自带 cordis.patch.yml,安装后由 dsh 自动挂载,无需手工 patch。安装过程会把参数转发给 profile 目录内的 pnpm,需要能访问 github.com。若本机 git 配置了代理但代理未运行,可能出现 ECONNREFUSED,需保证代理可用或临时取消 git 全局 http.proxy。

yaml 为 peerDependency(宿主通常已提供);若环境中缺失,插件会退化为内置极简 frontmatter 解析,不会因缺依赖而加载失败。

也可不使用 dsh,将目录放到 Agent 技能路径,例如:

~/.qwenworkcn/skills/spa-api-extract/

典型用法

启用插件后,模型应加载 spa-api-extract 技能,按 SKILL.md 逐步执行。整体思路是:先确认 WebFetch 失败属于 SPA 场景,再用 curl 取原始页面,用 grep 从 bundle 或内联脚本里挖出 API 路径与参数,构造与浏览器一致的只读 GET,最后用 Python 探查 JSON 结构并写入 UTF-8 结果文件。

资料未给出绑定某一真实站点的完整复制粘贴示例;占位符与正则库、鉴权变体、故障排查表见 reference.md。执行环境使用的是 当前 dsh 进程权限下的 curl 与 python,与你在终端手动跑同一套命令等价。

适用场景与注意

适合:需要在 Agent 工作流里稳定从 SPA 后台 API 抽结构化数据、且 HTML 抓取已明确失败的开发者;与 DSH「一切皆插件」的技能扩展方式一致。

注意:

  • 插件 0 GitHub Stars(资料标注);安装前建议在 GitHub 阅读源码与 LICENSE。
  • 只注册知识,不替代你对目标站点授权与合规的判断。
  • 社区目录 SkillHub 插件页 与 GitHub 为独立信息源,与 DeepSeek / 幻方无官方从属关系。

链接

  • 目录页:https://www.skillhub.cn/plugins/sunwindy91/spa-api-extract
  • GitHub:https://github.com/sunwindy91/spa-api-extract

经过上面的步骤,你可以在 WebFetch 搞不定 SPA 时,把「找内部 JSON API + 只读拉取 + UTF-8 落盘」固化成可重复的技能流程,而不是每次临时猜 bundle 里的接口路径。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye