逆向Sora 的 Web 接口包装成了标准的 OpenAI API 格式-系统架构

一、概述

通过逆向工程,将 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())

六、总结

  1. OpenAI 兼容:完全遵循 OpenAI API 规范,无缝集成现有工具链
  2. 多账号池化:支持多 Token 管理,自动负载均衡
  3. 智能刷新:Token 即将过期时自动刷新,保证服务连续性
  4. 并发控制:精细的并发管理,避免账号被封
  5. 代理支持:支持 HTTP/SOCKS5 代理,应对网络限制
  6. 流式响应:实时返回生成进度,提升用户体验
  7. 文件缓存:自动缓存生成结果,加速重复访问

逆向工程将 Web 服务包装成标准 API,对于理解 API 网关设计、Token 管理、任务队列等。

相关推荐
CoolerWu1 小时前
Trae Solo 实战指南:从"会用"到"用好"的协作方法论
前端·javascript
云雾J视界1 小时前
当AI能写代码时,顶级工程师在做什么?大模型时代的系统架构思维重塑
人工智能·系统架构·思维重塑·能力边界·能力重构·系统定义
8***84821 小时前
Nginx三种安装方式
运维·nginx
听风说图1 小时前
Figma画布协议揭秘:组件实例的SymbolOverrides覆盖机制
前端·canvas
r***86981 小时前
docker离线安装及部署各类中间件(x86系统架构)
docker·中间件·系统架构
小杨前端1 小时前
前端如何自己实现一个webpack的热更新?
前端
@大迁世界1 小时前
02.CSS变量 (Variables)
前端·css
鹏多多1 小时前
轻量+响应式!React瀑布流插件react-masonry-css的详细教程和案例
前端·javascript·react.js
XH-hui1 小时前
【打靶日记】群内靶机 Open
linux·网络安全