{"id":47633321,"url":"https://github.com/cnlimiter/codex-manager","last_synced_at":"2026-04-01T23:54:00.106Z","repository":{"id":344657592,"uuid":"1182385218","full_name":"cnlimiter/codex-manager","owner":"cnlimiter","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-28T08:39:44.000Z","size":935,"stargazers_count":1658,"open_issues_count":15,"forks_count":695,"subscribers_count":3,"default_branch":"master","last_synced_at":"2026-03-28T13:12:01.898Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cnlimiter.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-15T12:59:27.000Z","updated_at":"2026-03-28T12:43:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cnlimiter/codex-manager","commit_stats":null,"previous_names":["cnlimiter/codex-register","cnlimiter/codex-manager"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/cnlimiter/codex-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnlimiter%2Fcodex-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnlimiter%2Fcodex-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnlimiter%2Fcodex-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnlimiter%2Fcodex-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cnlimiter","download_url":"https://codeload.github.com/cnlimiter/codex-manager/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnlimiter%2Fcodex-manager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31293130,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-01T23:53:59.584Z","updated_at":"2026-04-01T23:54:00.097Z","avatar_url":"https://github.com/cnlimiter.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenAI 账号管理系统 v2\n\n管理 OpenAI 账号的 Web UI 系统，支持多种邮箱服务、并发批量注册、代理管理和账号管理。\n\n# 官方拉闸了,改变了授权流程,各位自行研究吧  \n\n\u003e ⚠️ **免责声明**：本工具仅供学习和研究使用，使用本工具产生的一切后果由使用者自行承担。请遵守相关服务的使用条款，不要用于任何违法或不当用途。 如有侵权，请及时联系，会及时删除。\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Python](https://img.shields.io/badge/Python-3.10%2B-blue.svg)](https://www.python.org/)\n\n## 功能特性\n\n- **多邮箱服务支持**\n  - Tempmail.lol（临时邮箱，无需配置）\n  - Outlook（IMAP + XOAUTH2，支持批量导入）\n  - 自定义域名（两种子类型）\n    - **MoeMail**：标准 REST API，配置 API 地址 + API 密钥\n    - **TempMail**：自部署 Cloudflare Worker 临时邮箱，配置 Worker 地址 + Admin 密码\n  - DuckMail\n    - **DuckMail API**：兼容 DuckMail 接口，手动填写 API 地址、默认域名，可选 API Key\n\n- **注册模式**\n  - 单次注册\n  - 批量注册（可配置数量和间隔时间）\n  - Outlook 批量注册（指定账户逐一注册）\n\n- **并发控制**\n  - 流水线模式（Pipeline）：每隔 interval 秒启动新任务，限制最大并发数\n  - 并行模式（Parallel）：所有任务同时提交，Semaphore 控制最大并发\n  - 并发数可在 UI 自定义（1-50）\n  - 日志混合显示，带 `[任务N]` 前缀区分\n\n- **实时监控**\n  - WebSocket 实时日志推送\n  - 跨页面导航后自动重连\n  - 降级轮询备用方案\n\n- **代理管理**\n  - 动态代理（通过 API 每次获取新 IP）\n  - 代理列表（随机选取，支持设置默认代理，记录使用时间）\n\n- **账号管理**\n  - 查看、删除、批量操作\n  - Token 刷新与验证\n  - 订阅状态管理（手动标记 / 自动检测 plus/team/free）\n  - 导出格式：JSON / CSV / CPA 格式 / Sub2API 格式\n    - 单个账号导出为独立 `.json` 文件\n    - 多个 CPA 账号打包为 `.zip`，每个账号一个独立文件\n    - Sub2API 格式所有账号合并为单个 JSON\n  - Codex Auth 格式需先在账号管理中手动执行 `Codex Auth 登录` 成功后才能导出\n  - 上传目标（直连不走代理）：\n    - **CPA**：支持多服务配置，上传时选择目标服务，可按服务开关将账号实际代理写入 auth file 的 `proxy_url`\n    - **Sub2API**：支持多服务配置，标准 sub2api-data 格式\n    - **Team Manager**：支持多服务配置\n\n- **支付升级**\n  - 为账号生成 ChatGPT Plus 或 Team 订阅支付链接\n  - 后端命令行以无痕模式自动打开 Chrome/Edge\n  - Team 套餐支持自定义工作区名称、座位数、计费周期\n\n- **系统设置**\n  - 代理配置（动态代理 + 代理列表，支持设默认）\n  - CPA 服务列表管理（多服务，连接测试）\n  - Sub2API 服务列表管理（多服务，连接测试）\n  - Team Manager 服务列表管理（多服务，连接测试）\n  - Outlook OAuth 参数\n  - 注册参数（超时、重试、密码长度等）\n  - 验证码等待配置（超时时间、轮询间隔、收件箱未找到时最多重发次数）\n  - 数据库管理（备份、清理）\n  - 支持远程 PostgreSQL\n\n## 快速开始\n\n### 环境要求\n\n- Python 3.10+\n- [uv](https://github.com/astral-sh/uv)（推荐）或 pip\n\n### 安装依赖\n\n```bash\n# 使用 uv（推荐）\nuv sync\n\n# 或使用 pip\npip install -r requirements.txt\n```\n\n### 环境变量配置（可选）\n\n复制 `.env.example` 为 `.env`，按需填写：\n\n```bash\ncp .env.example .env\n```\n\n| 变量 | 说明 | 默认值 |\n|------|------|--------|\n| `APP_HOST` | 监听主机 | `0.0.0.0` |\n| `APP_PORT` | 监听端口 | `15555` |\n| `APP_ACCESS_PASSWORD` | Web UI 访问密钥 | `admin123` |\n| `APP_DATABASE_URL` | 数据库连接字符串 | `data/database.db` |\n\n\u003e 优先级：命令行参数 \u003e 环境变量（`.env`）\u003e 数据库设置 \u003e 默认值\n\n### 修改端口\n\n默认端口是 `15555`。现在已经收敛到少数几个固定入口：\n\n- 本地临时启动改端口：直接用 `python webui.py --port 18080`\n- 本地通过 `.env` 改端口：设置 `APP_PORT=18080`\n- 源码里的默认端口：修改 `src/config/constants.py` 里的 `DEFAULT_WEBUI_PORT`\n- Docker Compose 默认端口：修改 `docker-compose.yml` 顶部的 `x-webui-port`\n- Docker 镜像构建默认端口：修改 `Dockerfile` 里的 `ARG DEFAULT_WEBUI_PORT`\n\n补充说明：\n- `src/config/constants.py` 的 `DEFAULT_WEBUI_PORT` 会同时影响默认 Web UI 端口、默认回调地址和 e2e 脚本默认地址。\n- `docker-compose.yml` 里已经把端口映射、容器内 `WEBUI_PORT` 和健康检查统一绑到同一个 `x-webui-port`，改一处就够。\n\n### 启动 Web UI\n\n```bash\n# 默认启动（0.0.0.0:15555）\npython webui.py\n\n# 指定地址和端口\npython webui.py --host 0.0.0.0 --port 8080\n\n# 调试模式（热重载）\npython webui.py --debug\n\n# 设置 Web UI 访问密钥\npython webui.py --access-password mypassword\n\n# 组合参数\npython webui.py --host 0.0.0.0 --port 8080 --access-password mypassword\n```\n\n\u003e `--access-password` 优先级高于数据库中保存的密钥设置，每次启动时生效。打包后的 exe 同样支持此参数：\n\u003e ```bash\n\u003e codex-register.exe --access-password mypassword\n\u003e ```\n\n### Docker 部署\n\n项目支持通过 Docker 进行容器化部署。Docker 镜像已托管至 GitHub Container Registry (GHCR)。\n\n#### 使用 docker-compose (推荐)\n\n在项目根目录下，直接使用 `docker-compose` 启动：\n\n```bash\ndocker-compose up -d\n```\n你可以在 `docker-compose.yml` 中修改相关的环境变量，例如配置端口或者设置 `WEBUI_ACCESS_PASSWORD` 访问密码。\n\n如果要修改 Docker Compose 对外端口，直接改文件顶部这一行即可：\n\n```yaml\nx-webui-port: \u0026webui-port 15555\n```\n\n这一个值会同时同步到：\n\n- 宿主机端口映射\n- 容器内 `WEBUI_PORT`\n- 健康检查访问地址\n\n#### 直接使用 docker run\n\n如果你不想使用 docker-compose，也可以直接拉取并运行镜像：\n\n```bash\ndocker run -d \\\n  -p 15555:15555 \\\n  -e WEBUI_HOST=0.0.0.0 \\\n  -e WEBUI_PORT=15555 \\\n  -e WEBUI_ACCESS_PASSWORD=your_secure_password \\\n  -v $(pwd)/data:/app/data \\\n  --name codex-register \\\n  ghcr.io/yunxilyf/codex-register:latest\n```\n\n环境变量说明：\n- `WEBUI_HOST`: 监听的主机地址 (默认 `0.0.0.0`)\n- `WEBUI_PORT`: 监听的端口 (默认 `15555`)\n- `WEBUI_ACCESS_PASSWORD`: 设置 Web UI 的访问密码\n- `DEBUG`: 设为 `1` 或 `true` 开启调试模式\n- `LOG_LEVEL`: 日志级别，如 `info`, `debug`\n\n\u003e **注意**：`-v $(pwd)/data:/app/data` 挂载参数非常重要，它确保了你的数据库文件和账户信息在容器重启或更新后不会丢失。\n\n如果你要把容器端口改成 `18080`，`-p` 和 `WEBUI_PORT` 需要一起改：\n\n```bash\ndocker run -d \\\n  -p 18080:18080 \\\n  -e WEBUI_HOST=0.0.0.0 \\\n  -e WEBUI_PORT=18080 \\\n  -e WEBUI_ACCESS_PASSWORD=your_secure_password \\\n  -v $(pwd)/data:/app/data \\\n  --name codex-register \\\n  ghcr.io/yunxilyf/codex-register:latest\n```\n\n### 使用远程 PostgreSQL\n\n通过环境变量指定数据库连接字符串：\n\n```bash\nexport APP_DATABASE_URL=\"postgresql://user:password@host:5432/dbname\"\npython webui.py\n```\n\n也支持 `DATABASE_URL`，优先级低于 `APP_DATABASE_URL`。\n\n启动后访问 http://127.0.0.1:15555\n\n## 打包为可执行文件\n\n```bash\n# Windows\nbuild.bat\n\n# Linux/macOS\nbash build.sh\n```\n\n打包后生成 `codex-register.exe`（Windows）或 `codex-register`（Unix），双击或直接运行即可，无需安装 Python 环境。\n\n## 项目结构\n\n```\ncodex-register-v2/\n├── webui.py            # Web UI 入口\n├── build.bat           # Windows 打包脚本\n├── build.sh            # Linux/macOS 打包脚本\n├── src/\n│   ├── config/         # 配置管理（Pydantic Settings）\n│   ├── core/\n│   │   ├── openai/     # OAuth、Token 刷新、支付核心\n│   │   └── upload/     # CPA / Sub2API / Team Manager 上传模块\n│   ├── database/       # 数据库（SQLAlchemy + SQLite/PostgreSQL）\n│   ├── services/       # 邮箱服务实现\n│   └── web/\n│       ├── app.py      # 应用入口、路由挂载\n│       ├── task_manager.py  # 任务/日志/WebSocket 管理\n│       └── routes/     # API 路由\n│           └── upload/ # CPA / Sub2API / TM 服务管理路由\n├── templates/          # Jinja2 HTML 模板\n├── static/             # 静态资源（CSS / JS）\n└── data/               # 运行时数据目录（数据库、日志）\n```\n\n## 技术栈\n\n| 层级 | 技术 |\n|------|------|\n| Web 框架 | FastAPI + Uvicorn |\n| 数据库 | SQLAlchemy + SQLite / PostgreSQL |\n| 模板引擎 | Jinja2 |\n| HTTP 客户端 | curl_cffi（浏览器指纹模拟） |\n| 实时通信 | WebSocket |\n| 并发 | asyncio Semaphore + ThreadPoolExecutor |\n| 前端 | 原生 JavaScript（无框架） |\n| 打包 | PyInstaller |\n\n## API 端点\n\n### 注册任务\n\n| 方法 | 路径 | 说明 |\n|------|------|------|\n| POST | `/api/registration/start` | 启动注册任务 |\n| GET | `/api/registration/tasks` | 任务列表 |\n| GET | `/api/registration/tasks/{uuid}/logs` | 任务日志 |\n| POST | `/api/registration/tasks/{uuid}/cancel` | 取消任务 |\n| GET | `/api/registration/available-services` | 可用邮箱服务 |\n\n### 账号管理\n\n| 方法 | 路径 | 说明 |\n|------|------|------|\n| GET | `/api/accounts` | 账号列表（支持分页、筛选、搜索） |\n| GET | `/api/accounts/{id}` | 账号详情 |\n| PATCH | `/api/accounts/{id}` | 更新账号（状态/cookies） |\n| DELETE | `/api/accounts/{id}` | 删除账号 |\n| POST | `/api/accounts/batch-delete` | 批量删除 |\n| POST | `/api/accounts/export/json` | 导出 JSON |\n| POST | `/api/accounts/export/csv` | 导出 CSV |\n| POST | `/api/accounts/export/cpa` | 导出 CPA 格式（单文件或 ZIP） |\n| POST | `/api/accounts/export/sub2api` | 导出 Sub2API 格式 |\n| POST | `/api/accounts/{id}/refresh` | 刷新 Token |\n| POST | `/api/accounts/batch-refresh` | 批量刷新 Token |\n| POST | `/api/accounts/{id}/validate` | 验证 Token |\n| POST | `/api/accounts/batch-validate` | 批量验证 Token |\n| POST | `/api/accounts/{id}/upload-cpa` | 上传单账号到 CPA |\n| POST | `/api/accounts/batch-upload-cpa` | 批量上传到 CPA |\n| POST | `/api/accounts/{id}/upload-sub2api` | 上传单账号到 Sub2API |\n| POST | `/api/accounts/batch-upload-sub2api` | 批量上传到 Sub2API |\n\n### 支付升级\n\n| 方法 | 路径 | 说明 |\n|------|------|------|\n| POST | `/api/payment/generate` | 生成 Plus/Team 支付链接 |\n| POST | `/api/payment/open` | 后端无痕模式打开浏览器 |\n| POST | `/api/payment/accounts/{id}/mark-subscription` | 手动标记订阅类型 |\n| POST | `/api/payment/accounts/batch-check-subscription` | 批量检测订阅状态 |\n| POST | `/api/payment/accounts/{id}/upload-tm` | 上传单账号到 Team Manager |\n| POST | `/api/payment/accounts/batch-upload-tm` | 批量上传到 Team Manager |\n\n### 邮箱服务\n\n| 方法 | 路径 | 说明 |\n|------|------|------|\n| GET | `/api/email-services` | 服务列表 |\n| POST | `/api/email-services` | 添加服务 |\n| PATCH | `/api/email-services/{id}` | 更新服务 |\n| DELETE | `/api/email-services/{id}` | 删除服务 |\n| POST | `/api/email-services/{id}/test` | 测试服务 |\n| POST | `/api/email-services/outlook/batch-import` | 批量导入 Outlook |\n\n### 上传服务管理\n\n| 方法 | 路径 | 说明 |\n|------|------|------|\n| GET/POST | `/api/cpa-services` | CPA 服务列表/创建 |\n| PUT/DELETE | `/api/cpa-services/{id}` | 更新/删除 CPA 服务 |\n| POST | `/api/cpa-services/{id}/test` | 测试 CPA 连接 |\n| GET/POST | `/api/sub2api-services` | Sub2API 服务列表/创建 |\n| PUT/DELETE | `/api/sub2api-services/{id}` | 更新/删除 Sub2API 服务 |\n| POST | `/api/sub2api-services/{id}/test` | 测试 Sub2API 连接 |\n| GET/POST | `/api/tm-services` | Team Manager 服务列表/创建 |\n| PUT/DELETE | `/api/tm-services/{id}` | 更新/删除 TM 服务 |\n| POST | `/api/tm-services/{id}/test` | 测试 TM 连接 |\n\n### 设置\n\n| 方法 | 路径 | 说明 |\n|------|------|------|\n| GET | `/api/settings` | 获取所有设置 |\n| POST | `/api/settings/proxy/dynamic` | 更新动态代理设置 |\n| GET/POST/DELETE | `/api/settings/proxies` | 代理列表管理 |\n| POST | `/api/settings/proxies/{id}/set-default` | 设为默认代理 |\n| GET | `/api/settings/database` | 数据库信息 |\n\n### WebSocket\n\n| 路径 | 说明 |\n|------|------|\n|| `ws://host/api/ws/logs/{uuid}` | 实时日志流 |\n\n## Docker 部署\n\n### 环境要求\n\n- Docker\n- Docker Compose\n\n### 快速部署\n\n```bash\n# 克隆项目\ngit clone https://github.com/cnlimiter/codex-register.git\ncd codex-register\n\n# 启动服务\ndocker-compose up -d\n```\n\n服务启动后访问 http://localhost:15555\n\n### 配置说明\n\n**端口映射**：默认 `15555` 端口，修改 `docker-compose.yml` 顶部的 `x-webui-port` 即可。\n\n**数据持久化**：\n```yaml\nvolumes:\n  - ./data:/app/data\n  - ./logs:/app/logs\n```\n\n**环境变量配置**：\n```yaml\nenvironment:\n  WEBUI_ACCESS_PASSWORD: mypassword\n  WEBUI_HOST: 0.0.0.0\n  WEBUI_PORT: 15555\n```\n\n### 常用命令\n\n```bash\n# 查看日志\ndocker-compose logs -f\n\n# 停止服务\ndocker-compose down\n\n# 重新构建\ndocker-compose build --no-cache\n```\n\n## 注意事项\n\n- 首次运行会自动创建 `data/` 目录和 SQLite 数据库\n- 所有账号和设置数据存储在 `data/register.db`\n- 日志文件写入 `logs/` 目录\n- 代理优先级：动态代理 \u003e 代理列表（随机/默认） \u003e 直连\n- CPA / Sub2API / Team Manager 上传始终直连，不走代理；其中 CPA 可选把账号记录的代理写入 auth file 的 `proxy_url`\n- 注册时自动随机生成用户名和生日（年龄范围 18-45 岁）\n- 验证码重发：收件箱超时未获取到验证码时，自动重新发送验证码并再次轮询，最多重发次数可在「验证码配置」中设置（默认 2 次，设为 0 禁用）\n- 支付链接货币与计费国家动态对应，从 ChatGPT API 实时获取国家/货币列表（缓存 7 天），不再受限于内置静态映射表\n- 支付链接生成使用账号 access_token 鉴权，走全局代理配置\n- 无痕打开支付页默认调用系统 Chrome/Edge 的隐私模式\n- 订阅状态自动检测调用 `chatgpt.com/backend-api/me`，走全局代理\n- 批量注册并发数上限为 50，线程池大小已相应调整\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcnlimiter%2Fcodex-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcnlimiter%2Fcodex-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcnlimiter%2Fcodex-manager/lists"}