逆向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 管理、任务队列等。

相关推荐
星星在线14 小时前
MusicFree:一个「All in One」的个人音乐服务器,让听歌回归简单
前端·后端
IT_陈寒15 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x16 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
京东云开发者16 小时前
京东市民服务又“上新”!这次是黑龙江“龙易办”
前端
袋鱼不重17 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
大树8817 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠17 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
Fireworks17 小时前
深入vue3源码解读 -- 1、响应式的基础概念
前端
程序员黑豆17 小时前
JDK 下载安装与配置详细教程
java·前端·ai编程
hunterandroid18 小时前
文件存储:内部存储与外部存储
前端