10分钟接入 Sora 2 API:Python/Node.js 完整开发指南

快速开始:10 分钟接入 Sora 2 API

Sora 2 API 的接入非常简单,只需要几个步骤就能开始生成专业的 AI 视频。本文将手把手教你从零开始接入 Sora 2 API,包含完整的代码示例和最佳实践。

你将学到:

  • 🔑 如何获取和配置 API Key
  • 🐍 Python SDK 完整接入流程
  • 🟢 Node.js SDK 完整接入流程
  • 🔧 cURL 命令行调用方法
  • ⚙️ 参数配置和优化技巧
  • 🐛 错误处理和调试方法

sora-2-api-quick-start 图示

准备工作:获取 API 访问权限

步骤 1: 注册 OpenAI 账户

访问 OpenAI Platform 注册账户。

重要提示:

  • ⚠️ Sora 2 API 不支持 Free 用户
  • ✅ 需要升级到付费账户
  • ✅ 至少充值 $5 美元

步骤 2: 获取 API Key

  1. 登录 OpenAI Platform
  2. 点击右上角头像 → View API keys
  3. 点击 Create new secret key
  4. 复制并安全保存 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 平台快速开通:

  1. 访问 apiyi.com 注册账户
  2. 使用支付宝/微信支付充值
  3. 获取 API Key (与 OpenAI 格式相同)
  4. 使用相同的代码调用 (仅需修改 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']}")

sora-2-api-quick-start 图示

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');
});

sora-2-api-quick-start 图示

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 优化技巧:

  1. 描述画面: 场景、主体、动作
  2. 指定音频: 音乐类型、音效
  3. 风格要求: 色调、氛围、视角
  4. 技术细节: 镜头运动、速度

sora-2-api-quick-start 图示

错误处理和调试

常见错误类型

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 的完整接入流程:

核心步骤:

  1. ✅ 获取 API Key (OpenAI 或 API易)
  2. ✅ 安装 SDK (Python/Node.js)
  3. ✅ 编写调用代码
  4. ✅ 处理错误和优化

代码示例:

  • 🐍 Python 完整实现 (含重试、批量)
  • 🟢 Node.js/TypeScript 实现
  • 🔧 cURL 命令行工具
  • 🌐 Web 应用 Demo

关键建议:

  • 💡 国内开发者优先选择 API易平台
  • 💡 生产环境必须实现错误处理
  • 💡 先用标准版测试,再用 Pro 版
  • 💡 使用环境变量保护 API Key

访问 API易 apiyi.com 立即开始你的 Sora 2 API 开发之旅,享受人民币结算和中文技术支持!

类似文章