> 多源输入 · 动态分析 · 多格式输出
将任意网络内容一键转化为结构化的汇报/总结材料。
完全自包含技能。仅依赖系统已安装的 playwright-cli 命令行工具。
| 组件 | 说明 |
|---|---|
| ------ | ------ |
playwright-cli | 浏览器自动化 CLI(B站/小红书需要) |
| Python 3.8+ | API 脚本运行 |
| Node.js 20+ | PPT 渲染引擎 |
requests | HTTP 库 |
pptxgenjs | 幻灯片生成 |
# 快速检查
PYTHON="C:/Users/Administrator/.workbuddy/binaries/python/envs/default/Scripts/python.exe"
"$PYTHON" -c "import requests" 2>/dev/null || "$PYTHON" -m pip install requests
cd "C:/Users/Administrator/.workbuddy/binaries/node/workspace" && npm install pptxgenjs 2>/dev/null
Step 0: URL 类型识别
├── B站视频 (bilibili.com/video/... | BV...)
├── arXiv 论文 (arxiv.org/...)
├── 小红书 (xiaohongshu.com/...)
└── 网络博客 (其他 URL)
Step 1: 逐任务弹窗选择输出格式
对每个 URL → AskUserQuestion(多选 multiSelect: true):
问题:请为以下内容选择输出格式
描述:{从URL提取的标题/摘要}
选项(MANDATORY: 必须始终展示全部 3 个选项):
- "PPT 演示文稿" → 生成 .pptx 幻灯片
- "HTML 汇报页" → 生成精美 HTML 网页
- "图片" → 生成 PNG/JPG 信息图
🔴 CRITICAL: AskUserQuestion 必须无条件展示全部 3 个选项(PPT、HTML、图片)。
不得因模型能力判断而减少选项 — 图片始终可用(ImageGen 工具或信息图 HTML 渲染)。
每个 URL 单独弹窗,用户可独立勾选任意组合。
Step 2: 内容提取 → 标准化 MD
├── B站: playwright → API → 字幕 MD
├── arXiv: WebFetch → 论文结构化 MD
├── 小红书: playwright → 笔记内容 MD
└── 博客: WebFetch → 网页正文 MD
Step 3: AI 内容分析
识别内容类型 → 按时长/长度梯度 → 多维度主题
Step 4: 输出生成
├── PPT: PptxGenJS 直出
├── HTML: WorkBuddy 直出
└── 图片: ImageGen 渲染或信息图 HTML
Step 5: 交付预览
拿到用户提供的 URL 列表后,首先判断每个 URL 的输入源类型:
| URL 特征 | 类型 | 提取方式 |
|---|---|---|
| ---------- | ------ | ---------- |
bilibili.com/video/ 或 BV 开头 | B站视频 | playwright + bili_clip.py |
arxiv.org/abs/ 或 arxiv.org/html/ | arXiv 论文 | WebFetch + 结构化解析 |
xiaohongshu.com/ | 小红书笔记 | playwright + 浏览器提取 |
| 其他 HTTP(S) URL | 网络博客/文章 | WebFetch + MD 转换 |
对 Step 0 识别出的每一个 URL,分别使用 AskUserQuestion 弹窗:
问题:请为以下内容选择输出格式
描述:{从URL提取的标题/摘要}
选项(MANDATORY: 必须始终展示全部 3 个选项,multiSelect: true):
- "PPT 演示文稿" → 生成 .pptx 幻灯片
- "HTML 汇报页" → 生成精美 HTML 网页
- "图片" → 生成 PNG/JPG 信息图
> 🔴 CRITICAL: AskUserQuestion 必须无条件展示全部 3 个选项。不得因为模型能力判断而减少选项。图片始终可用(通过 ImageGen 工具或信息图 HTML 渲染)。每个 URL 单独弹窗,用户可独立勾选任意组合。
根据 Step 0 识别的 URL 类型,走不同提取通道。
🔴 三步决策流程:开浏览器 → 检测登录 → 有登录才提取。
# 1. 创建 profile 目录并打开有头浏览器
mkdir -p "$HOME/.workbuddy/playwright-profiles/bilibili"
cmd /c playwright-cli open --browser=chrome --persistent \
--profile="C:\Users\Administrator\.workbuddy\playwright-profiles\bilibili" --headed
# 2. 导航到第一个视频的页面
cmd /c playwright-cli goto "https://www.bilibili.com/video/{BVID}/"
# 3. 检查是否存在 SESSDATA cookie(B站登录态的唯一标识)
cmd /c "playwright-cli --raw run-code --filename \
C:/Users/Administrator/.workbuddy/skills/ZiXunTongGuanShi/scripts/check_login.js"
🔴 根据 logged_in 字段决定下一步:
logged_in: false → 立即停止!logged_in: true → 继续阶段 C。# 4. 零落盘剪藏(cookie 通过 stdin 管道传输,不落盘)
cd "C:/Users/Administrator/.workbuddy/skills/ZiXunTongGuanShi"
cmd /c "playwright-cli --raw run-code --filename scripts/get_cookies.js" | \
PYTHONIOENCODING=utf-8 \
"C:/Users/Administrator/.workbuddy/binaries/python/envs/default/Scripts/python.exe" \
scripts/bili_clip.py "{BVID}" "{OUTPUT_DIR}" --stdin
> 多视频场景:一次登录即可批量提取。对每个 BVID 重复阶段 C 的剪藏命令,无需重复打开浏览器或重新登录。
arXiv 论文有标准化的 HTML 和 PDF 格式。优先使用 HTML 页面提取:
# 1. 从 URL 提取 arXiv ID
# https://arxiv.org/abs/2410.12345 → 2410.12345
# https://arxiv.org/html/2410.12345v1 → 2410.12345
# 2. 使用 WebFetch 获取页面内容
# 直接调用 WebFetch 工具解析 HTML 页面:
# - 提取标题 (h1.title)
# - 提取摘要 (blockquote.abstract)
# - 提取作者列表
# - 提取正文各章节
# 3. 生成标准化 MD
arXiv MD 格式模板:
---
created: {date}
original_url: "{arxiv_url}"
---
# {论文标题}
## 论文信息
- **作者**: {authors}
- **发布时间**: {date}
- **分类**: {primary_category}
- **arXiv ID**: {id}
## 摘要
{abstract}
## 核心内容
{从 HTML 提取的章节内容}
---
## 相关信息
- **论文地址**: {arxiv_url}
- **PDF**: {pdf_url}
- **导出工具**: 资讯通关师
小红书需要登录态且页面结构动态渲染,使用 playwright 浏览器提取:
# 1. 打开浏览器(如有需要,登录小红书)
cmd /c playwright-cli open --browser=chrome --persistent \
--profile="C:\Users\Administrator\.workbuddy\playwright-profiles\xiaohongshu" --headed
# 2. 导航到笔记页面
cmd /c playwright-cli goto "{xiaohongshu_url}"
# 3. 提取笔记内容(通过 JS 从页面提取标题、正文、标签)
cmd /c playwright-cli --raw run-code "
async page => {
await page.waitForSelector('.note-content, .content, .desc', {timeout:10000});
return await page.evaluate(() => {
const title = document.querySelector('.title, h1')?.innerText || '';
const content = document.querySelector('.note-content, .content, .desc')?.innerText || '';
const tags = [...document.querySelectorAll('.tag, .topic')].map(t => t.innerText);
return JSON.stringify({title, content: content.substring(0, 10000), tags});
});
}"
# 4. 生成 MD + 关闭浏览器
cmd /c playwright-cli close
使用 WebFetch 工具直接获取网页内容并转为 MD:
1. 调用 WebFetch(url, prompt="提取文章的全部正文内容、标题、作者和发布时间")
2. 将返回内容包装为标准 MD frontmatter 格式
3. 如有需要,用 playwright 处理 JS 渲染的页面
博客 MD 格式模板:
---
created: {date}
original_url: "{url}"
---
# {文章标题}
## 文章信息
- **作者**: {author}
- **来源**: {domain}
- **发布时间**: {date}
## 正文内容
{extracted_body}
---
## 相关信息
- **原文地址**: {url}
- **导出工具**: 资讯通关师
| Token | 值 | 用途 |
|---|---|---|
| ------- | ----- | ------ |
primary | #667eea | 主色调、标题、重点标记 |
secondary | #764ba2 | 辅助色、渐变终点 |
bg | #f5f7fa | 页面背景 |
card-bg | #ffffff | 卡片背景 |
text-dark | #1a1a2e | 标题文字 |
text-body | #444 | 正文文字 |
accent-bg | #eef0ff | 标签、浅色强调 |
0 2px 12-16px rgba(0,0,0,0.05-0.06)linear-gradient(135deg, #667eea 0%, #764ba2 100%)对每个标准化 MD 文件进行 AI 分析。
| 类型 | 特征 | 分析维度 |
|---|---|---|
| ------ | ------ | ---------- |
| 访谈/对话 | 多人对话、观点碰撞 | 人物背景、核心论点、观点碰撞、角色转变 |
| 科普/知识 | 知识点密集、逻辑链 | 核心概念、知识架构、关键数据、方法论 |
| 教程/教学 | 步骤化、实操性强 | 技能要点、操作步骤、注意事项、案例 |
| 评论/观点 | 论点驱动 | 核心论点、论证逻辑、批判思考 |
| 学术论文 | 结构化、严谨性高 | 研究问题、方法论、核心发现、贡献与局限 |
| 笔记/短文 | 精炼、观点性强 | 核心观点、背景补充、个人见解 |
| 长度 | 主题分析数 | 摘要长度 | PPT 页数建议 |
|---|---|---|---|
| ------ | ----------- | ---------- | ------------- |
| 短文 (< 5000字) | 2-3 | 50-80字 | 3-5 |
| 中篇 (5000-20000字) | 3-5 | 80-150字 | 5-8 |
| 长文/长视频 (> 20000字 / > 30min) | 5-10 | 150-300字 | 8-18 |
根据 Step 1 中每个 URL 的选择,分别生成对应格式。
const theme = {
primary: "667eea", secondary: "764ba2",
accent: "8899dd", light: "eef0ff", bg: "f5f7fa"
};
结构:封面 → 目录 → N页主题分析 → 总结
cd {slides_dir} && NODE_PATH="C:/Users/Administrator/.workbuddy/binaries/node/workspace/node_modules" \
"C:/Users/Administrator/.workbuddy/binaries/node/versions/22.22.2/node.exe" compile.js
自顶向下结构:
当用户选择"图片"时,生成可视化的信息图总结。
方式一:ImageGen 渲染(优先)
使用 ImageGen 工具生成 PNG/JPG 格式信息图。Prompt 模板:
生成中文信息图,主题:{标题},扁平化紫色风格(#667eea / #764ba2)。
包含:标题、150字摘要、3-5个关键数据、3-5条要点(每条≤15字)。
来源:{original_url},底部标注"由资讯通关师生成"。
方式二:HTML 信息图渲染(兜底)
如 ImageGen 不可用,生成一个自包含的信息图 HTML 页面,包含:
⚠️ 图片输出时,使用 DeferExecuteTool 调用 ImageGen 工具。先通过 ToolSearch 查找 ImageGen 的准确参数 schema。如 ImageGen 不可用,自动降级为信息图 HTML 页面。
deliver_attachments → 按格式输出(PPT/HTML/图片)
preview_url → HTML(优先)或 open_result_view → PPT
state-save 只在打开浏览器的同一进程有效。
✅ 用 run-code --filename 提取 cookie → stdin 管道(零落盘)。
cmd /c ... > file.txt 跨 cmd 可能输出空文件。
✅ cmd /c "playwright-cli ... | python ..." 同一条命令内完成。
🔴 高风险:cmd /c 管道中 Python 的绝对路径(如 C:...)可能被解析为命令而非路径参数。
✅ 改用临时文件方式:先 > tmpfile,再 --cookies-file tmpfile;或使用 --stdin 完全避免管道问题。
playwright-cli --raw run-code 输出的 JSON 字符串会被外层包裹一次 JSON 编码。例如:
"{\"cookies\":[{\"name\":\"SESSDATA\",...}]}"
✅ Python 中需要 json.loads(json.loads(content)) 双重解码,或者在包装的 run-code 代码中不做 JSON.stringify,让 raw 模式自动处理。
run-code "async page => { ... }" 中的引号和特殊字符可能被 shell 解析破坏。
✅ 复杂 JS 逻辑写为独立的 .js 文件,用 --filename 参数加载:playwright-cli --raw run-code --filename script.js
JS 字符串中嵌套中文双引号 "\u201c" "\u201d" 会与 JS 字符串分隔符 " 冲突,导致语法错误。
✅ 使用 t() 辅助函数 + { text: "..." } 对象格式彻底避免引号嵌套:
function t(text) { return text; }
// ...
{ text: t('他说:\u201c你好\u201d'), options: { fontSize: 14 } }
Windows 的 Git Bash 终端可能无法正确渲染中文字符,但这仅影响终端输出显示。
✅ 文件内容本身不会受影响(UTF-8 编码)。设置 PYTHONIOENCODING=utf-8 可缓解终端显示问题。
小红书笔记页可能需要登录态。
✅ 使用独立的 persistent profile,首次扫码后持久有效。
arXiv 的 HTML 页面比 PDF 更易于文本提取。
✅ 优先使用 arxiv.org/html/ 格式;如不可用则退回到 abs 页面提取摘要。
AI 根据内容类型动态选择分析维度,不预设"金句""亮点"。
图片输出通过 ImageGen 工具实现;使用前先通过 ToolSearch 查找 ImageGen 参数 schema。如 ImageGen 不可用,自动降级为信息图 HTML 页面。
B站 AI 字幕 API(player/wbi/v2)在没有 SESSDATA cookie 时不返回字幕数据。
🔴 不要浪费时间用公开 API 逐条尝试。
✅ 正确流程:playwright-cli open --headed → check_login.js 检测 SESSDATA → 未登录则提示用户扫码并等待 → 登录确认后 get_cookies.js 提取 → stdin 管道传给 bili_clip.py。
一次登录,所有视频共享 cookie。
使用 --persistent --profile="..." 保存登录态。cookie 保存在 profile 中,下次无需重新登录。但如果 profile 被删除或 cookie 过期,重新走有头登录流程即可。
ZiXunTongGuanShi/
├── SKILL.md # 本文件 — AI 执行指令
├── requirements.txt
├── scripts/
│ ├── bili_clip.py # B站提取(支持 --stdin)
│ ├── check_login.js # 🔴 登录检测(轻量 SESSDATA 检查)
│ ├── get_cookies.js # playwright cookie 提取
│ ├── arxiv_clip.py # arXiv 论文提取(预留)
│ └── xhs_clip.py # 小红书提取(预留)
├── references/
│ ├── bilibili_api.md # B站 API 参考
│ ├── playwright-session.md
│ ├── playwright-running-code.md
│ └── playwright-storage-state.md
├── templates/
│ ├── theme.json # PPT 主题配色
│ ├── report.html.j2 # HTML 模板参考
│ └── infographic_prompt.md # 图片信息图 prompt 模板
| 环节 | 实现 |
|---|---|
| ------ | ------ |
| B站 Cookie | stdin 管道零落盘 |
| 博客/arXiv | 公开访问,无需凭证 |
| 小红书 | 独立 profile,cookie 不跨站共享 |
check_login.js 脚本created 和 original_url,移除 source/tags/category/status共 1 个版本