输入日期 + 主题 → Coze AI 自动生成早安视频 → 导入剪映草稿
| 项目 | 说明 |
|---|---|
| 项目名 | 早安电台(Good Morning Radio) |
| 用途 | 每天自动生成早安短视频,含 AI 文案 + Pexels 素材 + 剪映草稿 |
| 技术栈 | Python 3.11, Coze API, Pexels API, pyautogui, pyperclip, PyGetWindow |
| 输出 | 剪映草稿(.draft),可直接在剪映专业版中编辑导出 |
| 作者 | Undo |
| 仓库 | https://github.com/你的用户名/goodmorning-radio(待创建) |
- ✅ Tkinter 弹窗输入日期和主题文案
- ✅ 自动匹配主题关键词 → Pexels 搜索 4K 横屏素材
- ✅ 调用 Coze 工作流合成视频 → 返回 Draft ID
- ✅ 自动打开米核剪映小助手 → 粘贴 ID → 创建剪映草稿
- ✅ 支持命令行传参跳过弹窗(适合自动化)
┌─────────────────────────────────────────────────────────┐
│ 用户启动(双击快捷方式) │
└──────────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Python 脚本 generate_video.py │
│ │
│ 1. show_input_dialog() — 弹窗输入日期 + 主题 │
│ 2. rwf() — 调用 Coze API │
│ 3. gdi() — 解析 Draft ID │
│ 4. pm() — 自动粘贴到米核 + 创建草稿 │
│ 5. 打开剪映专业版 │
└──────────┬──────────────────────────────────────────────┘
│
├── ① ──→ Coze 工作流(云端)
│ │
│ ├── 接收参数:time, zhuti, API_KEY
│ ├── 调用 Pexels API 搜索 4K 横屏素材
│ ├── AI 合成视频
│ └── 返回 Draft ID
│
├── ② ──→ 米核剪映小助手(本地 exe)
│ │
│ ├── 粘贴 Draft ID
│ └── 点击"创建剪映草稿"
│
└── ③ ──→ 剪映专业版(打开)
弹窗让用户填写:
- 日期(YYYY-MM-DD,默认当天)
- 主题/文案(默认从模板按天数轮换生成)
支持 {date} → 如 "2026年6月17日"
支持 {weekday} → 如 "星期四"
POST https://api.coze.cn/v1/workflow/run
Authorization: Bearer {pat}
Content-Type: application/json
{
"workflow_id": "7648157202642403382",
"parameters": {
"time": "2026-06-17",
"zhuti": "早安文案内容...",
"API_KEY": "xxx"
},
"is_async": false
}
- 接收
time、zhuti、API_KEY - 根据
zhuti关键词匹配视频风格(夏天/治愈/励志/风景/生活...) - 调用 Pexels API 搜索 4K 横屏素材
- 按每段 3 秒计算需要的片段数量
- 返回视频链接列表
Coze 工作流返回的数据中提取 output 字段作为 Draft ID。
- 启动
米核剪映小助手.exe - 等待窗口出现(超时 20 秒)
- 将 Draft ID 复制到剪贴板
- 点击输入框(窗口中央,垂直 28% 位置)
- Ctrl+A → Delete 清空
- Ctrl+V 粘贴 ID
- 截图保存到本地(便于调试)
- 点击"创建剪映草稿"按钮(窗口中央,垂直 52% 位置)
自动启动 剪映专业版.lnk,用户可直接查看生成的草稿。
goodmorning-radio/
│
├── generate_video.py # 主脚本(一键视频生成)
├── config.json # 配置文件(含 API 密钥,已 gitignore)
├── config.json.template # 配置文件模板(可公开,占位符替换)
├── .gitignore # Git 忽略规则
│
├── docs/
│ └── README.md # 本文档
│
├── __pycache__/ # Python 缓存(已 gitignore)
│
└── debug_*.png # 调试截图(运行自动生成,已 gitignore)
| 文件 | 是否提交 Git | 说明 |
|---|---|---|
generate_video.py |
✅ 是 | 主程序,跨机器通用 |
config.json.template |
✅ 是 | 模板,新机器复制为 config.json 填入密钥即可 |
config.json |
❌ 否 | 含真实 API 密钥,每个机器独立配置 |
docs/README.md |
✅ 是 | 文档 |
debug_*.png |
❌ 否 | 运行时产生的调试截图 |
| 函数 | 职责 | 关键细节 |
|---|---|---|
lc() |
加载 config.json | 读取配置,失败则退出 |
gz(ds, c) |
生成默认主题文案 | 从 8 条模板按天数轮换,支持 {date}/{weekday} 变量 |
show_input_dialog() |
弹窗输入日期和主题 | Tkinter,置顶,回退到命令行 input |
rwf(pat, wid, dt, zt, ak) |
调用 Coze 工作流 | POST 同步请求,超时 600s |
gdi(res) |
解析 Draft ID | 遍历 output/data/result 字段 |
fw(t, to) |
查找窗口 | 轮询 15 秒,按标题匹配 |
pm(did) |
粘贴到米核 | 剪贴板复制 + Ctrl+V(非 typewrite,对 Electron 更可靠) |
main() |
主流程编排 | 组装所有步骤 |
# 520x260 居中窗口,默认日期当天,默认主题从模板自动生成
# 置顶显示,支持取消回退到命令行b = {
"workflow_id": wid,
"parameters": {
"time": dt, # 日期字符串
"zhuti": zt, # 主题文案
"API_KEY": ak # API 密钥
},
"is_async": False # 同步等待
}pyperclip.copy(did) # 复制到剪贴板
pyautogui.click(input_x, input_y) # 点击输入框(3次确保焦点)
pyautogui.hotkey("ctrl", "a") # 全选
pyautogui.press("delete") # 删除
pyautogui.hotkey("ctrl", "v") # 粘贴(比 typewrite 可靠)
pyautogui.click(btn_x, btn_y) # 点击创建按钮输入框位置:窗口 水平居中 × 垂直 28%
创建按钮位置:窗口 水平居中 × 垂直 52%
| 项目 | 说明 |
|---|---|
| 平台 | Coze(扣子)— https://www.coze.cn |
| 工作流 ID | 7648157202642403382 |
| 空间 ID | 7648146632676081698 |
| 触发方式 | REST API |
| API 端点 | https://api.coze.cn/v1/workflow/run |
| 输入参数 | time(字符串)、zhuti(字符串)、API_KEY(字符串) |
| 输出 | Draft ID(剪映草稿 ID,字符串) |
这个节点是 Coze 工作流中的关键逻辑:根据主题文案匹配关键词,搜索 4K 横屏素材。
async function main({ params }: { params: Record<string, any> }): Promise<Record<string, any>> {
let input = Number(params.input) || 0;
const zhuti = (params.zhuti ?? '').trim();
// 兼容单位:微秒 → 秒
if (input >= 1000000) {
input = input / 1000000;
}
const num = Math.ceil(input / 3);
const limit = Math.min(Math.max(num, 1), 30);
// 主题关键词匹配
const keywordMap: Record<string, string[]> = {
"夏天|夏|暑|热": ["summer morning", "sunny day", "beach sunrise", "green nature", "blue sky", "sunshine field"],
"治愈|温暖|温柔|放松|舒缓": ["sunshine garden", "golden morning light", "bright meadow", "sunlit forest", "peaceful sunrise", "calm lake nature"],
"励志|加油|努力|奋斗|拼搏|梦想": ["sunrise mountain", "morning run", "city sunrise", "motivation", "success"],
"风景|自然|山水|旅行|远方|大地": ["misty mountain", "lake sunrise", "forest morning", "waterfall", "landscape"],
"生活|日常|烟火|人间|平凡": ["morning coffee", "sunlight window", "fresh bread", "city morning", "street"],
"情感|爱情|思念|陪伴|相遇": ["sunset love", "couple morning", "romantic sunrise", "together"],
"孤独|独处|安静|深夜|宁静": ["alone morning", "quiet street", "silent dawn", "peaceful alone"],
};
let keywords: string[];
let matched = false;
for (const [key, words] of Object.entries(keywordMap)) {
const regex = new RegExp(key);
if (regex.test(zhuti)) {
keywords = words;
matched = true;
break;
}
}
if (!matched) {
keywords = [
"golden sunrise", "sunlight forest", "sunshine meadow",
"warm morning light", "sunny garden", "peaceful lake sunrise",
"sun rays through trees", "bright flowers", "calm ocean sunrise",
"sunlit path", "morning glow", "sunbeam nature"
];
}
const keyword = keywords[Math.floor(Math.random() * keywords.length)];
let video_urls: string[] = [];
let debug_msg = `keyword: ${keyword}`;
try {
// Pexels API: 4K 横屏视频
const resp = await fetch(
`https://api.pexels.com/videos/search?query=${keyword}&per_page=${limit}&orientation=landscape&size=4k`,
{ headers: { "Authorization": "你的 Pexels API Key" } }
);
debug_msg += `, status: ${resp.status}`;
const data = await resp.json();
debug_msg += `, results: ${data.total_results ?? 0}`;
if (data.videos && data.videos.length > 0) {
video_urls = data.videos.map((v: any) => {
const files = v.video_files;
const hd = files.find((f: any) => f.quality === "hd")
|| files.find((f: any) => f.quality === "sd")
|| files[0];
return hd.link;
});
}
} catch (e: any) {
debug_msg += `, error: ${e.message || String(e)}`;
}
// 保底视频
if (video_urls.length === 0) {
video_urls = [
"https://befun-static.oss-cn-shenzhen.aliyuncs.com/clip/material/61877f9dc37f1eb02a73b1459267b917dce6017b.mp4",
"https://befun-static.oss-cn-shenzhen.aliyuncs.com/clip/material/28cbe8e5cf1cc69051c6d9a8653349892a65185b.mp4"
];
}
const selected = video_urls.slice(0, Math.min(num, video_urls.length));
return { video_urls: selected, num: selected.length, total_seconds: selected.length * 3, debug_msg };
}[开始节点]
↓ 参数: time, zhuti, API_KEY
[代码节点 - Pexels 搜索]
↓ 输出: video_urls, num, total_seconds, debug_msg
[后续处理节点]
↓ 合成视频,生成剪映草稿
[返回节点]
↓ 输出: Draft ID
[结束]
注意: Pexels API Key 需自行替换为有效的 Key。免费注册地址:https://www.pexels.com/api/
{
"coze": {
"workflow_id": "7648157202642403382",
"space_id": "7648146632676081698",
"api_key": "your-api-key",
"pat": "pat_your-personal-access-token"
},
"auto_zhuti": {
"enabled": true,
"source": "template",
"templates": [
"早安,{date} {weekday},人生的答案,总是藏在时光的褶皱里。..."
]
}
}| 字段 | 类型 | 说明 | 获取方式 |
|---|---|---|---|
coze.workflow_id |
string | Coze 工作流 ID | Coze 控制台 → 工作流 → 基本信息 |
coze.space_id |
string | Coze 空间 ID | Coze 控制台 → 空间设置 |
coze.api_key |
string | 传给工作流的 API 密钥 | 自定义,工作流内校验用 |
coze.pat |
string | Coze 个人访问令牌 | Coze → 设置 → API 令牌 |
auto_zhuti.templates |
string[] | 早安文案模板 | 可自定义,支持变量 |
PAT 优先级: 环境变量 COZE_PAT > config.json 中的 pat
# 1. 克隆仓库
git clone https://github.com/你的用户名/goodmorning-radio.git
cd goodmorning-radio
# 2. 创建配置文件
copy config.json.template config.json
# 编辑 config.json 填入真实密钥
# 3. 安装 Python 依赖(脚本会自动安装,也可手动)
pip install requests pyautogui pyperclip PyGetWindow创建快捷方式指向:
目标: C:\Path\To\Python311\python.exe "C:\Path\To\goodmorning-radio\generate_video.py"
起始位置: C:\Path\To\goodmorning-radio
cd C:\Path\To\goodmorning-radio
python generate_video.pypython generate_video.py "2026-06-17" "早安文案内容..."| 程序 | 用途 | 路径配置 |
|---|---|---|
| 米核剪映小助手 | 接收 Draft ID 创建剪映草稿 | C:\Users\用户名\Desktop\米核剪映小助手.exe |
| 剪映专业版 | 视频编辑 | C:\Users\用户名\Desktop\剪映专业版.lnk |
脚本中路径可根据实际位置修改。
| 库 | 用途 | pip 包名 | 安装方式 |
|---|---|---|---|
| requests | HTTP 请求 | requests | 自动 |
| pyautogui | 鼠标/键盘自动化 | pyautogui | 自动 |
| pyperclip | 剪贴板操作 | pyperclip | 自动 |
| PyGetWindow | 窗口查找 | PyGetWindow | 自动 |
| tkinter | 弹窗 UI | — | Python 内置 |
脚本启动时自动 pip install 缺失的库。
| API | 用途 | 需要 Key |
|---|---|---|
| Coze API | 调用工作流合成视频 | ✅ Coze PAT |
| Pexels API | 搜索 4K 横屏视频素材 | ✅ Pexels API Key |
A: 检查 Python 是否安装,运行 python --version。检查快捷方式路径是否正确。
A: 检查 config.json 中的 pat 是否过期。Coze PAT 有有效期,需定期更新。
A: 查看项目目录下的 debug_*.png 截图。如果输入框为空,可能是因为米核窗口位置/大小变了——调整脚本 pm() 函数中的比例参数(0.28 和 0.52)。
A: 确保 config.json 和 generate_video.py 在同一目录。首次使用需从 config.json.template 复制创建。
- 克隆仓库
- 复制
config.json.template为config.json - 填入 Coze PAT 和 Pexels API Key
- 修改脚本中的
ME和JY路径为实际路径 - 安装 Python 3.11
- 双击运行
| 日期 | 版本 | 说明 |
|---|---|---|
| 2026-06-15 | v1.0 | 初始版本,Coze API + pyautogui typewrite |
| 2026-06-17 | v1.1 | 改为剪贴板粘贴(解决 Electron 输入问题) |
| 2026-06-17 | v1.2 | 增加弹窗输入,Pexels 改为 4K 横屏素材 |
文档生成日期:2026-06-17