SuperAPI AI 工具集

opencli-repair

编程与开发

查看项目

更新于 10-15 12:28

技能介绍

用途

OpenCLI Repair 是一个 AI 驱动的适配器自修复技能。当某个 OpenCLI 适配器因为目标网站更改了 DOM、API 或认证流程而失效时,使用该技能来诊断失败原因并修补适配器。

前置条件

运行以下命令验证扩展与守护进程(daemon)的连通性:

opencli doctor

何时使用

当 opencli <site> <command> 失败并出现以下错误时使用:

  • SELECTOR — 找不到元素(DOM 已变更)
  • EMPTY_RESULT — 未返回数据(API 响应已变更)
  • API_ERROR / NETWORK — 端点已移动或损坏
  • PAGE_CHANGED — 页面结构不再匹配
  • COMMAND_EXEC — 适配器逻辑中的运行时错误
  • TIMEOUT — 页面加载方式不同,适配器等待了错误的对象

使用方式

第 1 步:收集诊断上下文

以诊断模式运行失败的命令:

OPENCLI_DIAGNOSTIC=1 opencli <site> <command> [args...] 2>diagnostic.json

这会在 stderr 中 ___OPENCLI_DIAGNOSTIC___ 标记之间输出一个 RepairContext JSON:

{
  "error": {
    "code": "SELECTOR",
    "message": "Could not find element: .old-selector",
    "hint": "The page UI may have changed."
  },
  "adapter": {
    "site": "example",
    "command": "example/search",
    "sourcePath": "/path/to/clis/example/search.ts",
    "source": "// full adapter source code"
  },
  "page": {
    "url": "https://example.com/search",
    "snapshot": "// DOM snapshot with [N] indices",
    "networkRequests": [],
    "consoleErrors": []
  },
  "timestamp": "2025-01-01T00:00:00.000Z"
}

解析它:

# Extract JSON between markers from stderr output
cat diagnostic.json | sed -n '/___OPENCLI_DIAGNOSTIC___/{n;p;}'

第 2 步:分析失败原因

阅读诊断上下文和适配器源码,对根本原因进行分类:

错误码 可能原因 修复策略
SELECTOR DOM 重构,class/id 被重命名 探索当前 DOM → 找到新选择器
EMPTY_RESULT API 响应结构变更,或数据位置移动 检查网络 → 找到新的响应路径
API_ERROR 端点 URL 变更,需要新参数 通过网络拦截发现新 API
AUTH_REQUIRED 登录流程变更,cookie 过期 使用 operate 走一遍登录流程
TIMEOUT 页面加载方式不同,出现 spinner/懒加载 添加/更新等待条件
PAGE_CHANGED 重大改版 可能需要完全重写适配器

需要回答的关键问题:

  • 适配器试图做什么?(阅读 source 字段)
  • 失败时页面是什么样子?(阅读 snapshot 字段)
  • 发生了哪些网络请求?(阅读 networkRequests)
  • 适配器期望的内容与页面实际提供的内容之间差距在哪里?

第 3 步:探索当前网站

使用 opencli operate 检查实时网站。切勿使用已损坏的适配器——它只会再次失败。

DOM 变更(SELECTOR 错误):

# Open the page and inspect current DOM
opencli operate open https://example.com/target-page && opencli operate state

# Look for elements that match the adapter's intent
# Compare the snapshot with what the adapter expects

API 变更(API_ERROR、EMPTY_RESULT):

# Open page with network interceptor, then trigger the action manually
opencli operate open https://example.com/target-page && opencli operate state

# Interact to trigger API calls
opencli operate click <N> && opencli operate network

# Inspect specific API response
opencli operate network --detail <index>

认证变更(AUTH_REQUIRED):

# Check current auth state
opencli operate open https://example.com && opencli operate state

# If login page: inspect the login form
opencli operate state  # Look for login form fields

第 4 步:修补适配器

阅读适配器源文件并进行针对性修复:

# Read the adapter
cat <sourcePath from diagnostic>

常见修复:

选择器更新:

// Before: page.evaluate('document.querySelector(".old-class")...')
// After:  page.evaluate('document.querySelector(".new-class")...')

API 端点变更:

// Before: const resp = await page.evaluate(`fetch('/api/v1/old-endpoint')...`)
// After:  const resp = await page.evaluate(`fetch('/api/v2/new-endpoint')...`)

响应结构变更:

// Before: const items = data.results
// After:  const items = data.data.items  // API now nests under "data"

等待条件更新:

// Before: await page.waitForSelector('.loading-spinner', { hidden: true })
// After:  await page.waitForSelector('[data-loaded="true"]')

修补规则:

  • 做最小改动——只修复损坏的部分,不要重构
  • 保持相同的输出结构——列和返回格式必须保持兼容
  • 优先使用 API 而非 DOM 抓取——如果在探索过程中发现 JSON API,就切换到它
  • 只使用 @jackwener/opencli/* 导入——绝不添加第三方包导入
  • 修补后测试——再次运行命令进行验证

第 5 步:验证修复

# Run the command normally (without diagnostic mode)
opencli <site> <command> [args...]

如果仍然失败,回到第 3 步继续探索。如果网站已发生根本性变化(重大改版、功能移除),则报告该适配器需要完全重写。

何时放弃

并非所有失败都能通过快速修补修复:

  • 网站需要 CAPTCHA——无法自动化
  • 功能被完全移除——数据已不存在
  • 重大改版——需要通过 opencli-explorer 技能完全重写适配器
  • 被限流 / IP 被封——不是适配器问题

在这些情况下,应向用户清楚说明情况,而不是做无用的修补。

示例修复会话

  1. 用户运行:opencli zhihu hot → 失败:SELECTOR "Could not find element: .HotList-item"

  2. AI 运行:OPENCLI_DIAGNOSTIC=1 opencli zhihu hot 2>diag.json → 获得包含 DOM 快照的 RepairContext,显示页面已加载

  3. AI 阅读诊断:快照显示页面已加载,但使用的是 ".HotItem" 而不是 ".HotList-item"

  4. AI 探索:opencli operate open https://www.zhihu.com/hot && opencli operate state → 确认新类名 ".HotItem" 及其子元素 ".HotItem-content"

  5. AI 修补:编辑 clis/zhihu/hot.ts——将 ".HotList-item" 替换为 ".HotItem"

  6. AI 验证:opencli zhihu hot → 成功:返回热门话题

适用场景

适用于 OpenCLI 适配器因目标网站变更而失效时的诊断与修复,尤其是 DOM 选择器变更、API 端点或响应结构变更、认证流程变更、页面加载方式变更等场景。

限制

  • 网站需要 CAPTCHA 时无法自动化修复
  • 功能被完全移除时无法修复
  • 重大改版可能需要完全重写适配器
  • 被限流或 IP 被封不属于适配器问题
  • 修补时必须保持输出结构兼容,且只能使用 @jackwener/opencli/* 导入