快速开始:10 分钟接入 Sora 2 API
Sora 2 API 的接入非常简单,只需要几个步骤就能开始生成专业的 AI 视频。本文将手把手教你从零开始接入 Sora 2 API,包含完整的代码示例和最佳实践。
你将学到:
- 🔑 如何获取和配置 API Key
- 🐍 Python SDK 完整接入流程
- 🟢 Node.js SDK 完整接入流程
- 🔧 cURL 命令行调用方法
- ⚙️ 参数配置和优化技巧
- 🐛 错误处理和调试方法
准备工作:获取 API 访问权限
步骤 1: 注册 OpenAI 账户
访问 OpenAI Platform 注册账户。
重要提示:
- ⚠️ Sora 2 API 不支持 Free 用户
- ✅ 需要升级到付费账户
- ✅ 至少充值 $5 美元
步骤 2: 获取 API Key
- 登录 OpenAI Platform
- 点击右上角头像 → View API keys
- 点击 Create new secret key
- 复制并安全保存 API Key (只显示一次!)
# API Key 格式示例
sk-proj-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
步骤 3: 检查账户状态
# 使用 cURL 检查账户信息
curl https://api.openai.com/v1/usage \
-H "Authorization: Bearer $OPENAI_API_KEY"
确认项:
- ✅ 账户有可用余额
- ✅ 已升级到至少 Tier 1
- ✅ API Key 状态正常
国内开发者快速方案
对于国内开发者,直接使用 OpenAI API 可能遇到:
- ❌ 需要海外信用卡
- ❌ 网络访问受限
- ❌ 美元结算不便
💡 推荐方案: 通过 API易 apiyi.com 平台快速开通:
- 访问 apiyi.com 注册账户
- 使用支付宝/微信支付充值
- 获取 API Key (与 OpenAI 格式相同)
- 使用相同的代码调用 (仅需修改 base_url)
优势: 人民币结算、国内网络优化、中文技术支持、无需 VPN
Python SDK 接入指南
安装 OpenAI Python SDK
pip install openai
版本要求: openai>=1.0.0
基础调用示例
import openai
import os
# 配置 API Key
openai.api_key = os.environ.get("OPENAI_API_KEY")
# 调用 Sora 2 API 生成视频
response = openai.videos.create(
model="sora-2",
prompt="一只橙色的猫在阳光下的花园里玩耍,配上轻快的背景音乐",
resolution="1280x720" # 横屏 720p
)
# 输出结果
print(f"视频 URL: {response.url}")
print(f"视频时长: {response.duration} 秒")
print(f"生成成本: ${response.cost}")
完整的生产级代码
import openai
from typing import Optional
import time
class SoraVideoGenerator:
def __init__(self, api_key: str):
"""初始化 Sora API 客户端"""
self.client = openai.OpenAI(api_key=api_key)
def generate_video(
self,
prompt: str,
model: str = "sora-2",
resolution: str = "1280x720",
max_retries: int = 3
) -> dict:
"""
生成视频的完整方法
Args:
prompt: 视频描述提示词
model: 模型选择 ("sora-2" 或 "sora-2-pro")
resolution: 分辨率 (如 "1280x720", "1792x1024")
max_retries: 最大重试次数
Returns:
包含视频信息的字典
"""
for attempt in range(max_retries):
try:
response = self.client.videos.create(
model=model,
prompt=prompt,
resolution=resolution
)
return {
"success": True,
"video_url": response.url,
"duration": response.duration,
"cost": response.cost,
"model": model,
"resolution": resolution
}
except openai.RateLimitError as e:
print(f"速率限制,等待后重试... (尝试 {attempt + 1}/{max_retries})")
time.sleep(2 ** attempt) # 指数退避
except openai.APIError as e:
print(f"API 错误: {e}")
if attempt == max_retries - 1:
return {"success": False, "error": str(e)}
time.sleep(1)
except Exception as e:
print(f"未知错误: {e}")
return {"success": False, "error": str(e)}
return {"success": False, "error": "达到最大重试次数"}
# 使用示例
generator = SoraVideoGenerator(api_key="your-api-key")
result = generator.generate_video(
prompt="未来科技城市的航拍镜头,配上电子音乐",
model="sora-2-pro",
resolution="1792x1024"
)
if result["success"]:
print(f"✅ 视频生成成功!")
print(f"URL: {result['video_url']}")
print(f"时长: {result['duration']}秒")
print(f"成本: ${result['cost']}")
else:
print(f"❌ 生成失败: {result['error']}")
批量生成视频
import concurrent.futures
def batch_generate_videos(prompts: list, model: str = "sora-2"):
"""批量并发生成视频"""
generator = SoraVideoGenerator(api_key="your-api-key")
results = []
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
futures = [
executor.submit(generator.generate_video, prompt, model)
for prompt in prompts
]
for future in concurrent.futures.as_completed(futures):
results.append(future.result())
return results
# 使用示例
prompts = [
"清晨的咖啡店,阳光透过窗户",
"繁忙的城市街道,人来人往",
"宁静的图书馆,翻书的声音"
]
results = batch_generate_videos(prompts)
for i, result in enumerate(results):
if result["success"]:
print(f"视频 {i+1}: {result['video_url']}")
Node.js SDK 接入指南
安装 OpenAI Node.js SDK
npm install openai
版本要求: openai@^4.0.0
基础调用示例
const OpenAI = require('openai');
// 初始化客户端
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
});
// 生成视频
async function generateVideo() {
try {
const response = await openai.videos.create({
model: 'sora-2',
prompt: '一只橙色的猫在阳光下的花园里玩耍,配上轻快的背景音乐',
resolution: '1280x720'
});
console.log('视频 URL:', response.url);
console.log('视频时长:', response.duration, '秒');
console.log('生成成本: $', response.cost);
} catch (error) {
console.error('生成失败:', error.message);
}
}
generateVideo();
完整的 TypeScript 实现
import OpenAI from 'openai';
interface VideoGenerationOptions {
model?: 'sora-2' | 'sora-2-pro';
resolution?: string;
maxRetries?: number;
}
interface VideoResult {
success: boolean;
videoUrl?: string;
duration?: number;
cost?: number;
error?: string;
}
class SoraVideoGenerator {
private client: OpenAI;
constructor(apiKey: string) {
this.client = new OpenAI({ apiKey });
}
async generateVideo(
prompt: string,
options: VideoGenerationOptions = {}
): Promise<VideoResult> {
const {
model = 'sora-2',
resolution = '1280x720',
maxRetries = 3
} = options;
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await this.client.videos.create({
model,
prompt,
resolution
});
return {
success: true,
videoUrl: response.url,
duration: response.duration,
cost: response.cost
};
} catch (error: any) {
if (error.status === 429) {
// 速率限制,等待后重试
const waitTime = Math.pow(2, attempt) * 1000;
console.log(`速率限制,等待 ${waitTime}ms 后重试...`);
await new Promise(resolve => setTimeout(resolve, waitTime));
continue;
}
if (attempt === maxRetries - 1) {
return {
success: false,
error: error.message
};
}
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
return {
success: false,
error: '达到最大重试次数'
};
}
async batchGenerateVideos(
prompts: string[],
options: VideoGenerationOptions = {}
): Promise<VideoResult[]> {
const promises = prompts.map(prompt =>
this.generateVideo(prompt, options)
);
return Promise.all(promises);
}
}
// 使用示例
const generator = new SoraVideoGenerator(process.env.OPENAI_API_KEY!);
(async () => {
const result = await generator.generateVideo(
'未来科技城市的航拍镜头,配上电子音乐',
{
model: 'sora-2-pro',
resolution: '1792x1024'
}
);
if (result.success) {
console.log('✅ 视频生成成功!');
console.log('URL:', result.videoUrl);
console.log('时长:', result.duration, '秒');
console.log('成本: $', result.cost);
} else {
console.log('❌ 生成失败:', result.error);
}
})();
Express.js API 服务器
const express = require('express');
const OpenAI = require('openai');
const app = express();
app.use(express.json());
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
});
// POST /api/generate-video
app.post('/api/generate-video', async (req, res) => {
const { prompt, model = 'sora-2', resolution = '1280x720' } = req.body;
if (!prompt) {
return res.status(400).json({ error: '缺少 prompt 参数' });
}
try {
const response = await openai.videos.create({
model,
prompt,
resolution
});
res.json({
success: true,
video: {
url: response.url,
duration: response.duration,
cost: response.cost,
model,
resolution
}
});
} catch (error) {
console.error('生成视频失败:', error);
res.status(500).json({
success: false,
error: error.message
});
}
});
app.listen(3000, () => {
console.log('API 服务器运行在 http://localhost:3000');
});
cURL 命令行调用
基础 cURL 调用
curl https://api.openai.com/v1/videos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "sora-2",
"prompt": "一只橙色的猫在阳光下的花园里玩耍,配上轻快的背景音乐",
"resolution": "1280x720"
}'
保存响应到文件
curl https://api.openai.com/v1/videos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "sora-2-pro",
"prompt": "未来科技城市的航拍镜头,配上电子音乐",
"resolution": "1792x1024"
}' \
-o response.json
# 查看响应
cat response.json | jq '.'
下载生成的视频
# 1. 调用 API 获取视频 URL
VIDEO_URL=$(curl -s https://api.openai.com/v1/videos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "sora-2",
"prompt": "海浪拍打礁石的慢镜头,配上舒缓的海浪声",
"resolution": "1280x720"
}' | jq -r '.url')
# 2. 下载视频
curl -o video.mp4 "$VIDEO_URL"
echo "视频已保存到 video.mp4"
Shell 脚本批量生成
#!/bin/bash
API_KEY="your-api-key"
PROMPTS=(
"清晨的咖啡店,阳光透过窗户"
"繁忙的城市街道,人来人往"
"宁静的图书馆,翻书的声音"
)
for i in "${!PROMPTS[@]}"; do
echo "生成视频 $((i+1))/${#PROMPTS[@]}: ${PROMPTS[$i]}"
curl -s https://api.openai.com/v1/videos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
-d "{
\"model\": \"sora-2\",
\"prompt\": \"${PROMPTS[$i]}\",
\"resolution\": \"720x1280\"
}" | jq -r '.url' > "video_${i}.url"
echo "✅ 视频 $((i+1)) URL 已保存到 video_${i}.url"
done
参数配置详解
model 参数
# 标准版 - 适合测试和批量生成
model = "sora-2" # $0.10/秒
# 专业版 - 适合高质量内容
model = "sora-2-pro" # $0.30-$0.50/秒
选择建议:
- 📱 社交媒体内容 →
sora-2
- 🎬 商业视频 →
sora-2-pro
- 🧪 测试验证 →
sora-2
resolution 参数
# 竖屏分辨率
resolution = "720x1280" # 标准竖屏 (抖音/快手)
resolution = "1024x1792" # 高清竖屏 (仅 Pro)
# 横屏分辨率
resolution = "1280x720" # 标准横屏 (YouTube/B站)
resolution = "1792x1024" # 高清横屏 (仅 Pro)
成本对照:
分辨率 | sora-2 | sora-2-pro |
---|---|---|
720p | $0.10/秒 | $0.30/秒 |
1792p | ❌ | $0.50/秒 |
prompt 参数优化
优秀的 prompt 示例:
# ✅ 好的 prompt - 详细、具体
prompt = """
城市街道的延时摄影,从黄昏到夜晚,
车流如光轨般流动,霓虹灯逐渐亮起,
配上现代感的电子环境音
"""
# ❌ 差的 prompt - 过于简单
prompt = "城市街道"
Prompt 优化技巧:
- 描述画面: 场景、主体、动作
- 指定音频: 音乐类型、音效
- 风格要求: 色调、氛围、视角
- 技术细节: 镜头运动、速度
错误处理和调试
常见错误类型
import openai
try:
response = openai.videos.create(
model="sora-2",
prompt="视频描述",
resolution="1280x720"
)
except openai.RateLimitError:
# 错误 1: 速率限制
print("⚠️ 达到速率限制,请稍后重试")
print("建议: 降低请求频率或升级 Tier 等级")
except openai.AuthenticationError:
# 错误 2: 认证失败
print("❌ API Key 无效或过期")
print("解决: 检查 API Key 是否正确")
except openai.InvalidRequestError as e:
# 错误 3: 请求参数错误
print(f"❌ 参数错误: {e.message}")
print("解决: 检查 model, resolution 等参数")
except openai.InsufficientQuotaError:
# 错误 4: 余额不足
print("❌ 账户余额不足")
print("解决: 充值或切换到 API易平台")
except openai.APIError as e:
# 错误 5: API 服务错误
print(f"❌ API 错误: {e.message}")
print("解决: 稍后重试或联系技术支持")
错误码对照表
错误码 | 含义 | 解决方案 |
---|---|---|
400 | 请求参数错误 | 检查 JSON 格式和参数值 |
401 | 认证失败 | 检查 API Key 是否正确 |
429 | 速率限制 | 降低请求频率或升级 Tier |
500 | 服务器错误 | 稍后重试 |
503 | 服务不可用 | 等待服务恢复 |
调试技巧
import logging
# 启用详细日志
logging.basicConfig(level=logging.DEBUG)
# 调试模式
openai.log = "debug"
# 查看完整请求和响应
response = openai.videos.create(
model="sora-2",
prompt="测试视频",
resolution="1280x720"
)
print("请求参数:", response.request_params)
print("响应头:", response.headers)
print("响应体:", response.json())
使用 API易 平台快速接入
对于国内开发者,推荐使用 API易平台,只需修改一行代码:
Python 接入 API易
import openai
# 使用 API易平台
openai.api_key = "your-apiyi-key"
openai.base_url = "https://api.apiyi.com/v1" # 修改 base_url
# 其他代码完全相同
response = openai.videos.create(
model="sora-2",
prompt="一只橙色的猫在阳光下的花园里玩耍",
resolution="1280x720"
)
Node.js 接入 API易
const OpenAI = require('openai');
const openai = new OpenAI({
apiKey: 'your-apiyi-key',
baseURL: 'https://api.apiyi.com/v1' // 修改 baseURL
});
// 其他代码完全相同
const response = await openai.videos.create({
model: 'sora-2',
prompt: '一只橙色的猫在阳光下的花园里玩耍',
resolution: '1280x720'
});
cURL 接入 API易
curl https://api.apiyi.com/v1/videos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-apiyi-key" \
-d '{
"model": "sora-2",
"prompt": "一只橙色的猫在阳光下的花园里玩耍",
"resolution": "1280x720"
}'
💡 API易优势:
- ✅ 一行代码切换,无需改动业务逻辑
- ✅ 国内网络优化,访问速度更快
- ✅ 支付宝/微信支付,无需海外信用卡
- ✅ 人民币结算,汇率透明
- ✅ 7×24 中文技术支持
访问 apiyi.com 快速开通,首次充值享 9 折优惠。
完整 Demo 项目
Python Flask Web 应用
from flask import Flask, request, jsonify
import openai
import os
app = Flask(__name__)
openai.api_key = os.environ.get("OPENAI_API_KEY")
@app.route('/generate', methods=['POST'])
def generate_video():
data = request.json
try:
response = openai.videos.create(
model=data.get('model', 'sora-2'),
prompt=data['prompt'],
resolution=data.get('resolution', '1280x720')
)
return jsonify({
'success': True,
'video_url': response.url,
'duration': response.duration,
'cost': response.cost
})
except Exception as e:
return jsonify({
'success': False,
'error': str(e)
}), 500
if __name__ == '__main__':
app.run(debug=True, port=5000)
React 前端调用
// React 组件
import { useState } from 'react';
function VideoGenerator() {
const [prompt, setPrompt] = useState('');
const [loading, setLoading] = useState(false);
const [result, setResult] = useState(null);
const handleGenerate = async () => {
setLoading(true);
try {
const response = await fetch('/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
prompt,
model: 'sora-2',
resolution: '1280x720'
})
});
const data = await response.json();
setResult(data);
} catch (error) {
console.error('生成失败:', error);
} finally {
setLoading(false);
}
};
return (
<div>
<textarea
value={prompt}
onChange={(e) => setPrompt(e.target.value)}
placeholder="输入视频描述..."
/>
<button onClick={handleGenerate} disabled={loading}>
{loading ? '生成中...' : '生成视频'}
</button>
{result?.success && (
<div>
<video src={result.video_url} controls />
<p>时长: {result.duration}秒 | 成本: ${result.cost}</p>
</div>
)}
</div>
);
}
最佳实践总结
1. 安全性
# ✅ 使用环境变量存储 API Key
import os
api_key = os.environ.get("OPENAI_API_KEY")
# ❌ 不要硬编码 API Key
api_key = "sk-proj-xxxxx" # 危险!
2. 错误处理
# ✅ 实现重试机制
for attempt in range(3):
try:
response = generate_video(prompt)
break
except RateLimitError:
time.sleep(2 ** attempt)
# ✅ 记录错误日志
except Exception as e:
logging.error(f"生成失败: {e}")
3. 成本优化
# ✅ 先用标准版测试
test_result = generate_video(prompt, model="sora-2")
# 确认效果后再用 Pro 版
if test_result_ok:
final_result = generate_video(prompt, model="sora-2-pro")
4. 性能优化
# ✅ 批量请求使用并发
import asyncio
async def batch_generate(prompts):
tasks = [generate_video_async(p) for p in prompts]
return await asyncio.gather(*tasks)
总结
通过本教程,你已经掌握了 Sora 2 API 的完整接入流程:
核心步骤:
- ✅ 获取 API Key (OpenAI 或 API易)
- ✅ 安装 SDK (Python/Node.js)
- ✅ 编写调用代码
- ✅ 处理错误和优化
代码示例:
- 🐍 Python 完整实现 (含重试、批量)
- 🟢 Node.js/TypeScript 实现
- 🔧 cURL 命令行工具
- 🌐 Web 应用 Demo
关键建议:
- 💡 国内开发者优先选择 API易平台
- 💡 生产环境必须实现错误处理
- 💡 先用标准版测试,再用 Pro 版
- 💡 使用环境变量保护 API Key
访问 API易 apiyi.com 立即开始你的 Sora 2 API 开发之旅,享受人民币结算和中文技术支持!