>

16 stars
5 forks
JavaScript
5 views

SKILL.md


name: doubao-skills description: > 通过 Playwright 连接已登录 Chrome(CDP),在豆包(doubao.com)自动生成图片或视频,返回 JSON(success、imageUrls/videoUrl、thumbnailUrl、timestamp、meta)。

【默认触发场景 — 以下需求优先使用本 Skill,无需用户主动提及豆包】

  1. 图片生成类:帮我生成图片、画一张图、生成一张图、AI 画图、用 AI 生成图、文生图、帮我画、生成一幅…
  2. 视频生成类:帮我生成视频、做一个 AI 视频、文生视频、生成短视频、AI 做视频…
  3. 品牌直达:豆包生图/生视频、用豆包画图、让豆包生成…

【不触发的情况】

  • 用户明确要求用其他平台(Midjourney、Stable Diffusion、可灵、Sora 等)
  • 用户只是询问图片/视频的编辑或处理(非生成),这类直接处理

注意:

  • 图片生成返回 imageUrls 数组,并默认下载到本机桌面(或 DOUBAO_OUTPUT_DIR / --output-dir)
  • 视频生成返回 videoUrl;等待使用 Playwright waitForFunction(较长 polling),默认不刷屏;需进度可设 DOUBAO_VERBOSE=1
  • 使用前需在调试模式 Chrome 中完成豆包登录(一次性操作)

doubao-skills

通过 Playwright 连接已登录的 Chrome,实现豆包 AI 图片生成视频生成自动化。一次登录后永久复用会话

核心架构

用户描述 → Skill → Playwright CDP → 已登录 Chrome → 豆包 Web → 提取结果 → JSON 返回
                                            ↑
                                  首次登录后自动复用会话

关于等待与「少轮询」:脚本在浏览器内用 waitForFunction(秒级 polling)等待 DOM 就绪,不再用「短间隔 while + 反复 evaluate」;视频等待默认不频繁写 stderr(避免无意义日志;需要时可设 DOUBAO_VERBOSE=1)。对 AI Agent:应一次执行 node image.js / node video.js 并等待进程结束,不要在对话里反复追问进度,以免浪费对话 token。生成结束后脚本会把文件落到 localPaths 所指路径。

如何判断「当前会话里已经生成好」(无需你粘贴会话链接):豆包在提交文生图/文生视频后,常会把页面切到 /thread/<会话id> 会话路由。脚本在页面内同时看两件事:① 地址栏是否已进入 /thread/meta.threadPageReached / meta.pageUrl);② 是否不再显示「生成中」类状态,且结果区出现可抓取的图片或视频 URL。在已检测到 /thread/ 时,同一套 DOM 条件会更快满足「稳定」判定(少等一轮 polling)。若产品未跳转 thread、仍停在 create-image / create-video,则只依赖 DOM,逻辑仍可用。

返回值格式(JSON)

图片生成成功

{
  "success": true,
  "prompt": "一只在竹林里喝茶的熊猫,水彩风格",
  "options": { "ratio": "1:1", "count": 1 },
  "imageUrls": ["https://..."],
  "imageCount": 1,
  "localPaths": ["C:\\\\Users\\\\...\\\\Desktop\\\\doubao-image_20260327-120000_描述_1.png"],
  "timestamp": "2026-03-27T10:55:00.000Z",
  "meta": {
    "generationDone": true,
    "doneReason": "stable",
    "threadPageReached": true,
    "pageUrl": "https://www.doubao.com/thread/...",
    "attempt": 1
  }
}

视频生成成功

