transweb.cn AI Agent 智能执行套件。支持单应用执行、多应用串联流水线(前一个输出作为后一个输入)、自动匹配或创建应用。全程浏览器自动化,输出 Markdown 文档。 Keywords: AI Agent, transweb, 执行应用, 创建应用, 串联, 流水线, pipeline, 博文...
一句话理解: 用户说需求 → 自动匹配/创建 transweb.cn 应用 → 浏览器打开 → 填入 → 生成 → 提取结果 → 保存 Markdown。
本技能 完全依赖 browser 工具 执行,不具备浏览器权限时无法工作。
权限项要求OpenClaw 配置路径browser 工具必须可用工具策略中启用 browser``browser enabled``true``browser.enabled``browser evaluateEnabled``true(结果提取依赖 JS evaluate)browser.evaluateEnabled沙箱浏览器profile: "openclaw"自动托管,无需手动配置用户浏览器(可选)profile: "user"仅当用户需要登录态时使用
每次执行 第一步 检查:
text
browser action: status
若通过 sessions_spawn 派生子代理执行本技能:
sandbox: "inherit" 确保继承浏览器访问能力browser 工具可用模式触发方式说明single单一需求匹配或创建一个应用,执行并输出pipeline多步骤需求 / 显式指定多个应用串联执行,逐步传递输出list已有哪些应用 / 我的应用列表展示 apps.jsonadd添加应用 id=xxx / 注册应用 id=xxx通过 ID 新增应用到注册表remove移除应用 xxx / 删除应用 xxx通过名称从注册表中移除应用
先用A再做B、 串连执行 A、B → pipeline写博客并润色)→ pipeline添加应用/ 注册应用/ 新增应用 + id= → add移除应用/ 删除应用/ 移除/ 删除 + 应用名称 → remove路径: {SKILL_DIR}/apps.json
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...
流程:
校验 ID — 必须是 32 位十六进制字符串,否则提示格式错误
查重 — 检查 apps.json 中是否已存在相同 id,已存在则提示"该应用已注册"
打开页面获取信息 text
browser action: navigate
profile: "openclaw"
url: https://transweb.cn/?id={app_id}
等待页面加载后,通过 snapshot 或 evaluate 提取:
name:页面标题 / h1 文本description:页面描述文本(如副标题、meta description)生成关键词 — 从 name 和 description 中提取 3~6 个关键词
写入 apps.json — 读取现有内容,追加新条目,写回文件
返回确认
text
✅ 应用已添加
名称:{name}
ID:{id}
描述:{description}
关键词:{keyword1}, {keyword2}, ...
apps.json 新条目格式:
json
{
"id": "{32位hex}",
"name": "应用名称",
"description": "应用描述",
"keywords": ["关键词1", "关键词2"],
"createdAt": "{ISO 8601 时间戳}"
}
触发: 用户说 移除应用 博文框架、 删除应用 爆款润色助手
流程:
读取 apps.json
精确匹配名称 — 在 apps 数组中查找 name 字段完全等于用户指定的名称
未找到 — 返回提示:"未找到名为「{name}」的应用,当前已注册应用:\n{列表}"
确认移除 — 展示即将移除的应用信息,等待用户确认: text
⚠️ 即将移除以下应用,确认吗?
名称:博文框架
ID:35fa46fd2f9b57f814018134ef14ae1f
描述:内容策划编辑:生成高效的文章标题与创作大纲
回复"确认"继续,"取消"放弃。
执行移除 — 从 apps 数组中删除该条目,写回 apps.json
返回确认
text
✅ 已移除应用「博文框架」(id: 35fa46fd...)
当前剩余 {N} 个应用。
用户输入动作已有哪些应用读取并格式化展示 apps.json应用详情 博文框架展示指定应用的完整信息(id、描述、关键词、创建时间)
条件方式输入 ≤ 500 字URL 直接传参输入 > 500 字打开纯净页面 + act kind=type 注入
≤ 500 字:
text
browser action: navigate
profile: "openclaw"
url: https://transweb.cn/?id={app_id}&auto=true&input={url_encode(input_text)}
> 500 字:
text
browser action: navigate
profile: "openclaw"
url: https://transweb.cn/?id={app_id}
等待页面加载完成后:
text
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 更稳定。
text
browser action: snapshot → 找到包含"生成"文字的按钮 ref
browser action: act kind=click ref={按钮ref}
匹配词: 立即生成、 生成文章、 开始一键润色、 生成 等。
text
browser action: act kind=wait timeMs=15000
browser action: snapshot → 检查结果区域
若结果未出现,追加等待(最多再等 15s,总计 30s 超时):
text
browser action: act kind=wait timeMs=15000
browser action: snapshot
text
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,然后关闭标签页。
text
browser action: close targetId={当前tab}
分析用户输入,确定有序步骤。每步对应一个应用:
显式指定: 先用博文框架生成大纲,再用爆款润色助手润色
text
Step 1: app=博文框架 input=用户原始需求
Step 2: app=爆款润色助手 input=Step 1 的完整输出
自动拆分: 帮我写一篇完整的科技博客,要有大纲框架,再扩展正文
text
Step 1: app=博文框架 input=帮我写一篇科技博客大纲
Step 2: app=科技博客 input=Step 1 输出(>500字 → 用 type 注入)
text
🔗 执行计划(共 {N} 步)
① 【博文框架】→ 生成文章大纲
输入:帮我写一篇关于AI趋势的博客
② 【爆款润色助手】→ 润色内容
输入:① 的输出结果
最终输出:最后一步的结果
对每个步骤 i:
i==1 用原始需求, i>1 用 step i-1 的完整输出(不截断)act kind=type 注入next_input = step_output,不限字数text
✅ 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、Bpipeline 模式
场景处理浏览器不可用自检阶段终止,提示用户启用 browser.enabled + browser.evaluateEnabled某步骤执行失败(>30s 无结果)保留已完成步骤结果,提示跳过或重试evaluate 提取失败尝试 snapshot 读取文本内容作为兜底type 注入输入框失败尝试 snapshot 找替代选择器,或提示用户手动输入应用不在列表中自动创建缺失的应用并注册页面加载失败重试一次,仍失败则终止并报错添加应用时 ID 格式错误提示用户:ID 必须是 32 位十六进制字符串添加应用时 ID 已存在提示"该应用已注册",不重复添加移除应用时名称未匹配列出已有应用供用户确认名称
act kind=type 比 JS evaluate 注入更可靠,能正确触发前端框架响应式"openclaw" 沙箱浏览器;仅当应用需要登录态时使用 "user" profile