first
This commit is contained in:
459
README.md
Normal file
459
README.md
Normal file
@@ -0,0 +1,459 @@
|
||||
# 🚀 OpenAI Team Auto Provisioner
|
||||
|
||||
<div align="center">
|
||||
|
||||
**OpenAI Team 账号自动批量注册 & 授权入库工具**
|
||||
|
||||
[](https://www.python.org/)
|
||||
[](https://drissionpage.cn/)
|
||||
[](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 邮箱必须是自己可控的域名邮箱,才能接收验证码完成授权入库。如果是第三方邮箱(如 Gmail),Owner 账号无法入库,只能邀请成员账号。
|
||||
|
||||
**格式 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** | ⚠️ 需自有域名邮箱 | ✅ 支持 | 手动提供 | 已有 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. 运行
|
||||
|
||||
```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)
|
||||
Reference in New Issue
Block a user