{
  "success": true,
  "prompt": "熊猫在竹林中漫步,镜头缓慢推进",
  "options": { "ratio": "16:9", "duration": 5, "outputDir": "C:\\\\Users\\\\...\\\\Desktop", "saveToDisk": true },
  "videoUrl": "https://...",
  "thumbnailUrl": "https://...",
  "downloadUrl": "https://...",
  "localPaths": { "videoPath": "C:\\\\...\\\\doubao-video_....mp4", "thumbnailPath": "C:\\\\...\\\\_thumb.jpg" },
  "timestamp": "2026-03-27T10:55:00.000Z",
  "meta": {
    "generationDone": true,
    "doneReason": "stable",
    "threadPageReached": true,
    "pageUrl": "https://www.doubao.com/thread/...",
    "attempt": 1
  }
}

失败时

{
  "success": false,
  "error": "NOT_LOGGED_IN",
  "message": "请先在 Chrome 中登录豆包,然后重试"
}

前置条件

1. 安装依赖

cd scripts
npm install

2. 首次登录(仅需一次)

方式 A:手动启动 Chrome

# Windows
Start-Process -FilePath "C:\Program Files\Google\Chrome\Application\chrome.exe" `
  -ArgumentList "--remote-debugging-port=9222","--user-data-dir=C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data","--profile-directory=Default" `
  -PassThru -WindowStyle Normal

方式 B:自动检查并启动

node scripts/ensure_chrome.js

然后在打开的 Chrome 中手动登录豆包。登录成功后无需再次操作,后续调用自动复用该会话。

3. 后续使用

  • 保持 Chrome 后台运行(最小化即可)
  • 或每次调用前运行 ensure_chrome.js 自动检查

使用方式

触发条件

类型 示例表述
图片生成 帮我生成图片、画一张图、AI 画图、文生图、帮我画一只……
视频生成 帮我生成视频、做一段 AI 视频、文生视频、帮我生成一段……
品牌直达 用豆包生图/生视频、豆包画图、让豆包帮我……

不触发的情况:

  • 用户明确指定 Midjourney / SD / Sora / 可灵等其他平台
  • 图片/视频的编辑、处理需求(非生成)

命令行调用

图片生成:

# 基础用法(默认 1:1,生成1张)
node scripts/image.js "一只在竹林里喝茶的熊猫,水彩风格"

# 指定比例和数量
node scripts/image.js "赛博朋克城市夜景" --ratio=16:9 --count=4

# 保存到指定目录(默认用户桌面;也可设环境变量 DOUBAO_OUTPUT_DIR)
node scripts/image.js "水彩风景" --output-dir="D:\\素材\\豆包"

# 仅要 URL、不下载文件
node scripts/image.js "抽象画" --no-download

视频生成:

# 基础用法(默认 16:9,5秒;完成后视频/封面下载到桌面)
node scripts/video.js "一只熊猫在竹林中漫步,镜头缓慢推进,治愈风格"

# 指定比例和时长
node scripts/video.js "panda walking in bamboo forest" --ratio=9:16 --duration=10

# 保存到指定目录
node scripts/video.js "城市夜景" --output-dir="D:\\素材\\豆包"

# 仅 JSON 中的 URL,不下载到磁盘
node scripts/video.js "短片" --no-download

# 长时等待时每分钟一条 stderr 进度(默认静默,减少无意义输出)
$env:DOUBAO_VERBOSE="1"; node scripts/video.js "长视频"

参数说明

image.js

参数 类型 默认值 说明
prompt string 必填 图片描述(中英文均支持)
--ratio string 1:1 图片比例:1:1 / 16:9 / 9:16 / 4:3 / 3:4
--count number 1 生成数量:1-4
--output-dir / --out string 桌面或 DOUBAO_OUTPUT_DIR 生成完成后保存图片的目录
--no-download flag 只返回 URL,不写入本地文件

video.js

参数 类型 默认值 说明
prompt string 必填 视频描述(中英文均支持)
--ratio string 16:9 视频比例:16:9 / 9:16 / 1:1
--duration number 5 视频时长(秒)
--output-dir / --out string 桌面或 DOUBAO_OUTPUT_DIR 完成后保存视频/封面的目录
--no-download flag 只返回 URL,不下载到磁盘

脚本说明

scripts/image.js

