660d43161dac0faba717a6f4e6385e683030d1cd
🚀 OpenAI Team Auto Provisioner
✨ 功能特性
- 🔄 全自动化流程 - 从邮箱创建到授权入库一键完成
- 📧 多邮箱系统支持 - 支持 Cloud Mail 自建邮箱和 GPTMail 临时邮箱
- 👥 Team 批量邀请 - 一次性邀请多个账号到 Team
- 🌐 浏览器自动化 - 基于 DrissionPage 的智能注册
- 🔐 多授权服务支持 - 支持 CRS / CPA / S2A 三种授权入库方式
- 💾 断点续传 - 支持中断恢复,避免重复操作
- 📊 状态追踪 - 详细的账号状态记录与追踪
- 🌍 代理轮换 - 支持多代理配置和自动轮换
- 🎭 浏览器指纹 - 随机浏览器指纹防检测
📋 前置要求
- Python 3.12+
- uv (推荐) 或 pip
- Chrome 浏览器
- 邮箱服务 API
- 授权服务 API (CRS / CPA / S2A 任选其一)
🛠️ 快速开始
1. 安装依赖
# 使用 uv (推荐)
uv sync
# 或使用 pip
pip install -r requirements.txt
2. 配置文件
# 复制配置模板
cp config.toml.example config.toml
cp team.json.example team.json
3. 编辑配置
config.toml - 主配置文件
# ==================== 服务选择 ====================
# 邮箱系统: "cloudmail" (自建邮箱) 或 "gptmail" (临时邮箱)
email_provider = "gptmail"
# 授权服务: "crs" / "cpa" / "s2a"
auth_provider = "cpa"
# 是否将 Team Owner 也添加到授权服务入库
# - true: Owner 账号也会进行授权并入库 (需要 Owner 邮箱能接收验证码)
# - false: 仅处理邀请的成员账号,Owner 不入库
include_team_owners = false
# ==================== 邮箱服务配置 ====================
# Cloud Mail 邮箱服务 (email_provider = "cloudmail" 时使用)
[email]
api_base = "https://your-email-service.com/api/public"
api_auth = "your-api-auth-token"
domains = ["domain1.com", "domain2.com"]
role = "gpt-team"
web_url = "https://your-email-service.com"
# GPTMail 临时邮箱 (email_provider = "gptmail" 时使用)
[gptmail]
api_base = "https://mail.chatgpt.org.uk"
api_key = "gpt-test"
prefix = "" # 邮箱前缀,留空自动生成
domains = [] # 可用域名列表,留空使用默认
# ==================== 授权服务配置 ====================
# CRS 服务配置 (auth_provider = "crs" 时使用)
[crs]
api_base = "https://your-crs-service.com"
admin_token = "your-admin-token"
# CPA 服务 (auth_provider = "cpa" 时使用)
[cpa]
api_base = "http://your-cpa-service:8317"
admin_password = "your-admin-password"
poll_interval = 2 # 轮询间隔 (秒)
poll_max_retries = 30 # 最大重试次数
is_webui = true
# S2A 服务 (auth_provider = "s2a" 时使用)
[s2a]
api_base = "https://your-sub2api-service.com/api/v1"
admin_key = "your-admin-api-key" # Admin API Key (推荐)
admin_token = "" # JWT Token (备选)
concurrency = 10 # 账号并发数
priority = 50 # 账号优先级
group_ids = [] # 分组 ID 列表
group_names = ["codex"] # 分组名称列表 (自动解析为 ID)
# ==================== 账号配置 ====================
[account]
default_password = "YourSecurePassword@2025"
accounts_per_team = 4
# ==================== 浏览器配置 ====================
[browser]
wait_timeout = 60
short_wait = 10
headless = false # 无头模式
# ==================== 代理配置 (可选) ====================
proxy_enabled = false
# [[proxies]]
# type = "socks5"
# host = "127.0.0.1"
# port = 1080
# 更多配置项请参考 config.toml.example
team.json - Team 凭证配置
💡 通过访问
https://chatgpt.com/api/auth/session获取(需先登录 ChatGPT)
格式 1: 旧格式 (完整 Session)
[
{
"user": { "email": "team-admin@example.com" },
"account": {
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"organizationId": "org-xxxxxxxxxxxxxxxxxxxxxxxx"
},
"accessToken": "eyJhbGciOiJSUzI1NiIs..."
}
]
⚠️ 注意: 格式 1 的 Team Owner 邮箱必须是自己可控的域名邮箱,才能接收验证码完成授权入库。如果是第三方邮箱(如 Gmail),Owner 账号无法入库,只能邀请成员账号。
格式 2: 新格式 (邮箱密码 + Token)
[
{
"account": "team-admin@example.com",
"password": "your-password",
"token": "eyJhbGciOiJSUzI1NiIs..."
}
]
格式 3: 新格式 (仅邮箱密码,自动登录获取 Token)
[
{
"account": "team-admin@example.com",
"password": "your-password"
}
]
💡 格式 3 无需提供 Token,程序会自动登录获取并保存到配置文件
三种格式的处理策略
| 格式 | Owner 授权入库 | 成员邀请 | Token 获取 | 适用场景 |
|---|---|---|---|---|
| 格式 1 | ⚠️ 需自有域名邮箱 | ✅ 支持 | 手动提供 | 已有 Session,Owner 用第三方邮箱 |
| 格式 2 | ✅ 支持 | ✅ 支持 | 手动提供 | 已有 Token,Owner 可接收验证码 |
| 格式 3 | ✅ 支持 | ✅ 支持 | 自动登录 | 最简配置,Owner 可接收验证码 |
详细说明:
-
格式 1 (旧格式): 直接使用 ChatGPT Session,Owner 使用 OTP 验证码登录授权。如果 Owner 邮箱是 Gmail 等第三方邮箱,无法接收验证码,则 Owner 账号不会入库,仅邀请成员账号。
-
格式 2 (新格式 + Token): 提供邮箱密码和 Token,Owner 使用密码登录进行授权。适合已经有 Token 且 Owner 邮箱可接收验证码的场景。
-
格式 3 (新格式 无 Token): 仅提供邮箱密码,程序会先自动登录获取 Token 并保存,然后进行后续流程。最简单的配置方式,推荐使用。
4. 运行
# 运行所有 Team
uv run python run.py
# 单个 Team 模式
uv run python run.py single 0
# 测试模式 (仅创建邮箱和邀请)
uv run python run.py test
# 查看状态
uv run python run.py status
🔐 授权服务说明
本项目支持三种授权入库服务,通过 auth_provider 配置选择:
| 服务 | 说明 | 特点 |
|---|---|---|
| CRS | Claude Relay Service | 需手动添加账号,支持 Token 管理 |
| CPA | Codex/Copilot Authorization | 后台自动处理,轮询授权状态 |
| S2A | Sub2API | 支持 OAuth 授权,自动入库,支持分组 |
CRS 配置
auth_provider = "crs"
[crs]
api_base = "https://your-crs-service.com"
admin_token = "your-admin-token"
CPA 配置
auth_provider = "cpa"
[cpa]
api_base = "http://your-cpa-service:8317"
admin_password = "your-admin-password"
poll_interval = 2
poll_max_retries = 30
is_webui = true
S2A 配置
auth_provider = "s2a"
[s2a]
api_base = "https://your-sub2api-service.com/api/v1"
# 认证方式二选一 (优先使用 admin_key)
admin_key = "your-admin-api-key"
admin_token = ""
# 账号配置
concurrency = 10
priority = 50
# 分组配置 (二选一)
group_ids = []
group_names = ["codex"]
📁 项目结构
oai-team-auto-provisioner/
│
├── 🚀 run.py # 主入口脚本
├── ⚙️ config.py # 配置加载模块
│
├── 📧 email_service.py # 邮箱服务 (创建用户、获取验证码)
├── 👥 team_service.py # Team 服务 (邀请管理)
├── 🌐 browser_automation.py # 浏览器自动化 (注册流程)
│
├── 🔐 授权服务模块
│ ├── crs_service.py # CRS 服务
│ ├── cpa_service.py # CPA 服务
│ └── s2a_service.py # S2A (Sub2API) 服务
│
├── 🛠️ utils.py # 工具函数 (CSV、状态追踪)
├── 📊 logger.py # 日志模块
│
├── 📝 config.toml.example # 配置模板
├── 🔑 team.json.example # Team 凭证模板
│
├── 📂 logs/ # 日志目录
│ └── app.log # 运行日志 (自动轮转)
│
└── 📂 自动生成文件
├── accounts.csv # 账号记录
├── team_tracker.json # 状态追踪
└── domain_blacklist.json # 域名黑名单
🔄 工作流程
整体流程图
┌──────────────────────┐
│ 🚀 python run.py │
└──────────┬───────────┘
│
┌──────────▼───────────┐
│ 📋 加载配置文件 │
│ config.toml │
│ team.json │
└──────────┬───────────┘
│
┌──────────▼───────────┐
│ 🔐 验证授权服务连接 │
│ CRS / CPA / S2A │
└──────────┬───────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 格式 3 │ │ 格式 2 │ │ 格式 1 │
│ 仅邮箱密码 │ │邮箱密码+Token│ │ 完整Session │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
▼ │ │
┌─────────────┐ │ │
│ 🔑 浏览器 │ │ │
│ 自动登录 │ │ │
│ 获取Token │ │ │
│ 同时授权 │ │ │
└──────┬──────┘ │ │
│ │ │
└───────────────────────────┼───────────────────────────┘
│
▼
┌───────────────────────────────┐
│ 🔁 遍历每个 Team │
└───────────────┬───────────────┘
│
┌───────────────────────────▼───────────────────────────┐
│ │
│ 📧 Step 1: 批量创建邮箱 │
│ └─ Cloud Mail / GPTMail API │
│ │
│ 👥 Step 2: 批量邀请到 Team │
│ └─ ChatGPT API 邀请成员 │
│ │
│ ┌─────────────────────────────────┐ │
│ │ 🔁 遍历每个邮箱账号 │ │
│ │ │ │
│ │ 🌐 Step 3: 浏览器自动注册 │ │
│ │ └─ DrissionPage 自动化 │ │
│ │ └─ 填写信息 + 邮箱验证码 │ │
│ │ │ │
│ │ 🔐 Step 4: Codex 授权 │ │
│ │ └─ 生成授权链接 │ │
│ │ └─ 自动登录完成授权 │ │
│ │ │ │
│ │ 💾 Step 5: 授权服务入库 │ │
│ │ └─ CRS: 手动添加账号 │ │
│ │ └─ CPA: 后台自动处理 │ │
│ │ └─ S2A: OAuth 自动入库 │ │
│ │ │ │
│ └─────────────────────────────────┘ │
│ │
└───────────────────┬───────────────────┘
│
┌───────────────────▼───────────────────┐
│ 👑 处理 Team Owner (可选) │
│ └─ include_team_owners = true │
└───────────────────┬───────────────────┘
│
┌───────────▼───────────┐
│ ✅ 完成 & 打印摘要 │
│ 📊 保存 CSV 记录 │
└───────────────────────┘
状态流转
账号在处理过程中会经历以下状态:
invited → registered → authorized → completed
│ │ │
│ │ └─→ partial (入库失败)
│ │
│ └─→ auth_failed (授权失败)
│
└─→ register_failed (注册失败)
| 状态 | 说明 | 下一步操作 |
|---|---|---|
invited |
已邀请到 Team | 等待注册 |
registered |
已完成注册 | 等待授权 |
authorized |
已完成授权 | 等待入库 |
completed |
全部完成 | 无 |
partial |
授权成功但入库失败 | 重试入库 |
auth_failed |
授权失败 | 重试授权 |
register_failed |
注册失败 | 重试注册 |
team_owner |
Team Owner (格式1) | OTP 验证码登录授权 |
💡 程序支持断点续传,中断后重新运行会自动从未完成的状态继续处理
三种格式的处理差异
| 阶段 | 格式 1 (完整Session) | 格式 2 (邮箱密码+Token) | 格式 3 (仅邮箱密码) |
|---|---|---|---|
| Token 获取 | 手动提供 accessToken | 手动提供 token | 自动登录获取 |
| Owner 登录方式 | OTP 验证码 | 密码登录 | 密码登录 (登录时同时授权) |
| Owner 授权 | 需自有域名邮箱收验证码 | 密码登录后授权 | 登录时已完成 |
| 成员处理 | 正常流程 | 正常流程 | 正常流程 |
📊 输出文件
| 文件 | 说明 |
|---|---|
accounts.csv |
所有账号记录 (邮箱、密码、Team、状态、授权 ID) |
team_tracker.json |
每个 Team 的账号处理状态追踪 |
domain_blacklist.json |
不可用的邮箱域名黑名单 |
🤝 相关项目
📧 邮箱服务
| 服务 | 说明 | 配置 |
|---|---|---|
| Cloud Mail | 自建邮箱系统 | email_provider = "cloudmail" |
| GPTMail | 临时邮箱服务 (API 文档) | email_provider = "gptmail" |
🔐 授权服务
| 服务 | 说明 | 配置 |
|---|---|---|
| Claude Relay Service | Token 管理服务 | auth_provider = "crs" |
| CLIProxyAPI | Codex 授权服务 | auth_provider = "cpa" |
| Sub2API | OAuth 授权入库 | auth_provider = "s2a" |
⚠️ 免责声明
本项目仅供学习和研究使用。使用者需自行承担使用风险,请遵守相关服务条款。
📄 License
Description
Languages
Python
99.3%
Shell
0.7%