Files
codexTool/README.md
2026-01-15 23:02:16 +08:00

460 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🚀 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)