使用 Playwright 为 jimeng.jianying.com 管理浏览器会话,导入 cookies/localStorage 以自动化视频生成工作流,支持图片上传等功能
即梦AI (Jimeng) 视频自动化生成完全指南
功能概述
即梦AI (Jimeng) 视频自动化生成完全指南是一项面向实际任务的技能,主要用于DR : 本文记录如何通过 Playwright + 浏览器 Session 管理,实现即梦AI视频生成的全自动化;包含图片压缩、Cookie 注入、表单填写、视频提交等完整流程;
核心要点
- 即梦AI (jimeng.jianying.com) 是字节跳动旗下的 AI 视频生成平台;
- 官方提供了 Web 界面,但没有开放 API。
- 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
使用与执行
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
结果检查与注意事项
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
即梦AI (Jimeng) 视频自动化生成完全指南
TL;DR: 本文记录如何通过 Playwright + 浏览器 Session 管理,实现即梦AI视频生成的全自动化。包含图片压缩、Cookie 注入、表单填写、视频提交等完整流程。
📋 背景
即梦AI (jimeng.jianying.com) 是字节跳动旗下的 AI 视频生成平台。官方提供了 Web 界面,但没有开放 API。当我们需要批量生成视频或集成到工作流时,就需要通过浏览器自动化来实现。
🎯 核心挑战
- 登录状态保持: 需要正确处理 Cookies 和 LocalStorage
- 文件上传: 需要压缩图片到合适大小(WebP 格式最佳)
- 动态表单: 需要等待元素加载、处理弹窗
- 提交检测: 需要检测页面跳转和生成状态
🛠️ 技术栈
- Playwright: 浏览器自动化框架
- ImageMagick: 图片压缩(convert 命令)
- Node.js: 脚本运行环境
📁 目录结构
workspace/ ├── screenshots/ │ └── YYYYMMDD_HHMMSS/ # 按时间戳组织的截图 │ ├── 01_initial.png │ ├── 02_start_uploaded.png │ └── ... ├── skills/ │ ├── browser-session-manager/ # Session 管理 Skill │ └── web-form-automation/ # 表单自动化 Skill └── session-data.json # Cookie 数据文件
🚀 完整实现步骤
1. 准备阶段:图片压缩
即梦对上传图片有大小限制,必须先压缩:
# 转换为 WebP 格式,压缩到 30-50KB convert start.png start.webp convert end.png end.webp # 验证大小 ls -lh *.webp # -rw-r--r-- 1 node node 88K Feb 15 14:59 start.webp # -rw-r--r-- 1 node node 54K Feb 15 14:59 end.webp
⚠️ 重要: PNG 原图可能 4MB+,直接上传会失败。WebP 格式可压缩 99% 且画质损失极小。
2. Session 数据准备
从浏览器导出 Cookie 和 LocalStorage,保存为 JSON:
{
"exportTime": "2026-02-15T14:55:58.374Z",
"url": "https://jimeng.jianying.com/ai-tool/home?type=video",
"hostname": "jimeng.jianying.com",
"cookies": [
{
"name": "sessionid",
"value": "xxx",
"domain": ".jianying.com",
"path": "/",
"secure": false,
"httpOnly": true,
"sameSite": "unspecified"
}
],
"localStorage": {
"dreamina__generator_video_modelKey": ""dreamina_seedance_40_pro"",
"DREAMINA_THEME": "light"
},
"sessionStorage": {}
}
获取方法: 使用浏览器扩展(如 "Cookie-Editor")导出,或从 DevTools Application 面板复制。
3. 核心自动化脚本
const { chromium } = require('playwright');
const fs = require('fs');
const path = require('path');
async function generateVideo(sessionFile, startImage, endImage, prompt, screenshotDir) {
// 读取 Session 数据
const sessionData = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
// 启动浏览器
const browser = await chromium.launch({
headless: true,
args: ['--no-sandbox']
});
const context = await browser.newContext();
const page = await context.newPage();
// ===== 关键步骤 1: 设置 Cookies =====
if (sessionData.cookies) {
const cookiesByDomain = {};
for (const cookie of sessionData.cookies) {
// 修复 sameSite 值
let sameSite = cookie.sameSite;
if (sameSite === 'unspecified') sameSite = 'Lax';
if (sameSite === 'no_restriction') sameSite = 'None';
const fixedCookie = { ...cookie, sameSite };
const domain = cookie.domain || '.jianying.com';
if (!cookiesByDomain[domain]) cookiesByDomain[domain] = [];
cookiesByDomain[domain].push(fixedCookie);
}
for (const [domain, cookies] of Object.entries(cookiesByDomain)) {
try {
await context.addCookies(cookies);
} catch (e) {
console.log(`Cookie 设置失败: ${e.message}`);
}
}
}
// ===== 关键步骤 2: 导航并注入 LocalStorage =====
await page.goto('https://jimeng.jianying.com/ai-tool/home?type=video', {
waitUntil: 'domcontentloaded',
timeout: 60000
});
await page.waitForTimeout(3000);
// 注入 LocalStorage
await page.evaluate((data) => {
for (const [key, value] of Object.entries(data.localStorage || {})) {
try { localStorage.setItem(key, value); } catch (e) {}
}
}, sessionData);
// 刷新使存储生效
await page.reload({ waitUntil: 'domcontentloaded' });
await page.waitForTimeout(3000);
// ===== 关键步骤 3: 处理登录弹窗 =====
try {
const agreeBtn = await page.getByText('同意').first();
if (await agreeBtn.isVisible({ timeout: 3000 })) {
await agreeBtn.click();
await page.waitForTimeout(2000);
}
} catch (e) {
// 没有弹窗,继续
}
// ===== 关键步骤 4: 上传首帧图片 =====
const startBtn = await page.getByText('首帧').first();
await startBtn.click();
await page.waitForTimeout(1500);
const fileInput = await page.locator('input[type="file"]').first();
await fileInput.setInputFiles(startImage);
await page.waitForTimeout(3000); // 等待上传完成
// ===== 关键步骤 5: 上传尾帧图片 =====
const endBtn = await page.getByText('尾帧').first();
await endBtn.click();
await page.waitForTimeout(1500);
const fileInputs = await page.locator('input[type="file"]').all();
await fileInputs[fileInputs.length - 1].setInputFiles(endImage);
await page.waitForTimeout(3000);
// ===== 关键步骤 6: 选择模型 =====
const modelBtn = await page.getByText('Seedance 2.0 Fast').first();
await modelBtn.click();
await page.waitForTimeout(2000);
// 选择 Seedance 2.0(非 Fast 版本)
const seedance20 = await page.getByText('Seedance 2.0').nth(1);
await seedance20.click();
await page.waitForTimeout(1500);
// ===== 关键步骤 7: 设置时长为 15s =====
const durationBtn = await page.getByText('5s').first();
await durationBtn.click();
await page.waitForTimeout(1500);
const fifteen = await page.getByText('15s').first();
await fifteen.click();
await page.waitForTimeout(1500);
// ===== 关键步骤 8: 输入提示词 =====
const textarea = await page.locator('textarea').first();
await textarea.click();
// 使用 pressSequentially 模拟真实打字,触发输入事件
await textarea.pressSequentially(prompt, { delay: 30 });
await page.waitForTimeout(3000);
// ===== 关键步骤 9: 提交生成 =====
const submit = await page.locator('button[class*="submit"]').first();
await submit.click({ force: true }); // force: true 确保能点击
await page.waitForTimeout(2000);
// ===== 关键步骤 10: 检测页面跳转 =====
await page.waitForTimeout(3000);
const currentUrl = page.url();
if (currentUrl.includes('/generate')) {
console.log('✅ 成功跳转到生成页面');
}
// 等待 5 秒查看生成状态
await page.waitForTimeout(5000);
await page.screenshot({ path: path.join(screenshotDir, 'final.png') });
await browser.close();
}
⚠️ 踩坑记录
1. Cookie sameSite 问题
错误: browserContext.addCookies: cookies[3].sameSite: expected one of (Strict|Lax|None)
解决: 导出时 `sameSite:
热门AI工具
相关专题
session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。
856
2023.10.18
session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。
560
2023.10.17
本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。
0
2026.10.22
本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。
0
2026.10.22
本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。
0
2026.10.22
本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。
0
2026.10.22
本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。
0
2026.10.22
本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。
0
2026.10.22
热门下载
相关下载
精品课程
