https://github.com/cnlimiter/codex-manager
https://github.com/cnlimiter/codex-manager
Last synced: 4 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/cnlimiter/codex-manager
- Owner: cnlimiter
- License: mit
- Created: 2026-03-15T12:59:27.000Z (5 months ago)
- Default Branch: master
- Last Pushed: 2026-03-28T08:39:44.000Z (4 months ago)
- Last Synced: 2026-03-28T13:12:01.898Z (4 months ago)
- Language: Python
- Size: 913 KB
- Stars: 1,658
- Watchers: 3
- Forks: 695
- Open Issues: 15
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# OpenAI 账号管理系统 v2
管理 OpenAI 账号的 Web UI 系统,支持多种邮箱服务、并发批量注册、代理管理和账号管理。
# 官方拉闸了,改变了授权流程,各位自行研究吧
> ⚠️ **免责声明**:本工具仅供学习和研究使用,使用本工具产生的一切后果由使用者自行承担。请遵守相关服务的使用条款,不要用于任何违法或不当用途。 如有侵权,请及时联系,会及时删除。
[](LICENSE)
[](https://www.python.org/)
## 功能特性
- **多邮箱服务支持**
- Tempmail.lol(临时邮箱,无需配置)
- Outlook(IMAP + XOAUTH2,支持批量导入)
- 自定义域名(两种子类型)
- **MoeMail**:标准 REST API,配置 API 地址 + API 密钥
- **TempMail**:自部署 Cloudflare Worker 临时邮箱,配置 Worker 地址 + Admin 密码
- DuckMail
- **DuckMail API**:兼容 DuckMail 接口,手动填写 API 地址、默认域名,可选 API Key
- **注册模式**
- 单次注册
- 批量注册(可配置数量和间隔时间)
- Outlook 批量注册(指定账户逐一注册)
- **并发控制**
- 流水线模式(Pipeline):每隔 interval 秒启动新任务,限制最大并发数
- 并行模式(Parallel):所有任务同时提交,Semaphore 控制最大并发
- 并发数可在 UI 自定义(1-50)
- 日志混合显示,带 `[任务N]` 前缀区分
- **实时监控**
- WebSocket 实时日志推送
- 跨页面导航后自动重连
- 降级轮询备用方案
- **代理管理**
- 动态代理(通过 API 每次获取新 IP)
- 代理列表(随机选取,支持设置默认代理,记录使用时间)
- **账号管理**
- 查看、删除、批量操作
- Token 刷新与验证
- 订阅状态管理(手动标记 / 自动检测 plus/team/free)
- 导出格式:JSON / CSV / CPA 格式 / Sub2API 格式
- 单个账号导出为独立 `.json` 文件
- 多个 CPA 账号打包为 `.zip`,每个账号一个独立文件
- Sub2API 格式所有账号合并为单个 JSON
- Codex Auth 格式需先在账号管理中手动执行 `Codex Auth 登录` 成功后才能导出
- 上传目标(直连不走代理):
- **CPA**:支持多服务配置,上传时选择目标服务,可按服务开关将账号实际代理写入 auth file 的 `proxy_url`
- **Sub2API**:支持多服务配置,标准 sub2api-data 格式
- **Team Manager**:支持多服务配置
- **支付升级**
- 为账号生成 ChatGPT Plus 或 Team 订阅支付链接
- 后端命令行以无痕模式自动打开 Chrome/Edge
- Team 套餐支持自定义工作区名称、座位数、计费周期
- **系统设置**
- 代理配置(动态代理 + 代理列表,支持设默认)
- CPA 服务列表管理(多服务,连接测试)
- Sub2API 服务列表管理(多服务,连接测试)
- Team Manager 服务列表管理(多服务,连接测试)
- Outlook OAuth 参数
- 注册参数(超时、重试、密码长度等)
- 验证码等待配置(超时时间、轮询间隔、收件箱未找到时最多重发次数)
- 数据库管理(备份、清理)
- 支持远程 PostgreSQL
## 快速开始
### 环境要求
- Python 3.10+
- [uv](https://github.com/astral-sh/uv)(推荐)或 pip
### 安装依赖
```bash
# 使用 uv(推荐)
uv sync
# 或使用 pip
pip install -r requirements.txt
```
### 环境变量配置(可选)
复制 `.env.example` 为 `.env`,按需填写:
```bash
cp .env.example .env
```
| 变量 | 说明 | 默认值 |
|------|------|--------|
| `APP_HOST` | 监听主机 | `0.0.0.0` |
| `APP_PORT` | 监听端口 | `15555` |
| `APP_ACCESS_PASSWORD` | Web UI 访问密钥 | `admin123` |
| `APP_DATABASE_URL` | 数据库连接字符串 | `data/database.db` |
> 优先级:命令行参数 > 环境变量(`.env`)> 数据库设置 > 默认值
### 修改端口
默认端口是 `15555`。现在已经收敛到少数几个固定入口:
- 本地临时启动改端口:直接用 `python webui.py --port 18080`
- 本地通过 `.env` 改端口:设置 `APP_PORT=18080`
- 源码里的默认端口:修改 `src/config/constants.py` 里的 `DEFAULT_WEBUI_PORT`
- Docker Compose 默认端口:修改 `docker-compose.yml` 顶部的 `x-webui-port`
- Docker 镜像构建默认端口:修改 `Dockerfile` 里的 `ARG DEFAULT_WEBUI_PORT`
补充说明:
- `src/config/constants.py` 的 `DEFAULT_WEBUI_PORT` 会同时影响默认 Web UI 端口、默认回调地址和 e2e 脚本默认地址。
- `docker-compose.yml` 里已经把端口映射、容器内 `WEBUI_PORT` 和健康检查统一绑到同一个 `x-webui-port`,改一处就够。
### 启动 Web UI
```bash
# 默认启动(0.0.0.0:15555)
python webui.py
# 指定地址和端口
python webui.py --host 0.0.0.0 --port 8080
# 调试模式(热重载)
python webui.py --debug
# 设置 Web UI 访问密钥
python webui.py --access-password mypassword
# 组合参数
python webui.py --host 0.0.0.0 --port 8080 --access-password mypassword
```
> `--access-password` 优先级高于数据库中保存的密钥设置,每次启动时生效。打包后的 exe 同样支持此参数:
> ```bash
> codex-register.exe --access-password mypassword
> ```
### Docker 部署
项目支持通过 Docker 进行容器化部署。Docker 镜像已托管至 GitHub Container Registry (GHCR)。
#### 使用 docker-compose (推荐)
在项目根目录下,直接使用 `docker-compose` 启动:
```bash
docker-compose up -d
```
你可以在 `docker-compose.yml` 中修改相关的环境变量,例如配置端口或者设置 `WEBUI_ACCESS_PASSWORD` 访问密码。
如果要修改 Docker Compose 对外端口,直接改文件顶部这一行即可:
```yaml
x-webui-port: &webui-port 15555
```
这一个值会同时同步到:
- 宿主机端口映射
- 容器内 `WEBUI_PORT`
- 健康检查访问地址
#### 直接使用 docker run
如果你不想使用 docker-compose,也可以直接拉取并运行镜像:
```bash
docker run -d \
-p 15555:15555 \
-e WEBUI_HOST=0.0.0.0 \
-e WEBUI_PORT=15555 \
-e WEBUI_ACCESS_PASSWORD=your_secure_password \
-v $(pwd)/data:/app/data \
--name codex-register \
ghcr.io/yunxilyf/codex-register:latest
```
环境变量说明:
- `WEBUI_HOST`: 监听的主机地址 (默认 `0.0.0.0`)
- `WEBUI_PORT`: 监听的端口 (默认 `15555`)
- `WEBUI_ACCESS_PASSWORD`: 设置 Web UI 的访问密码
- `DEBUG`: 设为 `1` 或 `true` 开启调试模式
- `LOG_LEVEL`: 日志级别,如 `info`, `debug`
> **注意**:`-v $(pwd)/data:/app/data` 挂载参数非常重要,它确保了你的数据库文件和账户信息在容器重启或更新后不会丢失。
如果你要把容器端口改成 `18080`,`-p` 和 `WEBUI_PORT` 需要一起改:
```bash
docker run -d \
-p 18080:18080 \
-e WEBUI_HOST=0.0.0.0 \
-e WEBUI_PORT=18080 \
-e WEBUI_ACCESS_PASSWORD=your_secure_password \
-v $(pwd)/data:/app/data \
--name codex-register \
ghcr.io/yunxilyf/codex-register:latest
```
### 使用远程 PostgreSQL
通过环境变量指定数据库连接字符串:
```bash
export APP_DATABASE_URL="postgresql://user:password@host:5432/dbname"
python webui.py
```
也支持 `DATABASE_URL`,优先级低于 `APP_DATABASE_URL`。
启动后访问 http://127.0.0.1:15555
## 打包为可执行文件
```bash
# Windows
build.bat
# Linux/macOS
bash build.sh
```
打包后生成 `codex-register.exe`(Windows)或 `codex-register`(Unix),双击或直接运行即可,无需安装 Python 环境。
## 项目结构
```
codex-register-v2/
├── webui.py # Web UI 入口
├── build.bat # Windows 打包脚本
├── build.sh # Linux/macOS 打包脚本
├── src/
│ ├── config/ # 配置管理(Pydantic Settings)
│ ├── core/
│ │ ├── openai/ # OAuth、Token 刷新、支付核心
│ │ └── upload/ # CPA / Sub2API / Team Manager 上传模块
│ ├── database/ # 数据库(SQLAlchemy + SQLite/PostgreSQL)
│ ├── services/ # 邮箱服务实现
│ └── web/
│ ├── app.py # 应用入口、路由挂载
│ ├── task_manager.py # 任务/日志/WebSocket 管理
│ └── routes/ # API 路由
│ └── upload/ # CPA / Sub2API / TM 服务管理路由
├── templates/ # Jinja2 HTML 模板
├── static/ # 静态资源(CSS / JS)
└── data/ # 运行时数据目录(数据库、日志)
```
## 技术栈
| 层级 | 技术 |
|------|------|
| Web 框架 | FastAPI + Uvicorn |
| 数据库 | SQLAlchemy + SQLite / PostgreSQL |
| 模板引擎 | Jinja2 |
| HTTP 客户端 | curl_cffi(浏览器指纹模拟) |
| 实时通信 | WebSocket |
| 并发 | asyncio Semaphore + ThreadPoolExecutor |
| 前端 | 原生 JavaScript(无框架) |
| 打包 | PyInstaller |
## API 端点
### 注册任务
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/registration/start` | 启动注册任务 |
| GET | `/api/registration/tasks` | 任务列表 |
| GET | `/api/registration/tasks/{uuid}/logs` | 任务日志 |
| POST | `/api/registration/tasks/{uuid}/cancel` | 取消任务 |
| GET | `/api/registration/available-services` | 可用邮箱服务 |
### 账号管理
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/accounts` | 账号列表(支持分页、筛选、搜索) |
| GET | `/api/accounts/{id}` | 账号详情 |
| PATCH | `/api/accounts/{id}` | 更新账号(状态/cookies) |
| DELETE | `/api/accounts/{id}` | 删除账号 |
| POST | `/api/accounts/batch-delete` | 批量删除 |
| POST | `/api/accounts/export/json` | 导出 JSON |
| POST | `/api/accounts/export/csv` | 导出 CSV |
| POST | `/api/accounts/export/cpa` | 导出 CPA 格式(单文件或 ZIP) |
| POST | `/api/accounts/export/sub2api` | 导出 Sub2API 格式 |
| POST | `/api/accounts/{id}/refresh` | 刷新 Token |
| POST | `/api/accounts/batch-refresh` | 批量刷新 Token |
| POST | `/api/accounts/{id}/validate` | 验证 Token |
| POST | `/api/accounts/batch-validate` | 批量验证 Token |
| POST | `/api/accounts/{id}/upload-cpa` | 上传单账号到 CPA |
| POST | `/api/accounts/batch-upload-cpa` | 批量上传到 CPA |
| POST | `/api/accounts/{id}/upload-sub2api` | 上传单账号到 Sub2API |
| POST | `/api/accounts/batch-upload-sub2api` | 批量上传到 Sub2API |
### 支付升级
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/payment/generate` | 生成 Plus/Team 支付链接 |
| POST | `/api/payment/open` | 后端无痕模式打开浏览器 |
| POST | `/api/payment/accounts/{id}/mark-subscription` | 手动标记订阅类型 |
| POST | `/api/payment/accounts/batch-check-subscription` | 批量检测订阅状态 |
| POST | `/api/payment/accounts/{id}/upload-tm` | 上传单账号到 Team Manager |
| POST | `/api/payment/accounts/batch-upload-tm` | 批量上传到 Team Manager |
### 邮箱服务
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/email-services` | 服务列表 |
| POST | `/api/email-services` | 添加服务 |
| PATCH | `/api/email-services/{id}` | 更新服务 |
| DELETE | `/api/email-services/{id}` | 删除服务 |
| POST | `/api/email-services/{id}/test` | 测试服务 |
| POST | `/api/email-services/outlook/batch-import` | 批量导入 Outlook |
### 上传服务管理
| 方法 | 路径 | 说明 |
|------|------|------|
| GET/POST | `/api/cpa-services` | CPA 服务列表/创建 |
| PUT/DELETE | `/api/cpa-services/{id}` | 更新/删除 CPA 服务 |
| POST | `/api/cpa-services/{id}/test` | 测试 CPA 连接 |
| GET/POST | `/api/sub2api-services` | Sub2API 服务列表/创建 |
| PUT/DELETE | `/api/sub2api-services/{id}` | 更新/删除 Sub2API 服务 |
| POST | `/api/sub2api-services/{id}/test` | 测试 Sub2API 连接 |
| GET/POST | `/api/tm-services` | Team Manager 服务列表/创建 |
| PUT/DELETE | `/api/tm-services/{id}` | 更新/删除 TM 服务 |
| POST | `/api/tm-services/{id}/test` | 测试 TM 连接 |
### 设置
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/settings` | 获取所有设置 |
| POST | `/api/settings/proxy/dynamic` | 更新动态代理设置 |
| GET/POST/DELETE | `/api/settings/proxies` | 代理列表管理 |
| POST | `/api/settings/proxies/{id}/set-default` | 设为默认代理 |
| GET | `/api/settings/database` | 数据库信息 |
### WebSocket
| 路径 | 说明 |
|------|------|
|| `ws://host/api/ws/logs/{uuid}` | 实时日志流 |
## Docker 部署
### 环境要求
- Docker
- Docker Compose
### 快速部署
```bash
# 克隆项目
git clone https://github.com/cnlimiter/codex-register.git
cd codex-register
# 启动服务
docker-compose up -d
```
服务启动后访问 http://localhost:15555
### 配置说明
**端口映射**:默认 `15555` 端口,修改 `docker-compose.yml` 顶部的 `x-webui-port` 即可。
**数据持久化**:
```yaml
volumes:
- ./data:/app/data
- ./logs:/app/logs
```
**环境变量配置**:
```yaml
environment:
WEBUI_ACCESS_PASSWORD: mypassword
WEBUI_HOST: 0.0.0.0
WEBUI_PORT: 15555
```
### 常用命令
```bash
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down
# 重新构建
docker-compose build --no-cache
```
## 注意事项
- 首次运行会自动创建 `data/` 目录和 SQLite 数据库
- 所有账号和设置数据存储在 `data/register.db`
- 日志文件写入 `logs/` 目录
- 代理优先级:动态代理 > 代理列表(随机/默认) > 直连
- CPA / Sub2API / Team Manager 上传始终直连,不走代理;其中 CPA 可选把账号记录的代理写入 auth file 的 `proxy_url`
- 注册时自动随机生成用户名和生日(年龄范围 18-45 岁)
- 验证码重发:收件箱超时未获取到验证码时,自动重新发送验证码并再次轮询,最多重发次数可在「验证码配置」中设置(默认 2 次,设为 0 禁用)
- 支付链接货币与计费国家动态对应,从 ChatGPT API 实时获取国家/货币列表(缓存 7 天),不再受限于内置静态映射表
- 支付链接生成使用账号 access_token 鉴权,走全局代理配置
- 无痕打开支付页默认调用系统 Chrome/Edge 的隐私模式
- 订阅状态自动检测调用 `chatgpt.com/backend-api/me`,走全局代理
- 批量注册并发数上限为 50,线程池大小已相应调整
## License
[MIT](LICENSE)