This commit is contained in:
2026-01-15 23:02:16 +08:00
commit 06f906abc7
20 changed files with 9269 additions and 0 deletions

459
README.md Normal file
View File

@@ -0,0 +1,459 @@
# 🚀 OpenAI Team Auto Provisioner
<div align="center">
**OpenAI Team 账号自动批量注册 & 授权入库工具**
[![Python](https://img.shields.io/badge/Python-3.12+-blue.svg)](https://www.python.org/)
[![DrissionPage](https://img.shields.io/badge/DrissionPage-4.1+-green.svg)](https://drissionpage.cn/)
[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
</div>
---
## ✨ 功能特性
- 🔄 **全自动化流程** - 从邮箱创建到授权入库一键完成
- 📧 **多邮箱系统支持** - 支持 Cloud Mail 自建邮箱和 GPTMail 临时邮箱
- 👥 **Team 批量邀请** - 一次性邀请多个账号到 Team
- 🌐 **浏览器自动化** - 基于 DrissionPage 的智能注册
- 🔐 **多授权服务支持** - 支持 CRS / CPA / S2A 三种授权入库方式
- 💾 **断点续传** - 支持中断恢复,避免重复操作
- 📊 **状态追踪** - 详细的账号状态记录与追踪
- 🌍 **代理轮换** - 支持多代理配置和自动轮换
- 🎭 **浏览器指纹** - 随机浏览器指纹防检测
---
## 📋 前置要求
- Python 3.12+
- [uv](https://github.com/astral-sh/uv) (推荐) 或 pip
- Chrome 浏览器
- 邮箱服务 API
- 授权服务 API (CRS / CPA / S2A 任选其一)
---
## 🛠️ 快速开始
### 1. 安装依赖
```bash
# 使用 uv (推荐)
uv sync
# 或使用 pip
pip install -r requirements.txt
```
### 2. 配置文件
```bash
# 复制配置模板
cp config.toml.example config.toml
cp team.json.example team.json
```
### 3. 编辑配置
#### `config.toml` - 主配置文件
```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)**
```json
[
{
"user": { "email": "team-admin@example.com" },
"account": {
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"organizationId": "org-xxxxxxxxxxxxxxxxxxxxxxxx"
},
"accessToken": "eyJhbGciOiJSUzI1NiIs..."
}
]
```
> ⚠️ **注意**: 格式 1 的 Team Owner 邮箱必须是自己可控的域名邮箱,才能接收验证码完成授权入库。如果是第三方邮箱(如 GmailOwner 账号无法入库,只能邀请成员账号。
**格式 2: 新格式 (邮箱密码 + Token)**
```json
[
{
"account": "team-admin@example.com",
"password": "your-password",
"token": "eyJhbGciOiJSUzI1NiIs..."
}
]
```
**格式 3: 新格式 (仅邮箱密码,自动登录获取 Token)**
```json
[
{
"account": "team-admin@example.com",
"password": "your-password"
}
]
```
> 💡 格式 3 无需提供 Token程序会自动登录获取并保存到配置文件
#### 三种格式的处理策略
| 格式 | Owner 授权入库 | 成员邀请 | Token 获取 | 适用场景 |
|:---:|:---:|:---:|:---:|------|
| **格式 1** | ⚠️ 需自有域名邮箱 | ✅ 支持 | 手动提供 | 已有 SessionOwner 用第三方邮箱 |
| **格式 2** | ✅ 支持 | ✅ 支持 | 手动提供 | 已有 TokenOwner 可接收验证码 |
| **格式 3** | ✅ 支持 | ✅ 支持 | 自动登录 | 最简配置Owner 可接收验证码 |
**详细说明:**
- **格式 1 (旧格式)**: 直接使用 ChatGPT SessionOwner 使用 OTP 验证码登录授权。如果 Owner 邮箱是 Gmail 等第三方邮箱,无法接收验证码,则 Owner 账号不会入库,仅邀请成员账号。
- **格式 2 (新格式 + Token)**: 提供邮箱密码和 TokenOwner 使用密码登录进行授权。适合已经有 Token 且 Owner 邮箱可接收验证码的场景。
- **格式 3 (新格式 无 Token)**: 仅提供邮箱密码,程序会先自动登录获取 Token 并保存,然后进行后续流程。最简单的配置方式,推荐使用。
### 4. 运行
```bash
# 运行所有 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 配置
```toml
auth_provider = "crs"
[crs]
api_base = "https://your-crs-service.com"
admin_token = "your-admin-token"
```
### CPA 配置
```toml
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 配置
```toml
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](https://github.com/maillab/cloud-mail) | 自建邮箱系统 | `email_provider = "cloudmail"` |
| [GPTMail](https://mail.chatgpt.org.uk) | 临时邮箱服务 ([API 文档](https://www.chatgpt.org.uk/2025/11/gptmailapiapi.html)) | `email_provider = "gptmail"` |
### 🔐 授权服务
| 服务 | 说明 | 配置 |
|------|------|------|
| [Claude Relay Service](https://github.com/Wei-Shaw/claude-relay-service) | Token 管理服务 | `auth_provider = "crs"` |
| [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) | Codex 授权服务 | `auth_provider = "cpa"` |
| [Sub2API](https://github.com/Wei-Shaw/sub2api) | OAuth 授权入库 | `auth_provider = "s2a"` |
---
## ⚠️ 免责声明
本项目仅供学习和研究使用。使用者需自行承担使用风险,请遵守相关服务条款。
---
## 📄 License
[MIT](LICENSE)