Config Validator
验证 OpenClaw 配置字段与值的正确性,提供官方 schema 参考和示例。
自动修复 Playwright 下载文件名变 UUID 的问题,保留原始文件名。
openclaw skills install @squall0925/playwright-download-fix命令、参数、文件名以原文为准
Playwright 下载的文件名是 UUID 而不是原始文件名?这个 skill 帮你自动修复这个问题。
当使用 Playwright 下载文件时,经常会遇到:
f63a84ec-abd1-48fa-a748-11ebeca07935(UUID)MVIMG_20250706_131754.jpgdownload 事件并使用 suggestedFilename() 获取原始文件名这个 skill 提供了一个 DownloadHelper 模块,自动监听下载事件并用正确的文件名保存文件。
确保快捷命令已添加到 shell 配置文件:
\\\`bash
echo "alias pw-start='cd ~/.openclaw-autoclaw/workspace && node pw-start.js'" >> ~/.zshrc
source ~/.zshrc
pw-start # 打开默认页面(智联招聘)
pw-start https://example.com # 打开指定 URL
\\\`
每次运行都会自动加载 DownloadHelper skill 并显示配置信息:
========================================
📋 配置信息
========================================
🌐 User-Agent: 真实 Chrome (macOS)
📂 下载目录: /Users/allen/downloads
🔍 调试模式: 开启
========================================\\\`bash
cd ~/.openclaw-autoclaw/skills/playwright-download-fix
node standalone-script.js
\\\`
\\\`bash
cp ~/.openclaw-autoclaw/skills/playwright-download-fix/download-helper.js .
\\\`
然后在脚本中使用:
\\\`javascript
const { chromium } = require('playwright');
const DownloadHelper = require('./download-helper');
async function myScript() {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({
acceptDownloads: true,
});
const page = await context.newPage();
// 初始化下载助手
const helper = new DownloadHelper(page, {
downloadDir: '~/downloads',
debug: true
});
const downloadDir = await helper.setup();
console.log(\📂 下载目录: \${downloadDir}\);
// 你的自动化代码...
await page.goto('https://example.com');
await page.click('#download-button');
// 获取下载的文件列表
console.log('下载的文件:', helper.getDownloadedFiles());
await browser.close();
}
myScript();
\\\`
\\\`bash
npm install playwright
npx playwright install chromium
\\\`
~/downloads)有写权限默认配置(可在 pw-start.js 中修改):
| 配置项 | 默认值 | 说明 |
|---|---|---|
| User-Agent | Chrome 122.0.0.0 (macOS) | 模拟真实浏览器 |
| Locale | zh-CN | 中文环境 |
| Timezone | Asia/Shanghai | 中国时区 |
| 下载目录 | ~/downloads | 文件保存位置 |
| 调试模式 | 开启 | 显示下载信息 |
为了更接近真实浏览器,默认启用以下配置:
\\\`javascript
const context = await browser.newContext({
userAgent: realChromeUA,
locale: 'zh-CN',
timezoneId: 'Asia/Shanghai',
bypassCSP: true,
javaScriptEnabled: true,
acceptDownloads: true,
});
\\\`
\\\`javascript
new DownloadHelper(page, options)
\\\`
参数:
page\ (Page) - Playwright page 实例options\ (Object) - 配置选项 - \downloadDir\ (string) - 下载目录路径,支持 \~\ 符号,默认 \~/downloads\
- \debug\ (boolean) - 是否显示调试信息,默认 \false\
初始化下载监听器,创建下载目录(如果不存在)。
\\\`javascript
const downloadDir = await helper.setup();
\\\`
返回: 下载目录的绝对路径
获取本次会话中下载的所有文件路径列表。
\\\`javascript
const files = helper.getDownloadedFiles();
console.log('下载的文件:', files);
\\\`
返回: 文件路径数组
清空下载历史记录。
\\\`javascript
helper.clearHistory();
\\\`
移除下载监听器。
\\\`javascript
helper.dispose();
\\\`
\\\`javascript
const { chromium } = require('playwright');
const DownloadHelper = require('./download-helper');
async function downloadSingle() {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({
acceptDownloads: true,
});
const page = await context.newPage();
const helper = new DownloadHelper(page, {
downloadDir: '~/downloads',
debug: true
});
await helper.setup();
await page.goto('https://example.com');
await page.click('#download-button');
await page.waitForTimeout(3000);
const files = helper.getDownloadedFiles();
console.log('下载的文件:', files);
await browser.close();
}
downloadSingle();
\\\`
\\\`javascript
const { chromium } = require('playwright');
const DownloadHelper = require('./download-helper');
async function downloadMultiple(urls) {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({ acceptDownloads: true });
const page = await context.newPage();
const helper = new DownloadHelper(page, {
downloadDir: '~/downloads',
debug: true
});
await helper.setup();
for (const url of urls) {
await page.goto(url);
await page.click('.download-link');
await page.waitForTimeout(2000);
}
console.log(\共下载 \${helper.getDownloadedFiles().length} 个文件\);
await browser.close();
}
downloadMultiple(['url1', 'url2', 'url3']);
\\\`
\\\`javascript
const { chromium } = require('playwright');
const DownloadHelper = require('./download-helper');
async function downloadResumes() {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
acceptDownloads: true,
});
const page = await context.newPage();
const helper = new DownloadHelper(page, {
downloadDir: '~/downloads',
debug: true
});
await helper.setup();
// 导航到搜索页面
await page.goto('https://rd6.zhaopin.com/app/search');
// 手动登录...
// 搜索候选人并下载简历
// ...
await browser.close();
}
downloadResumes();
\\\`
page.on('download', ...)\ 监听所有下载download.suggestedFilename()\ 获取服务器返回的真实文件名可能原因:
解决方案:
puppeteer-extra-plugin-stealth\\\\`javascript
// 连接真实 Chrome
const browser = await chromium.connectOverCDP('http://localhost:9222');
\\\`
可能原因:
acceptDownloads: true\解决方案:
\\\`javascript
// 1. 确保设置 acceptDownloads
const context = await browser.newContext({
acceptDownloads: true, // 必须设置
});
// 2. 检查目录权限
fs.accessSync(downloadDir, fs.constants.W_OK);
// 3. 查看 debug 输出
const helper = new DownloadHelper(page, { debug: true });
\\\`
可能原因:
downloadDir\ 配置错误解决方案:
\\\`javascript
// 使用绝对路径
const helper = new DownloadHelper(page, {
downloadDir: '/Users/yourname/Downloads', // 绝对路径
});
// 或使用 ~ 符号
const helper = new DownloadHelper(page, {
downloadDir: '~/downloads', // 会自动解析为用户主目录
});
\\\`
解决方案:
\\\`bash
echo "alias pw-start='cd ~/.openclaw-autoclaw/workspace && node pw-start.js'" >> ~/.zshrc
source ~/.zshrc
\\\`
主启动脚本,位于 \~/.openclaw-autoclaw/workspace/pw-start.js\
可配置项:
\\\`javascript
const CONFIG = {
userAgent: '...', // 自定义 User-Agent
locale: 'zh-CN', // 语言
timezoneId: 'Asia/Shanghai', // 时区
downloadDir: '~/downloads', // 下载目录
debug: true, // 调试模式
defaultUrl: '...' // 默认 URL
};
\\\`
独立运行脚本,位于 \~/.openclaw-autoclaw/skills/playwright-download-fix/standalone-script.js\
特点:
核心模块,可复制到任何项目使用。
\\\`bash
pw-start
\\\`
\\\`bash
pw-start https://example.com
\\\`
\\\`bash
pw-start http://localhost:3000
\\\`
在自动化脚本中集成 \DownloadHelper\,实现批量下载。
\\\`bash
ls ~/downloads
\\\`
当前仅支持 Chromium,但可以通过修改 \pw-start.js\ 使用 Firefox 或 WebKit:
\\\`javascript
const { firefox } = require('playwright');
const browser = await firefox.launch();
\\\`
download-helper.js\ - 核心下载处理模块standalone-script.js\ - 独立运行脚本pw-start.js\ - 快速启动脚本(位于 workspace)example.js\ - 使用示例README.md\ - 快速指南MIT
已收录 1 个 Skill