Zaimod
快速上手
zaimod 快速接入
获取API接口地址与密钥
API 密钥令牌查询及兑换
软件接入
WorkBuddy 桌面版接入
扣子(Coze)工作流调用 API 教程
RikkaHub 配置教程
Codex 配置API接入教程
Clawdbot 中转站配置教程
OpenClaw 最自定义中转站配置教程
N8N 工作流使用API中转教程
Gemini CLI 中转站配置教程
Claude Code 中转站安装与配置指南
Cherry Studio接入中转站调用MCP
Cherry Studio桌面端API基础配置教程
Dify 添加自定义模型(接入中转站)教程
Cline 配置教程(接入中转站)
aider 中转API配置教程
Cursor 接入中转站配置教程
LobeChat 接入中转站配置教程
ChatBox 接入中转站配置教程
NextChat 接入中转站配置教程
Zotero GPT 插件接入中转站教程
Claude Dev 接入配置教程
沉浸式翻译 接入 GPT 翻译(中转站)
ChatGPT Sidebar 接入配置教程
ChatGPT-on-WeChat 配置教程
GPT Academic(学术优化)配置教程
n8n工作流:本地图片生成视频
opencode 配置教程
CLI 配置
Node.js 环境安装教程
Codex 配置教程
Claude Code 配置
Gemini CLI配置
Antigravity CLI 配置
Grok Build 配置
GLM Claude Code 配置
Kimi Code CLI 配置
CC-Switch配置
CC-Switch 下载安装
CC-Switch 配置 Codex
CC-Switch 配置 Claude Code
CC-Switch 配置 Gemini
CC-Switch 配置 GLM
CC-Switch 配置 Grok Build
EN
# n8n 工作流:本地图片生成视频(接入中转站) > **适用对象**:n8n(自建或 Docker 部署),用 HTTP Request 节点调中转站的视频生成接口 > **中转站地址**:`https://api.zaimod.com` > **接口链路**:`POST /v1/videos`(提交)→ `GET /v1/videos/{id}`(查询) > **目标**:点一次 Execute,任务从 `queued` 走到 `completed`,拿到可播放的 `video_url` --- ## 一、这个工作流到底做了什么 整条链路只有 4 个节点,原文一句话就带过了,这里先把它摊开: | 顺序 | 节点 | 作用 | 关键配置 | | -- | ---------------------------------- | -------------------------- | ---------------------------------------------------- | | 1 | `When clicking 'Execute workflow'` | 手动触发,方便调试 | 无需配置 | | 2 | `Read/Write Files from Disk` | 从**运行 n8n 的那台机器**读一张图片 | `File(s) Selector` 填绝对路径 | | 3 | `HTTP Request` | 提交生成任务,拿回任务 `id` | `POST https://api.zaimod.com/v1/videos`,Form-Data | | 4 | `HTTP Request1` | 用 `id` 查任务状态,取 `video_url` | `GET https://api.zaimod.com/v1/videos/{{ $json.id }}` | ``` 点 ▶ Execute ↓ [读本地图片] data(二进制) ↓ [POST /v1/videos] model=veo3_1-fast prompt=… seconds=8 input_reference=data ↓ 返回 { id, status:"queued", progress:0, … } [GET /v1/videos/{id}] status:"completed" progress:100 video_url:"https://…mp4" ``` **一句话记住:提交一次、查一次。** 提交返回的 `id` 就是第 4 个节点的路径参数,不再需要别的凭据。 --- ## 二、两条视频链路,别混用 中转站的视频接口有两套风格,长得很像但**路径和传参方式完全不同**,混用必然 404 或 400: | | **A · OpenAI 风格(本篇用这条)** | B · 统一视频链路 | | ----- | -------------------------------------- | ----------------------------- | | 提交 | `POST /v1/videos`(multipart/form-data) | `POST /v1/video/create`(JSON) | | 查询 | `GET /v1/videos/{id}` | `GET /v1/video/query?id=…` | | 图片怎么给 | **直接传文件**(二进制),或传图片 URL | 只能传**公网图片 URL**(`images` 数组) | | 返回结构 | `id`、`status`、`progress`、`video_url` | `data.task_id` | | 适合 | **手上有本地图片**,想一步提交 | 图片已在图床上,或用 Omni-Flash 的高级参数 | 原文用的显然是 A(截图里第 4 个节点的 URL 明确以 `/videos/` 结尾,返回体里有 `object: "video"`、`progress`、`video_url`)。 > ⚠️ 只有 A 能**直接上传本地文件**。B 只接受 URL——这是很多人卡在「图片传不上去」的根本原因。 --- ## 三、开始之前 | 项目 | 要求 | 说明 | | -------- | ----------------------- | -------------------------------- | | n8n 版本 | 1.0 以上 | `File(s) Selector` 这个字段名是较新版本才有的 | | 令牌 | `sk-` 开头 | 控制台「令牌」页新建,**不要**自己加 `Bearer ` | | 图片 | 本地文件,jpg/png | 建议 < 4 MB,文件名避免空格和特殊符号 | | **运行位置** | **图片必须在 n8n 进程能访问的磁盘上** | 见下方警告,这是本篇最容易整段失败的一条 | > **⚠️ 注意 · 关于「本地文件」的三个前提**(原文完全没提) > > - **n8n 用 Docker 跑** → `D:/测试n8n文件/x.jpg` 在容器里根本不存在。要么把目录挂载进容器(`-v D:/测试n8n文件:/data`),路径改写成 `/data/x.jpg`;要么改用图片 URL 方式(见 5.3)。 > - **n8n Cloud / 别人的服务器** → 没有你的本地磁盘,这条路走不通,只能用 URL 或先把图片传到能公网访问的图床。 > - **Windows 路径分隔符** → 从资源管理器复制出来的是反斜杠 `\`,n8n 里要改成正斜杠 `/`。这是原文唯一强调的一点,也确实是最常出错的一点。 --- ## 四、操作步骤 ### 4.1 步骤 1 · 建触发节点 新建工作流,第一个节点选 **Manual Trigger**(界面上显示 `When clicking 'Execute workflow'`)。调试阶段不要用定时触发,否则改一次参数就等一次。 ### 4.2 步骤 2 · 读本地图片 添加 **Read/Write Files from Disk** 节点: | 字段 | 填什么 | | ------------------ | ----------------------------------- | | `Operation` | **`Read File(s) From Disk`**(默认就是它) | | `File(s) Selector` | 图片绝对路径,**用正斜杠** | 示例: ``` D:/测试n8n文件/demo.jpg ``` 三点注意: - 老版本没有 `File(s) Selector` 这一栏,要先点 **`Add option` → `File Path`**。找不到字段就是版本旧了。 - 原文截图里写成了 `D:/测试n8n文件//WD…jpg`,**双斜杠能跑但没必要**,看着像手误。 - 这个节点输出的二进制属性名默认是 **`data`**——第 3 个节点后面要填的就是它。 ### 4.3 步骤 3 · 提交任务(HTTP Request) #### ① Method 与 URL | 字段 | 值 | | -------- | --------------------------------- | | `Method` | `POST` | | `URL` | `https://api.zaimod.com/v1/videos` | #### ② 鉴权:两种写法,二选一 **写法 A(推荐,一次配置全局复用)** | 字段 | 值 | | ------------------- | --------------------------------------- | | `Authentication` | **`Generic Credential Type`** | | `Generic Auth Type` | **`Bearer Auth`** | | `Bearer Auth` | 新建一个凭据 → `Bearer Token` 填 **`sk-你的令牌`** | > **⚠️ 注意 · 最容易错的一步**:`Bearer Token` 里**只填令牌本身**。n8n 会自动加上 `Bearer ` 前缀,你如果再手写一遍,实际发出的头会变成 `Authorization: Bearer Bearer sk-xxxx` → 直接 `401`。这一点原文没提,但它是「明明令牌没错却一直 401」的头号原因。 这个凭据建一次,**所有 HTTP Request 节点都能选它**(原文说的「可以在全部的 http 请求使用这个权限」就是指这个)。 **写法 B(写法 A 不通时兜底)** | 字段 | 值 | | ----------------- | -------------------------------- | | `Authentication` | `None` | | `Send Headers` | **打开** | | `Specify Headers` | `Using Fields Below` | | `Name` | `Authorization` | | `Value` | `Bearer sk-你的令牌`(**中间一个空格,不能少**) | > 用写法 B 时**务必把 Authentication 设为 None**,否则两套头会同时发出去,行为不可预期。 #### ③ Body:Form-Data 传参 打开 `Send Body`,`Body Content Type` 选 **`Form-Data`**,然后逐个 `Add Parameter`: | Parameter Type | Name | Value | | ----------------- | ----------------- | ------------- | | `Form Data` | `model` | `veo3_1-fast` | | `Form Data` | `prompt` | `让牛快乐的跳科目三` | | `Form Data` | `seconds` | `8` | | `Form Data` | `size` | `16:9` | | `n8n Binary File` | `input_reference` | `data` | **最后一行是全篇的关键**,原文只用一句「这个位置比较特殊」带过: - `Parameter Type` 选 **`n8n Binary File`**(不是 Form Data); - `Name` 填接口的字段名 **`input_reference`**——原文全程没写出这个名字,很多人就是卡在这里; - `Input Data Field Name` 填 **`data`**——即上一节点输出的二进制属性名。填错成 `file`、`binary` 都会报找不到文件。 #### ④ 提交成功长什么样 返回体大致是: ```json { "id": "video_xxxxxxxx", "object": "video", "model": "veo3_1-fast", "status": "queued", "progress": 0, "seconds": 8, "size": "16:9", "created_at": 1764922599 } ``` **这里有个必须核对的分叉**:官方接口规范里的示例返回是 `{"code":0,"data":{"task_id":"…"}}`,而实际这条路径返回的是**顶层 `id`**。下一步取值的表达式取决于你实际看到哪一个: | 你看到的返回 | 第 4 个节点 URL 里写 | | ----------------- | -------------------------- | | 顶层有 `id`(本篇情况) | `{{ $json.id }}` | | 只有 `data.task_id` | `{{ $json.data.task_id }}` | 别照抄表达式,先看一眼真实返回。 ### 4.4 步骤 4 · 查询任务 新建第二个 HTTP Request 节点: | 字段 | 值 | | ---------------- | -------------------------------------------- | | `Method` | `GET` | | `URL` | `https://api.zaimod.com/v1/videos/` **+ 表达式** | | `Authentication` | 选同一个 `Bearer Auth` 凭据 | 表达式怎么写:在 URL 框里把光标放到 `/videos/` 后面,点右上角的 **`Expression`**,输入: ``` {{ $json.id }} ``` 也可以在左侧 INPUT 面板里把 `id` 那一行**直接拖到** URL 末尾,效果一样。 正确的 URL 长这样(表达式会被渲染成实际值): ``` https://api.zaimod.com/v1/videos/video_xxxxxxxx ``` > 注意:**提交和查询必须成对**。用 `POST /v1/videos` 提交却去查 `/v1/video/query`,会拿到 404 或 `task_not_exist`。 ### 4.5 步骤 5 · 看结果 再点一次 `Execute step`(或重新跑整个工作流),查询节点会返回: ```json { "id": "video_xxxxxxxx", "object": "video", "status": "completed", "progress": 100, "video_url": "https://…/xxxx.mp4", "seconds": 8, "size": "16:9", "completed_at": 1764922863 } ``` `status` 的取值与含义: | status | 含义 | 该做什么 | | ---------------------------- | --- | -------------------------------------- | | `queued` | 排队中 | 等几秒再查 | | `processing` / `in_progress` | 生成中 | 继续等(视频一般 1–5 分钟) | | `completed` | 完成 | 取 `video_url` | | `failed` / `error` | 失败 | 看返回里的 `message` / `error`,多为内容审核或参数不合规 | --- ## 五、补充与优化 ### 5.1 `seconds` 不是随便填 字段含义是「视频时长(秒)」,但**合法值随模型不同**: - Grok Imagine 系列:文档写 `6` / `10`; - 本篇的 `veo3_1-fast`:截图里填的是 `8`。 填了不支持的数字,通常不是报错,而是被上游**静默改成最近的合法值**,或者直接 `failed`。成品时长不对时,先回头看这个字段。 ### 5.2 `size` 决定横竖屏 `16:9`(横屏)或 `9:16`(竖屏)。要注意的是:**它同时也决定了输出分辨率**,同一个 prompt 竖屏出片通常比横屏慢。 ### 5.3 不想传文件?直接给图片 URL 如果图片已经在图床上,把 `input_reference` 的类型从 `n8n Binary File` 改回 `Form Data`,值填**公网可访问的图片地址**即可,整个「读本地文件」节点都能删掉: | Parameter Type | Name | Value | | -------------- | ----------------- | ---------------------- | | `Form Data` | `input_reference` | `https://你的图床/xxx.jpg` | 这条路对 Docker / n8n Cloud 用户更友好——绕开了「读不到本地磁盘」的全部问题。注意图片地址**必须公网可达且不需要登录**,否则上游拉取失败会表现成「任务一直 processing 然后超时」。 ### 5.4 让工作流自己等(加两个节点) 原文是手动点两次。要自动化,在第 3、4 个节点之间插入: 1. **Wait** 节点:`Resume` 选 `After Time Interval`,`Amount` 填 `10`,`Unit` 选 `Seconds`; 2. 第 4 个节点之后加 **If** 节点:条件 `{{ $json.status }}` `is not equal to` `completed` → 真分支**接回 Wait**(形成轮询环),假分支接后续处理(下载/通知)。 三条经验: - 间隔 **5–10 秒**,别 1 秒一次;上游按任务排队,高频轮询容易 429。 - 循环里加一个计数器(`$runIndex` 或 Set 节点自增),**超过 30 次就退出**,否则失败任务会无限循环。 - 视频按次计费,**重复点 Execute 就是重复扣费**。调试时先把 `prompt` 改短、用便宜模型试通。 ### 5.5 `video_url` 会过期 返回的链接是**带签名的临时地址**,不是永久资源。要留档就在拿到后立刻下载(HTTP Request 节点 + `Response Format: File`),或者隔一段时间用 `GET /v1/videos/{id}` 重新取一次。 ### 5.6 一次填完的办法:Import cURL 不想一个个加参数,可以用 `Import cURL`。把下面这段贴进节点的 `Import cURL`(令牌换成自己的): ```bash curl -X POST https://api.zaimod.com/v1/videos \ -H "Authorization: Bearer sk-你的令牌" \ -F "model=veo3_1-fast" \ -F "prompt=让牛快乐的跳科目三" \ -F "seconds=8" \ -F "size=16:9" \ -F "input_reference=@D:/测试n8n文件/demo.jpg" ``` URL、方法、表单字段会一次填好。**但文件那一项不会自动变成二进制**——导入后还要手动把 `input_reference` 的 `Parameter Type` 改成 `n8n Binary File`,并填 `Input Data Field Name = data`。 --- ## 六、常见问题 | 现象 | 原因 | 处理 | | --------------------------------------- | ------------------------------------------------------------------ | ----------------------------------------- | | `401 Invalid token` | 令牌错,或 `Bearer Token` 里重复写了 `Bearer` | 凭据里只填 `sk-…` | | `404 Invalid URL (POST /v1/videos/)` | URL 多了尾斜杠 | 去掉结尾的 `/` | | `404` / `task_not_exist`(查询时) | 提交与查询路径不成对;或 `id` 取错字段 | `POST /v1/videos` 配 `GET /v1/videos/{id}` | | `The file "xxx.jpg" could not be found` | 路径不对,或 n8n 跑在容器里看不到宿主磁盘 | 改容器内路径或挂载目录 | | 读文件节点报找不到文件(路径明明存在) | 用了反斜杠 `\`,或有中文/空格 | 换成 `/`,必要时用 `File(s) Selector` 的表达式 | | `400`,提示缺少参数 | `model` / `prompt` 没填,或 `Body Content Type` 不是 `Form-Data` | 对照速查表逐项核对 | | `400`,提示文件字段无效 | 二进制参数名写错(不是 `input_reference`),或 `Input Data Field Name` 不是 `data` | 按 4.3 ③ 重填 | | 任务一直 `queued` / `processing` | 上游排队,或参考图 URL 上游拉不到 | 间隔 10 秒继续轮询;URL 方式先确认图片公网可访问 | | `status: failed` | 内容审核、参数越界、图片格式不支持 | 读 `message`,改 prompt 或换图 | | 出片时长和填的不一样 | `seconds` 不被该模型支持,被静默改值 | 换用该模型支持的时长 | | `429` | 轮询过密或并发过高 | 间隔调到 10 秒,减少同时运行的任务 | | 一次运行扣了两次费 | 点了两次 Execute,或轮询环里误放了提交节点 | 提交节点只能在工作流起点出现一次 | --- ## 七、附录 A · 原文勘误 原文 1347 字符、9 张截图,把整个流程讲了一遍,但**关键标识符全部缺失**。逐条: 1. **没写接口地址**:正文只说「url 是接口请求地址」,而截图里 URL 又被整段打码,读者看完不知道要 POST 到哪。已补 `POST /v1/videos`。 2. **没写图片字段名**:只写「选择 n8n Binary File,value 里面填入 data」,从头到尾没出现 `input_reference`。这是全篇最容易卡住的一步,已单列。 3. **没说提交与查询必须成对**:`/v1/videos` 与 `/v1/video/query` 是两套链路,混用会 404。已补对照表。 4. **没提 `Bearer Token` 不能再带 `Bearer`**:n8n 会自动加前缀,手写一遍就是 `Bearer Bearer sk-…` → 401。原文只说了兜底写法里「Bearer 和令牌中间有一个空格」,反而容易让人以为主写法也要写前缀。 5. **没提「本地文件」的适用边界**:Docker 部署时 `D:/…` 在容器里不存在,n8n Cloud 更是没有本地磁盘。原文把这条当成通用做法,实际只对「n8n 装在本机」成立。 6. **没说 `model` 从哪来**:截图填 `veo3_1-fast`,但没说出处、没给可选范围,也没说模型决定 `seconds` 的合法值。 7. **没说 `size` 参数**:截图返回里有 `size: 16:9`,正文一个字没提怎么填。 8. **没提 `id` 的取法有两种**:官方规范示例返回 `data.task_id`,实际返回顶层 `id`,表达式写法不同。照抄会拿到 `undefined`。 9. **没提轮询**:只教「点第四个节点查询」,没说视频要等几分钟、要循环查、要有超时。已有 5.4 补全。 10. **没提 `video_url` 有时效**:签名链接过期后打不开,需要重新查询。 11. **没提计费**:视频按次扣费,重复执行会重复扣,调试成本比对话高得多。 12. **第 4 个节点的鉴权方式与正文不一致**:正文说「其他配置都跟上面一样」(Generic Credential Type),截图里用的却是 `Predefined Credential Type`。两种都能通,但读者照文字配会更稳。 13. **标题没体现「接入中转站」**:改为《n8n 工作流:本地图片生成视频(接入中转站)》。 --- ## 八、附录 B · 地址变更对照 | 项目 | 原地址 | 现地址 | | ---------------------- | ---------------------------------------- | --------------------------------------- | | 提交任务(截图 URL 被打码,据路径还原) | `https://api.zaimod.com/v1/videos` | | 查询任务 | `https://api.zaimod.com/v1/videos/{id}` | | 鉴权头 | `Authorization` | 不变(`Bearer ` + 令牌) | | 另一条链路(本篇未用) | `https://api.zaimod.com/v1/video/create` | **迁移提示** - 令牌要在 `api.zaimod.com` 重新生成;旧平台令牌在新域名下返回 `401 Invalid token`。 - 两条视频链路在平台上**都存在**(无令牌请求均返回 `401`,说明路由正确): `POST /v1/videos`、`POST /v1/video/generations`、`GET /v1/videos/{id}`、`GET /v1/video/query`。 - 换域名时只改 host,**别动路径结构**——`/v1/videos/{id}` 和 `/v1/video/query` 差一个字母就是两个世界。 --- *接口地址:`https://api.zaimod.com`*
上一篇:GPT Academic(学术优化)配置教程
{else}上一篇:没有了
下一篇:opencode 配置教程
{else}下一篇:没有了