بنقرة واحدة
web-form-fill
网络表单填报技能 — 从信息搜集到浏览器填报的完整工作流,确保框架受控组件正确写入、页面切换前暂存、最终提交由用户确认。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
网络表单填报技能 — 从信息搜集到浏览器填报的完整工作流,确保框架受控组件正确写入、页面切换前暂存、最终提交由用户确认。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
Publish videos to Bilibili (B站) via Open Platform API (OAuth2). Supports chunked video upload, cover image, tags, and partition selection. Requires BILIBILI_APP_ID and BILIBILI_APP_SECRET environment variables.
内容校准预测循环——打分 → 盲预测 → T+3d复盘 → 进化 rubric。按平台独立迭代,每个平台拥有自己的 rubric、校准池、预测日志、受众画像。本技能负责打分(blind sub-agent + score-only.sh + 阈值门 + 流程 1A)与校准闭环;发布记录与数据采集由 published-track 统一管理。
口播视频去口误。自动识别并删除静音、语气词、卡顿词、重复句、残句等,输出干净视频+字幕+剪映草稿。触发词:去口误、剪口播、de-mouth、去除口误
Generate custom WeChat CSS themes from natural language descriptions, WeChat article URLs, or recent articles from a WeChat Official Account. Produces a valid CSS file conforming to wenyan and ready for wx-mp-publisher.
一站式短视频制作。支持文章链接、追爆报告、文字主题等多种输入,用 gen.py 直连火山 Seedance / 阿里云百炼 Wan2.7-HappyHorse 端点生成视频素材(声画同出),FFmpeg 组装成片。
通过浏览器自动化发布视频到微信视频号。处理 wujie shadow DOM,支持视频上传、标题描述填写、即时发布。
| name | web-form-fill |
| description | 网络表单填报技能 — 从信息搜集到浏览器填报的完整工作流,确保框架受控组件正确写入、页面切换前暂存、最终提交由用户确认。 |
| metadata | {"openclaw":{"emoji":"📝"}} |
面向在线表单填报场景:申报系统、比赛报名、补贴申请、信息登记等。核心原则:先看后填、模拟真人、切页必存、提交由人。
依赖技能:browser-guide(浏览器操作最佳实践)
打开浏览器后,先完整浏览整个表单,不要急着填。
form-fields-{项目简称}.md),保持与表单相同的页面/段落结构markdown 文件结构示例:
# XX大赛申报 — 字段清单
## 概要
- 项目名称 [必填] [text] [限50字]
- 行业分类 [必填] [级联下拉] 一级→二级
- 科技创新领域 [必填] [下拉单选]
- 参赛渠道 [必填] [下拉多选]
- 以投代评 [必填] [radio: 是/否]
- 服务需求 [多选] 最多3项
- 期望融资金额 [必填] [number] 万元
- 股权释放比例 [必填] [number] %
## 参赛项目情况
- 项目名称 [必填] [text] (概要中已填,此处联动)
- 前沿技术热点归属 [必填] [text] 最多5个关键词,逗号分隔
- 项目主要技术、产品及服务 [必填] [富文本] 2000字以内,可插入图片
- 项目产品市场分析及竞争优势 [必填] [富文本] 2000字以内
- 商业模式 [必填] [富文本] 1000字以内
## 企业基本信息表
...
## 附件
- 营业执照 [必填] [PDF/图片]
- ...
回到 markdown 文件,逐项填写准备好的内容:
问用户的典型场景:
信息齐全后,打开浏览器逐页填报。
核心原则:统一使用 type + slow 模拟人类逐字输入,对所有站点、所有输入框一视同仁。
唯一方法:locator.type(text, {delay: N})
type 通过 CDP 逐字符发送 keyDown → char → keyup 事件,与真人键盘输入完全一致delay 设置每字符间隔(毫秒),模拟人类打字节奏填写流程:
对每个文本字段:
1. scrollIntoView 确保在视口内
2. 点击聚焦
3. 清空已有内容(见下方清空方式)
4. locator.type("要填入的文本", {delay: 80})
5. 验证写入是否生效(见 3-C 节)
6. 如果验证失败:
a. 清空内容
b. 重新聚焦后重试一次 type
c. 仍然失败 → 记录该字段为"无法自动填写",继续下一个字段
为什么 type + slow 就够了:
| 场景 | type + slow 是否生效 | 原因 |
|---|---|---|
| 原生 input/textarea | ✅ | 逐字符 keyDown/char/keyup 走浏览器真实输入管线 |
| Vue/React v-model 受控组件 | ✅ | 框架监听 input 事件,type 触发的 keyDown → input 事件链完整 |
| Slate/wangEditor/Tiptap 编辑器 | ✅ | 逐字符 keyDown 会触发浏览器的 beforeinput 事件,Slate 监听的就是这个 |
| 有输入 mask 的字段 | ✅ | 逐字符输入让 mask 逻辑逐字处理,不会跳过格式化 |
| 防机器人检测的站点 | ✅ | slow delay 模拟真人节奏,不触发异常检测 |
禁止的方式:
innerHTML / textContent — 框架不感知,placeholder 不消失,暂存后内容丢失el.value = "xxx" 不发事件 — 框架完全无感知fill() — 一次性塞入整段文本,不触发逐字事件链,受控组件和 mask 字段容易出问题逐级尝试:
| 级别 | 方法 |
|---|---|
| A | 点击 select 打开下拉面板 → 点击目标选项 |
| B | 点击 select → 键盘方向键选择 → Enter 确认 |
| C | native setter 设值 + dispatchEvent('change') |
自定义下拉(非原生 <select>,如 Element Plus el-select、Ant Design Select):
Input.dispatchMouseEvent 点击目标选项逐级尝试:
| 级别 | 方法 |
|---|---|
| A | 点击日期输入框 → 在弹出的日历面板中逐年/月/日点击 |
| B | 点击日期输入框聚焦 → type 输入日期字符串 |
| C | native setter 设值 + dispatchEvent |
<input type="file"> 或上传按钮DOM.setFileInputFiles 设置文件路径Patchright 1.60+ 替代方案 — locator.drop():
对于支持拖拽上传的区域(上传 zone、拖放区域),可用 locator.drop() 模拟外部拖拽文件:
// 拖拽本地文件到上传区域
await page.locator('#dropzone').drop({
files: { name: 'report.pdf', mimeType: 'application/pdf', buffer: Buffer.from(fileBytes) },
});
// 拖拽剪贴板数据
await page.locator('#dropzone').drop({
data: {
'text/plain': '粘贴的文本内容',
'text/uri-list': 'https://example.com',
},
});
drop() 通过合成 dragenter → dragover → drop 事件 + DataTransfer 实现,跨浏览器兼容,无需依赖 <input type="file"> 的存在。适用于:
| 控件类型 | 验证方式 | 通过条件 |
|---|---|---|
| 普通 input | 检查 el.value 和 placeholder 可见性 | el.value 包含预期内容 且 placeholder 不可见 |
| contenteditable / Slate 编辑器 | 检查 editor.textContent.trim() 和 placeholder 元素 | textContent 包含预期内容 且 placeholder 元素 display: none。延迟 50ms 再验证 — Slate DOM 更新有延迟 |
| 下拉 select | 检查选中项文本 | 选中项文本与预期一致 |
| radio/checkbox | 检查 el.checked | 选中状态符合预期 |
验证失败的处理:
type切换页面/栏位前,必须执行:
如果当前页没有暂存按钮:
所有页面填写完成后:
原因:框架内部状态未更新。
解决:确保使用 type + slow 逐字输入(会触发完整事件链),而非直接操作 DOM。type 失败时重新聚焦重试。
原因:框架内部状态为空,暂存提交的是空值。
验证方法:暂存后,导航到其他页面再回来,检查字段是否仍有值。
原因:Slate 处理 beforeinput 后,文本已写入数据模型但 DOM 还没渲染完。
解决:验证前延迟 50ms+,等 Slate 微任务队列跑完再读 textContent。
对策:
[contenteditable="true"]),而非工具栏document.activeElement 是编辑器或其子节点对策:
对策:
type 的 delay 调大至 100-150ms,模拟真人打字节奏browser-guide 的 CAPTCHA 处理流程操作1. Runtime.evaluate: el.scrollIntoView({block:'center'})
2. Runtime.evaluate: el.getBoundingClientRect() → {x, y, width, height}
3. Input.dispatchMouseEvent: mousePressed at (x+width/2, y+height/2)
4. Input.dispatchMouseEvent: mouseReleased
1. 聚焦元素(见上)
2. Input.dispatchMouseEvent: mousePressed clickCount=3 (triple-click 全选)
3. Input.dispatchMouseEvent: mouseReleased clickCount=3
4. Input.dispatchKeyEvent: keyDown Backspace
5. Input.dispatchKeyEvent: keyUp Backspace
6. 验证: el.value 为空
如果 triple-click 无效,改用 Ctrl+A:
2. Input.dispatchKeyEvent: keyDown key=a modifiers=2 (Ctrl)
3. Input.dispatchKeyEvent: keyUp key=a modifiers=2
1. 聚焦编辑器
2. Input.dispatchKeyEvent: keyDown key=a modifiers=2 (Ctrl+A 全选)
3. Input.dispatchKeyEvent: keyUp key=a modifiers=2
4. Input.dispatchKeyEvent: keyDown Backspace
5. Input.dispatchKeyEvent: keyUp Backspace
6. 等待 50ms
7. 验证: editor.textContent.trim() 为空
1. 聚焦 + 清空
2. locator.type("要填入的内容", {delay: 80})
3. 验证(见 3-C 节)
防机器人检测场景,delay 调大:
2. locator.type("要填入的内容", {delay: 120})