Install
openclaw skills install roadshow-capture-skill自动化捕获路演/在线演示的所有页面并保存为 PDF。直接使用 Playwright 绕过 Camofox 局限。支持 NetRoadShow 等平台。
openclaw skills install roadshow-capture-skill自动打开路演链接,处理认证流程,逐页截屏保存为 PDF。
直接使用 Playwright,不要用 Camofox。 Camofox 对 NetRoadShow 有严重局限(hash 路由编码、弹窗拦截、reCAPTCHA、Angular 沙箱),Playwright 能处理所有 Camofox 做不到的事。
scripts/netroadshow-capture.pyhttps://www.netroadshow.com/nrs/home/#!/?show=SHOW_ID)playwright + Pillow + playwright install chromiumskills/roadshow-capture/.env 文件:
NRS_EMAIL=your-email@your-company.com
1. browser.goto("https://www.netroadshow.com/nrs/home/#!/?show=SHOW_ID")
→ 直接显示邮箱输入框(Angular 路由正常解析,无需 hash 修正)
→ 注意:URL 会变为 /nrs/home/?show=SHOW_ID(base href 去 hash,正常)
2. Fill email → Launch Show → 用 expect_popup() 阻塞等待弹窗
→ page.locator("#homeEmailInput").first.fill(email)
→ with page.expect_popup() as info: page.get_by_text("Launch Show").click()
→ pp = info.value ← 必须用 expect_popup(),不能用 page.on("popup")
3. 弹窗进入 disclaimer 页
URL: /presentation/v2/{pres_id}/disclaimer/
内容:法律条款文本
Agree/Disagree 按钮是 <div class="disclaimer-btn btn-agree"> 和 btn-disagree
⚠️ 不是 <button> 元素!不能用 page.get_by_text("Agree").click()
✅ 正确方式:pp.evaluate('document.querySelector(".btn-agree").click()')
4. Agree 后仍停留在 /disclaimer/ URL,但内容变为:
"Welcome back, Meng!" + "Resume previous session" / "Start from beginning"
底部显示总页数如 "All 32 Slides"
5. 点击 "Start from beginning"(或用 page.get_by_text 定位)
→ URL 跳转至 /presentation/v2/{pres_id}/MediaSlides
→ 进入音频路演播放器视图
6. 翻页:page.keyboard.press("ArrowRight") 逐张前进
每页截图前等待 1.5s 让渲染完成
7. 合成 PDF:
✅ Image.open(f).convert("RGB") → .save(path, save_all=True, append_images=..., format='PDF', resolution=150)
⚠️ 必须加 format='PDF' 参数,否则 Pillow 缺失 JPEG 支持时会报 KeyError: 'JPEG'
/home/#!/?show=SHOW_ID → 邮箱输入页(Email + Launch Show)
↓ Fill email → Launch Show
/home/?show=SHOW_ID → "Thank you for viewing" 页面 + 弹窗打开
↓ Popup(新窗口)
/presentation/v2/{id}/disclaimer/ → 法律条款
↓ Agree (JS click .btn-agree)
/presentation/v2/{id}/disclaimer/ → Resume / Start from beginning
↓ Start from beginning
/presentation/v2/{id}/MediaSlides → 路演播放器(音频同步 + 翻页)
↓ ArrowRight (×N)
逐张截图
| 问题 | Camofox | Playwright |
|---|---|---|
Hash 路由 #!/?show=X | 编码为 %2F%3F,SPA 不解析 | 直接导航,正常解析 |
| 弹窗/新窗口 | page.on("popup") 事件延迟,捕获不到 | expect_popup() 阻塞等待,精准 |
| reCAPTCHA | headless 模式下失败 | Mac UA + headless 下成功 |
Angular $http | browser_console 500 错误 | page.evaluate() 正常 |
| div 按钮点击 | 定位不到 | page.evaluate('...click()') 绕过 |
| 服务端信任 | 低(可能被拒绝) | Mac Safari UA 通过 |
Disclaimer 页的 Agree/Disagree 按钮是 <div class="disclaimer-btn btn-agree">Agree</div>,不是 <button> 元素。
❌ 无效方法:
page.get_by_text("Agree").click() — 不触发page.locator("button:has-text('Agree')") — 找不到page.locator(".btn-agree").click() — Playwright 的 .click() 在 div 元素上可能不触发事件✅ 正确方法:
pp.evaluate('document.querySelector(".btn-agree").click()')
失败一次(如 Entry Code 无效)后同一 Session 持续失败。需重建干净会话:首页 → Entry Code 输入任意内容 → Continue → 自动跳转到无报错的邮箱页。
# ❌ 缺 format 参数可能报 KeyError: 'JPEG'
imgs[0].save(path, save_all=True, append_images=imgs[1:])
# ✅ 正确
imgs[0].save(path, save_all=True, append_images=imgs[1:], format='PDF', resolution=150)
zofundintl.com 域邮箱的密码登录会被安全组拒绝("please use your internal portal")。只能用 Email-Only 流程。
scripts/netroadshow-capture.py — 完整自动化脚本:
如果 NRS_EMAIL 环境变量未设置,agent 应按以下流程交互:
NRS_EMAIL 是否已设 → 有则直接使用scripts/.env 是否有 NRS_EMAIL=xxx → 有则读取scripts/.env(格式 NRS_EMAIL=xxx),代码中自动读取不要求用户提前配环境变量,靠对话把设置门槛降到零。
.env(NRS_EMAIL 环境变量)page.keyboard.press("ArrowRight") 而非点击导航按钮references/netroadshow-practice.md