豆包图片生成脚本,负责:

  • 连接 Chrome CDP
  • 导航到 doubao.com/chat/create-image
  • 检测登录状态
  • 输入 prompt 并提交
  • 使用 page.waitForFunction(约 2s polling)等待图片生成完成,避免 while + 短 sleep 的密集轮询;若地址栏进入 /thread/ 与 DOM 同时满足,可更快判定完成
  • 提取图片 URL 列表;默认在浏览器关闭前用 page.request 下载到桌面或 --output-dir
  • JSON 返回 imageUrlslocalPathsmeta.threadPageReached / meta.pageUrl 反映是否进入会话路由

scripts/video.js

豆包视频生成脚本,负责:

  • 连接 Chrome CDP
  • 导航到 doubao.com/chat/create-video
  • 检测登录状态
  • 输入 prompt 并提交
  • 使用 page.waitForFunction(约 5s polling)等待视频就绪;默认不频繁打印 stderr(DOUBAO_VERBOSE=1 时可每分钟一条);与图片相同,在页面内检测 /thread/ 与结果区视频/封面
  • 提取视频 URL / 封面图 / 下载链接;默认下载视频与封面到本地
  • JSON 返回 localPaths(含 videoPaththumbnailPath),meta.threadPageReached / meta.pageUrl 同上

scripts/utils_output.js

输出目录解析与本地保存(桌面 / DOUBAO_OUTPUT_DIR / --output-dir),优先用 Playwright 的 page.request 下载以复用 Cookie。

scripts/ensure_chrome.js

Chrome 会话管理脚本,负责:

  • 检查 Chrome CDP(端口 9222)是否就绪
  • 检查豆包登录状态
  • 自动查找并启动 Chrome(如未启动)
  • 跨平台支持(Windows / macOS / Linux)

环境变量:

变量 默认值 说明
DOUBAO_CDP_URL http://127.0.0.1:9222 Chrome CDP 地址
DOUBAO_OUTPUT_DIR 用户桌面(%USERPROFILE%\\Desktop 等) 生成完成后默认保存目录;可被 --output-dir 覆盖
DOUBAO_VERBOSE 未设置 设为 1 时,视频等待阶段每分钟输出一条 stderr 进度
CHROME_USER_DATA_DIR 系统默认 Chrome 数据目录 自定义 Chrome 用户数据目录

故障排查

错误码 原因 解决方案
NOT_LOGGED_IN Chrome 未登录豆包 运行 ensure_chrome.js 后手动登录
INPUT_NOT_FOUND 页面未加载或结构变化 确认已导航到正确页面,或更新 selector
CDP connection failed Chrome 未以调试模式启动 运行 ensure_chrome.js
MAX_RETRIES_EXCEEDED 多次重试失败 检查网络,确认豆包页面正常
视频 URL 为空 视频生成超时 增大 --timeout(默认 360 秒)或稍后重试

文件结构

doubao-skills/
├── SKILL.md              # 技能说明(本文件)
├── README.md             # 用户文档
└── scripts/
    ├── package.json      # 依赖声明
    ├── image.js          # 图片生成脚本
    ├── utils_output.js   # 输出目录与本地下载
    ├── video.js          # 视频生成脚本
    └── ensure_chrome.js  # Chrome 会话管理

执行示例

调用图片生成时,执行以下命令:

node scripts/image.js "提示词" [--ratio=比例] [--count=数量] [--output-dir=目录] [--no-download]

调用视频生成时,执行以下命令:

node scripts/video.js "提示词" [--ratio=比例] [--duration=秒数] [--output-dir=目录] [--no-download]

解析 JSON 结果:

const result = JSON.parse(output);
if (result.success) {
  // 图片
  console.log('图片URL:', result.imageUrls);
  console.log('本地文件:', result.localPaths);
  // 视频
  console.log('视频URL:', result.videoUrl);
  console.log('本地视频/封面:', result.localPaths);
}