管理 OpenAI 账号的 Web UI 系统,支持多种邮箱服务、并发批量注册、代理管理和账号管理。
⚠️ 免责声明:本工具仅供学习和研究使用,使用本工具产生的一切后果由使用者自行承担。请遵守相关服务的使用条款,不要用于任何违法或不当用途。 如有侵权,请及时联系,会及时删除。
DuckMail
注册模式
Outlook 批量注册(指定账户逐一注册)
并发控制
日志混合显示,带 [任务N] 前缀区分
实时监控
降级轮询备用方案
代理管理
代理列表(随机选取,支持设置默认代理,记录使用时间)
账号管理
.json 文件.zip,每个账号一个独立文件Codex Auth 登录 成功后才能导出上传目标(直连不走代理):
proxy_url支付升级
Team 套餐支持自定义工作区名称、座位数、计费周期
系统设置
# 使用 uv(推荐)
uv sync
# 或使用 pip
pip install -r requirements.txt
复制 .env.example 为 .env,按需填写:
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=18080src/config/constants.py 里的 DEFAULT_WEBUI_PORTdocker-compose.yml 顶部的 x-webui-portDockerfile 里的 ARG DEFAULT_WEBUI_PORT补充说明:
- src/config/constants.py 的 DEFAULT_WEBUI_PORT 会同时影响默认 Web UI 端口、默认回调地址和 e2e 脚本默认地址。
- docker-compose.yml 里已经把端口映射、容器内 WEBUI_PORT 和健康检查统一绑到同一个 x-webui-port,改一处就够。
# 默认启动(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 镜像已托管至 GitHub Container Registry (GHCR)。
在项目根目录下,直接使用 docker-compose 启动:
docker-compose up -d
你可以在 docker-compose.yml 中修改相关的环境变量,例如配置端口或者设置 WEBUI_ACCESS_PASSWORD 访问密码。
如果要修改 Docker Compose 对外端口,直接改文件顶部这一行即可:
x-webui-port: &webui-port 15555
这一个值会同时同步到:
WEBUI_PORT如果你不想使用 docker-compose,也可以直接拉取并运行镜像:
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 需要一起改:
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
通过环境变量指定数据库连接字符串:
export APP_DATABASE_URL="postgresql://user:password@host:5432/dbname"
python webui.py
也支持 DATABASE_URL,优先级低于 APP_DATABASE_URL。
启动后访问 http://127.0.0.1:15555
# 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 |
| 方法 | 路径 | 说明 |
|---|---|---|
| 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 |
数据库信息 |
| 路径 | 说明 |
|---|---|
ws://host/api/ws/logs/{uuid} |
# 克隆项目
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 即可。
数据持久化:
volumes:
- ./data:/app/data
- ./logs:/app/logs
环境变量配置:
environment:
WEBUI_ACCESS_PASSWORD: mypassword
WEBUI_HOST: 0.0.0.0
WEBUI_PORT: 15555
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down
# 重新构建
docker-compose build --no-cache
data/ 目录和 SQLite 数据库data/register.dblogs/ 目录proxy_urlchatgpt.com/backend-api/me,走全局代理$ claude mcp add codex-manager \
-- python -m otcore.mcp_server <graph>