一、概述
通过逆向工程,将 Sora 的 Web 接口包装成了标准的 OpenAI API 格式,让开发者可以:
- 通过代码自动化生成视频/图片
- 集成到现有的 AI 工作流中
- 管理多个 Sora 账号进行负载均衡

二、系统架构
bash
┌─────────────────────────────────────────────────────────────┐
│ 用户请求 │
│ POST /v1/chat/completions │
└─────────────────────────┬───────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ FastAPI 应用 │
│ ┌─────────────┐ ┌──────────────┐ ┌─────────────────────┐ │
│ │ API Routes │ │ Admin Routes │ │ Static Files │ │
│ └──────┬──────┘ └──────────────┘ └─────────────────────┘ │
└─────────┼───────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Generation Handler │
│ (处理图片/视频生成请求,管理任务轮询) │
└─────────┬───────────────────────────────────────────────────┘
│
┌─────┴─────┬─────────────┬────────────────┐
▼ ▼ ▼ ▼
┌────────┐ ┌─────────┐ ┌───────────┐ ┌─────────────────┐
│ Load │ │ Token │ │ Sora │ │ Concurrency │
│Balancer│ │ Manager │ │ Client │ │ Manager │
└────────┘ └─────────┘ └─────┬─────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ OpenAI Sora │
│ Backend API │
└─────────────────┘
三、核心模块详解
1. Token 管理系统
这是整个系统的"账号池"管理器。它负责:
Token 类型支持:
- Access Token (AT):直接用于 API 调用的令牌
- Session Token (ST):可以转换为 AT
- Refresh Token (RT):可以刷新获取新的 AT
核心功能:
python
# ST 转 AT:通过 Session Token 获取 Access Token
async def st_to_at(self, session_token: str) -> dict:
# 调用 sora.chatgpt.com/api/auth/session
# 返回 access_token, email, expires
# RT 转 AT:通过 Refresh Token 获取 Access Token
async def rt_to_at(self, refresh_token: str) -> dict:
# 调用 auth.openai.com/oauth/token
# 返回 access_token, refresh_token, expires_in
自动刷新机制:
当 Token 即将过期(24小时内)时,系统会自动尝试使用 ST 或 RT 刷新,保证服务不中断。
2. 负载均衡器
采用随机选择策略,从可用 Token 池中选取一个进行请求。
智能筛选逻辑:
python
async def select_token(self, for_image_generation=False, for_video_generation=False):
# 1. 获取所有激活的 Token
# 2. 如果是视频生成:
# - 过滤掉 video_enabled=False 的
# - 过滤掉不支持 Sora2 的
# - 过滤掉配额用尽的(检查 sora2_cooldown_until)
# 3. 如果是图片生成:
# - 过滤掉 image_enabled=False 的
# - 过滤掉被锁定的(正在使用中)
# 4. 检查并发限制
# 5. 随机选择一个
3. Sora 客户端
这是与 OpenAI Sora 后端通信的核心模块,使用 curl_cffi 库模拟浏览器请求。
主要 API 端点:
| 功能 | 端点 | 说明 |
|---|---|---|
| 用户信息 | /me | 获取账号信息 |
| 上传图片 | /uploads | 图生图/图生视频 |
| 生成图片 | /video_gen | 文生图/图生图 |
| 生成视频 | /nf/create | 文生视频/图生视频 |
| 任务状态 | /nf/pending | 查询进行中的任务 |
| 草稿列表 | /project_y/profile/drafts | 获取完成的视频 |
浏览器指纹模拟:
python
async with AsyncSession() as session:
response = await session.post(url,
impersonate="chrome", # 模拟 Chrome 浏览器
headers=headers,
proxy=proxy_url # 支持代理
)
4. 生成处理器
这是业务逻辑的核心,处理各种生成场景:
支持的生成模式:
python
MODEL_CONFIG = {
# 图片模型
"sora-image": {"type": "image", "width": 360, "height": 360},
"sora-image-landscape": {"type": "image", "width": 540, "height": 360},
"sora-image-portrait": {"type": "image", "width": 360, "height": 540},
# 视频模型(10秒 = 300帧)
"sora-video-10s": {"type": "video", "orientation": "landscape", "n_frames": 300},
"sora-video-portrait-10s": {"type": "video", "orientation": "portrait", "n_frames": 300},
# 视频模型(15秒 = 450帧)
"sora-video-15s": {"type": "video", "orientation": "landscape", "n_frames": 450},
}
任务轮询机制:
python
async def _poll_task_result(self, task_id, token, is_video, stream, prompt, token_id):
# 视频生成可能需要几分钟,采用轮询方式
for attempt in range(max_attempts):
if is_video:
# 查询 /nf/pending 获取进度
pending_tasks = await self.sora_client.get_pending_tasks(token)
# 如果任务不在 pending 中,说明完成了
# 从 /project_y/profile/drafts 获取结果
else:
# 图片生成查询 /v2/recent_tasks
result = await self.sora_client.get_image_tasks(token)
await asyncio.sleep(poll_interval)
5. 并发管理器
防止单个 Token 被过度使用:
- 图片并发限制:每个 Token 同时只能处理有限的图片生成请求
- 视频并发限制:每个 Token 同时只能处理有限的视频生成请求
- Token 锁:图片生成时锁定 Token,防止并发冲突
四、特色功能
1. 去水印功能
Sora 生成的视频默认带水印,项目通过"发布-下载-删除"的流程获取无水印版本:
python
# 1. 发布视频获取 post_id
post_id = await self.sora_client.post_video_for_watermark_free(generation_id, prompt, token)
# 2. 从第三方解析服务获取无水印链接
watermark_free_url = f"https://oscdn2.dyysy.com/MP4/{post_id}.mp4"
# 3. 下载并缓存
cached_filename = await self.file_cache.download_and_cache(watermark_free_url, "video")
# 4. 删除发布的帖子
await self.sora_client.delete_post(post_id, token)
2. 视频角色功能
支持从视频中提取角色,然后用这个角色生成新视频:
python
# 1. 上传视频创建角色
cameo_id = await self.sora_client.upload_character_video(video_bytes, token)
# 2. 等待角色处理完成
cameo_status = await self._poll_cameo_status(cameo_id, token)
# 3. 完成角色创建
character_id = await self.sora_client.finalize_character(...)
# 4. 使用角色生成视频
full_prompt = f"@{username} {prompt}" # 通过 @用户名 引用角色
task_id = await self.sora_client.generate_video(full_prompt, token, ...)
3. Remix 功能
基于已有视频进行二次创作:
python
# 从 Sora 分享链接提取视频 ID
remix_target_id = _extract_remix_id("https://sora.chatgpt.com/p/s_68e3a06dcd888191b150971da152c1f5")
# 调用 remix API
task_id = await self.sora_client.remix_video(
remix_target_id=remix_target_id,
prompt="改成动漫风格",
token=token
)
五、API 使用示例
项目完全兼容 OpenAI API 格式:
python
import requests
# 文生视频
response = requests.post(
"http://localhost:8000/v1/chat/completions",
headers={"Authorization": "Bearer your-api-key"},
json={
"model": "sora-video-landscape-10s",
"messages": [{"role": "user", "content": "顾客一只手拿着多汁的橘子,背景是一张写着"甜过初恋"的商家标牌"}],
"stream": True
},
stream=True
)
for line in response.iter_lines():
if line:
print(line.decode())
六、总结
- OpenAI 兼容:完全遵循 OpenAI API 规范,无缝集成现有工具链
- 多账号池化:支持多 Token 管理,自动负载均衡
- 智能刷新:Token 即将过期时自动刷新,保证服务连续性
- 并发控制:精细的并发管理,避免账号被封
- 代理支持:支持 HTTP/SOCKS5 代理,应对网络限制
- 流式响应:实时返回生成进度,提升用户体验
- 文件缓存:自动缓存生成结果,加速重复访问
逆向工程将 Web 服务包装成标准 API,对于理解 API 网关设计、Token 管理、任务队列等。