Install
openclaw skills install @liuwenjin/agent-web-cputransweb.cn AI Agent 智能执行套件。支持单应用执行、多应用串联流水线(前一个输出作为后一个输入)、自动匹配或创建应用。全程浏览器自动化,输出 Markdown 文档。 Keywords: AI Agent, transweb, 执行应用, 创建应用, 串联, 流水线, pipeline, 博文框架, 浏览器自动化.
openclaw skills install @liuwenjin/agent-web-cpu一句话理解: 用户说需求 → 自动匹配/创建 transweb.cn 应用 → 浏览器打开 → 填入 → 生成 → 提取结果 → 保存 Markdown。
本技能完全依赖 browser 工具执行,不具备浏览器权限时无法工作。
| 权限项 | 要求 | OpenClaw 配置路径 |
|---|---|---|
browser 工具 | 必须可用 | 工具策略中启用 browser |
browser enabled | true | browser.enabled |
browser evaluateEnabled | true(结果提取依赖 JS evaluate) | browser.evaluateEnabled |
| 沙箱浏览器 | profile: "openclaw" | 自动托管,无需手动配置 |
| 用户浏览器(可选) | profile: "user" | 仅当用户需要登录态时使用 |
每次执行第一步检查:
browser action: status
若通过 sessions_spawn 派生子代理执行本技能:
sandbox: "inherit" 确保继承浏览器访问能力browser 工具可用| 模式 | 触发方式 | 说明 |
|---|---|---|
| single | 单一需求 | 匹配或创建一个应用,执行并输出 |
| pipeline | 多步骤需求 / 显式指定多个应用 | 串联执行,逐步传递输出 |
| list | 已有哪些应用 / 我的应用列表 | 展示 apps.json |
| add | 添加应用 id=xxx / 注册应用 id=xxx | 通过 ID 新增应用到注册表 |
| remove | 移除应用 xxx / 删除应用 xxx | 通过名称从注册表中移除应用 |
先用A再做B、串连执行 A、B → pipeline写博客并润色)→ pipeline添加应用/注册应用/新增应用 + id= → add移除应用/删除应用/移除/删除 + 应用名称 → remove路径: {SKILL_DIR}/apps.json
{
"apps": [
{
"id": "35fa46fd2f9b57f814018134ef14ae1f",
"name": "博文框架",
"description": "内容策划编辑:生成高效的文章标题与创作大纲",
"keywords": ["博文", "文章", "大纲", "写作", "标题"],
"createdAt": "2026-04-01T08:49:00+08:00"
}
],
"_schema": "v2"
}
匹配算法(≥5 分视为命中):
| 信号 | 分数 |
|---|---|
| 应用名出现在用户输入中 | +10 |
| 关键词命中 | +5/词 |
| 描述词命中(>2 字) | +2/词 |
匹配失败 → 自动创建应用 → 写入 apps.json → 执行。
触发: 用户说 添加应用 id=xxx、注册应用 id=abc123...
流程:
browser action: navigate
profile: "openclaw"
url: https://transweb.cn/?id={app_id}
snapshot 或 evaluate 提取:
name:页面标题 / h1 文本description:页面描述文本(如副标题、meta description)✅ 应用已添加
名称:{name}
ID:{id}
描述:{description}
关键词:{keyword1}, {keyword2}, ...
apps.json 新条目格式:
{
"id": "{32位hex}",
"name": "应用名称",
"description": "应用描述",
"keywords": ["关键词1", "关键词2"],
"createdAt": "{ISO 8601 时间戳}"
}
触发: 用户说 移除应用 博文框架、删除应用 爆款润色助手
流程:
apps 数组中查找 name 字段完全等于用户指定的名称⚠️ 即将移除以下应用,确认吗?
名称:博文框架
ID:35fa46fd2f9b57f814018134ef14ae1f
描述:内容策划编辑:生成高效的文章标题与创作大纲
回复"确认"继续,"取消"放弃。
apps 数组中删除该条目,写回 apps.json✅ 已移除应用「博文框架」(id: 35fa46fd...)
当前剩余 {N} 个应用。
| 用户输入 | 动作 |
|---|---|
已有哪些应用 | 读取并格式化展示 apps.json |
应用详情 博文框架 | 展示指定应用的完整信息(id、描述、关键词、创建时间) |
| 条件 | 方式 |
|---|---|
| 输入 ≤ 500 字 | URL 直接传参 |
| 输入 > 500 字 | 打开纯净页面 + act kind=type 注入 |
≤ 500 字:
browser action: navigate
profile: "openclaw"
url: https://transweb.cn/?id={app_id}&auto=true&input={url_encode(input_text)}
> 500 字:
browser action: navigate
profile: "openclaw"
url: https://transweb.cn/?id={app_id}
等待页面加载完成后:
browser action: snapshot → 定位输入框 ref
browser action: act kind=click ref={输入框ref} → 聚焦
browser action: act kind=type ref={输入框ref} text={input_text} → 逐字符输入
act kind=type模拟真实键盘输入,自动触发 Vue/React 响应式回调,比 JS evaluate 更稳定。
browser action: snapshot → 找到包含"生成"文字的按钮 ref
browser action: act kind=click ref={按钮ref}
匹配词:立即生成、生成文章、开始一键润色、生成 等。
browser action: act kind=wait timeMs=15000
browser action: snapshot → 检查结果区域
若结果未出现,追加等待(最多再等 15s,总计 30s 超时):
browser action: act kind=wait timeMs=15000
browser action: snapshot
browser action: act kind=evaluate
fn: |
const container = document.querySelector('.CardItem_contentArea');
if (!container) return { error: 'container not found' };
const h1 = container.querySelector('h1');
const pre = container.querySelector('pre.tw-whitespace-pre-wrap');
const h2s = container.querySelectorAll('h2');
// 结构化提取:h1 + h2 + 段落
if (pre && h1) {
let md = `# ${h1.textContent.trim()}\n\n`;
h2s.forEach(h2 => {
md += `## ${h2.textContent.trim()}\n\n`;
let sib = h2.nextElementSibling;
while (sib && sib.tagName !== 'H2') {
if (sib.tagName === 'P') md += sib.textContent.trim() + '\n\n';
sib = sib.nextElementSibling;
}
});
return { success: true, output: md };
}
// 兜底:纯文本
return { success: true, output: container.innerText.trim() };
将提取的 Markdown 保存至 ~/Downloads/{title}_{timestamp}.md,然后关闭标签页。
browser action: close targetId={当前tab}
分析用户输入,确定有序步骤。每步对应一个应用:
显式指定: 先用博文框架生成大纲,再用爆款润色助手润色
Step 1: app=博文框架 input=用户原始需求
Step 2: app=爆款润色助手 input=Step 1 的完整输出
自动拆分: 帮我写一篇完整的科技博客,要有大纲框架,再扩展正文
Step 1: app=博文框架 input=帮我写一篇科技博客大纲
Step 2: app=科技博客 input=Step 1 输出(>500字 → 用 type 注入)
🔗 执行计划(共 {N} 步)
① 【博文框架】→ 生成文章大纲
输入:帮我写一篇关于AI趋势的博客
② 【爆款润色助手】→ 润色内容
输入:① 的输出结果
最终输出:最后一步的结果
对每个步骤 i:
i==1 用原始需求,i>1 用 step i-1 的完整输出(不截断)act kind=type 注入next_input = step_output,不限字数✅ Pipeline 执行完成!(共 {N} 步)
① 【博文框架】✅ 生成大纲(42字)
② 【爆款润色助手】✅ 润色内容(380字)
📄 已保存至:~/Downloads/{title}_{timestamp}_pipeline.md
---
{最后一步的 Markdown 内容}
| 元素 | 选择器 | 备注 |
|---|---|---|
| 结果容器 | .CardItem_contentArea | 主提取目标 |
| 标题 | h1 / h2.tw-text-xl | |
| 正文 | pre.tw-whitespace-pre-wrap | |
| 生成按钮 | 包含 生成 文本的 button | 用 snapshot 定位 |
| 输入框 | input[type="text"] 或 textarea | 用 snapshot 定位 ref |
| 用户输入 | 动作 |
|---|---|
已有哪些应用 / 我的应用列表 | 读取并展示 apps.json |
添加应用 id=xxx / 注册应用 id=xxx | 通过 ID 新增应用到注册表 |
移除应用 xxx / 删除应用 xxx | 通过名称从注册表中移除应用 |
应用详情 xxx | 展示指定应用的完整信息 |
id=xxx 需求描述 | 强制使用指定 id 执行 |
先用A再做B / 串连执行 A、B | pipeline 模式 |
| 场景 | 处理 |
|---|---|
| 浏览器不可用 | 自检阶段终止,提示用户启用 browser.enabled + browser.evaluateEnabled |
| 某步骤执行失败(>30s 无结果) | 保留已完成步骤结果,提示跳过或重试 |
evaluate 提取失败 | 尝试 snapshot 读取文本内容作为兜底 |
type 注入输入框失败 | 尝试 snapshot 找替代选择器,或提示用户手动输入 |
| 应用不在列表中 | 自动创建缺失的应用并注册 |
| 页面加载失败 | 重试一次,仍失败则终止并报错 |
| 添加应用时 ID 格式错误 | 提示用户:ID 必须是 32 位十六进制字符串 |
| 添加应用时 ID 已存在 | 提示"该应用已注册",不重复添加 |
| 移除应用时名称未匹配 | 列出已有应用供用户确认名称 |
act kind=type 比 JS evaluate 注入更可靠,能正确触发前端框架响应式"openclaw" 沙箱浏览器;仅当应用需要登录态时使用 "user" profile