这一页直接给代码。假设你已经注册账号并创建了 API Key,Key 以 h3k_ 开头。
Python 示例
需要先安装 httpx:
pip install httpx
import time
import httpx
API = "https://api.h3hub.cn"
KEY = "h3k_你的key"
client = httpx.Client(headers={"X-API-Key": KEY})
# 1. 提交任务
r = client.post(f"{API}/api/v1/video/generate", json={
"prompt": "一只金毛在麦田奔跑",
"duration": 5,
"resolution": "480p",
})
r.raise_for_status()
task_id = r.json()["task_id"]
print("task:", task_id)
# 2. 轮询状态
while True:
task = client.get(f"{API}/api/v1/task/{task_id}").json()
if task["status"] in ("completed", "failed"):
break
time.sleep(5)
if task["status"] == "failed":
raise SystemExit(f"failed: {task['error']}")
# 3. 下载结果
with client.stream("GET", f"{API}/api/v1/result/{task_id}") as resp:
resp.raise_for_status()
with open("output.mp4", "wb") as f:
for chunk in resp.iter_bytes():
f.write(chunk)
print("saved output.mp4")
Node.js 示例
需要 Node 18+,内置 fetch:
const API = "https://api.h3hub.cn";
const KEY = "h3k_你的key";
async function main() {
// 1. 提交任务
const gen = await fetch(`${API}/api/v1/video/generate`, {
method: "POST",
headers: { "X-API-Key": KEY, "Content-Type": "application/json" },
body: JSON.stringify({
prompt: "a golden retriever running in a wheat field",
duration: 5,
resolution: "480p",
}),
});
const { task_id } = await gen.json();
// 2. 轮询状态
let task;
while (true) {
const resp = await fetch(`${API}/api/v1/task/${task_id}`, {
headers: { "X-API-Key": KEY },
});
task = await resp.json();
if (task.status === "completed" || task.status === "failed") break;
await new Promise((r) => setTimeout(r, 5000));
}
if (task.status === "failed") throw new Error(task.error);
// 3. 下载结果
const video = await fetch(`${API}/api/v1/result/${task_id}`, {
headers: { "X-API-Key": KEY },
});
const buf = Buffer.from(await video.arrayBuffer());
require("fs").writeFileSync("output.mp4", buf);
console.log("saved output.mp4");
}
main().catch((err) => {
console.error(err);
process.exit(1);
});
注意
- 轮询间隔至少 5 秒。
- 如果返回
429,看Retry-After头再等。 - 如果返回
401,检查 Key 是否被禁用或吊销。 - 参考素材任务先走
/api/v1/upload/presign,再把media_id放进ref_media_ids。