cursor_auto_register/api_module_documentation.md
2025-05-11 23:06:57 +08:00

168 lines
14 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.

# Module Documentation: api.py
## 1. 概述 (Overview)
`api.py` 文件实现了一个基于 FastAPI 的 Web 应用,其核心目的是提供一套 API 接口来管理 Cursor IDE 的账号。此应用不仅支持账号的增删改查、导入导出等基本管理功能,还集成了一个自动化的后台任务来注册新账号,直到达到预设的上限。此外,它还能跟踪账号的使用情况、管理系统配置,并提供与本地 Cursor 客户端集成的功能,如更新认证 Token 和重置机器ID。
主要技术栈包括:
* **FastAPI**: 用于构建高性能 API。
* **SQLAlchemy**: 作为 ORM 与数据库进行异步交互。
* **Pydantic**: 用于数据校验和 API 的请求/响应模型定义。
* **Uvicorn**: 作为 ASGI 服务器运行应用。
* **Asyncio**: 支持异步操作和并发任务,特别是后台注册进程。
## 2. 核心功能 (Core Features)
### 2.1. 账号管理 (Account Management)
该模块提供了全面的账号管理功能:
- **创建账号**: 通过 `POST /account` 端点,可以添加新的 Cursor 账号信息到数据库。
- **读取账号**:
- `GET /accounts`: 获取所有账号列表支持分页、按邮件模糊搜索以及按字段如创建时间、ID、邮箱升序或降序排序。
- `GET /account/random`: 随机获取一个当前可用的账号及其 Token。
- `GET /account/{email}/usage`: 查询指定邮箱账号的详细使用情况(如剩余额度、天数)并更新数据库记录。
- **更新账号状态**: 通过 `PUT /account/id/{id}/status` 端点,可以修改指定 ID 账号的状态(如 active, disabled, deleted
- **删除账号**:
- `DELETE /account/{email}`: 根据邮箱停用(逻辑删除)或永久删除(物理删除,需 `hard_delete=True`)账号。
- `DELETE /account/id/{id}`: 根据账号 ID 停用或永久删除账号。
- **导入/导出账号**:
- `POST /accounts/import`: 从上传的 JSON 文件批量导入或更新账号信息。
- `GET /accounts/export`: 将所有账号信息导出为 JSON 文件。
### 2.2. 自动注册 (Automated Registration)
应用包含一个后台服务,用于自动注册新的 Cursor 账号:
- **后台任务**: `run_registration` 异步函数是注册逻辑的核心,它会循环尝试注册新账号。
- **启动与停止**:
- `GET /registration/start`: 手动启动后台注册任务。如果任务已运行或账号已满,会返回相应状态。
- `GET /registration/stop`: 手动停止当前运行的注册任务。
- **状态查询**: `GET /registration/status` 提供注册任务的当前状态,包括是否正在运行、上次运行时间、下次运行时间、成功/失败次数统计以及当前账号数量与最大限制。
- **监控模式**: 当数据库中激活的账号数量达到 `MAX_ACCOUNTS` 设定的上限时,注册任务会暂停实际注册操作,进入监控模式,并定期检查账号数量,一旦账号数量低于上限则自动恢复注册。
### 2.3. 账号使用情况 (Account Usage)
跟踪和管理账号的实际使用量:
- **查询所有账号使用情况**: `GET /usage` 并发查询并返回所有已存账号的剩余额度和试用天数,结果会进行缓存以提高性能。
- **查询单个账号使用情况**: `GET /account/{email}/usage` 查询特定邮箱账号的余额和剩余天数,并据此更新数据库中的记录。
- **更新所有账号使用情况**: `POST /update_all_usage` 批量更新所有账号的余量信息到数据库。
- **记录账号使用行为**: `GET /account/{id}/usage-records` 获取指定账号的历史使用记录如IP地址、User-Agent、使用时间
### 2.4. 系统配置管理 (System Configuration)
允许动态管理应用的配置参数(通常存储在 `.env` 文件中):
- **读取配置**: `GET /config` 返回当前系统配置信息,如浏览器设置、邮箱服务详情、代理设置等。
- **更新配置**: `POST /config` 允许通过 API 请求更新 `.env` 文件中的配置项,并重新加载。
### 2.5. Cursor 客户端集成 (Cursor Client Integration)
提供与本地安装的 Cursor IDE 进行交互的功能:
- **使用账号 Token 更新认证**: `POST /account/use-token/{id}` 使用指定账号的 Access Token 来更新本地 Cursor IDE 的认证配置。可以选择是否同时重置机器ID。
- **重置机器 ID**: `GET /reset-machine` 调用脚本重置本地 Cursor IDE 的机器识别码。
### 2.6. Web UI 与 API 文档 (Web UI & API Documentation)
- **静态首页服务**: `GET /` 提供一个简单的 `index.html` 页面作为应用的 Web UI 入口。
- **Swagger UI**: `GET /docs` 提供交互式的 API 文档界面。
- **ReDoc**: `GET /redoc` 提供另一种风格的 API 文档。
## 3. 架构与关键组件 (Architecture & Key Components)
### 3.1. FastAPI 应用实例 (`app`)
- **初始化**: `app = FastAPI(...)` 创建主应用实例配置了标题、描述、版本、文档URL以及 `lifespan` 管理器。
- **中间件**: `app.add_middleware(CORSMiddleware, ...)` 添加了 CORS 中间件以支持跨域请求。
- **生命周期事件**: `@asynccontextmanager async def lifespan(app: FastAPI): ...` 定义了应用的生命周期事件。在应用启动时,会调用 `init_db()` 初始化数据库。
### 3.2. 数据库交互 (Database Interaction)
- **`database.py` (外部模块)**: 此模块(未直接提供,但从导入推断)负责数据库的连接管理 (`get_session`),定义数据模型 (`AccountModel`, `AccountUsageRecordModel`),以及数据库初始化逻辑 (`init_db`)。
- **SQLAlchemy ORM**: 应用通过 SQLAlchemy Core 的查询构造语法(如 `select()`, `delete()`, `func.count()`)和异步会话 (`async with get_session() as session:`) 与数据库进行交互。
### 3.3. 路由与端点 (Routing & Endpoints)
- API 端点通过 FastAPI 的装饰器(如 `@app.get`, `@app.post`, `@app.put`, `@app.delete`)绑定到相应的异步处理函数。
- 端点通过 `tags` 参数在 API 文档中进行分组,主要包括: `General`, `Accounts`, `Registration`, `Config`, `System`
### 3.4. 后台注册任务 (`run_registration`)
- 这是一个核心的异步函数,通过 `asyncio.create_task(run_registration())``/registration/start` 端点被调用时启动。
- 任务在一个无限循环中运行(受 `registration_status["is_running"]` 控制),依次执行:检查当前激活账号数是否小于 `MAX_ACCOUNTS`,调用 `register_account`(一个外部同步函数,通过 `run_in_executor` 异步执行)进行实际注册,处理成功/失败结果,更新统计信息,然后根据 `REGISTRATION_INTERVAL` 等待下一轮。
### 3.5. 全局状态管理 (Global State Management)
- **`registration_status` (字典)**: 用于实时跟踪和存储自动注册任务的各种状态信息,如是否正在运行 (`is_running`)、上次运行时间 (`last_run`)、上次状态 (`last_status`)、下次计划运行时间 (`next_run`),以及运行次数、成功和失败的统计。
- **`background_tasks` (字典)**: 主要用于存储 `run_registration` 任务的 `asyncio.Task` 实例,键为 `"registration_task"`。这允许其他部分代码检查任务是否正在运行或取消任务。
### 3.6. 配置管理 (Configuration Management)
- **`config.py` (外部模块)**: 定义了应用的一些关键配置常量,如 `MAX_ACCOUNTS`(最大账号数)、`REGISTRATION_INTERVAL`(注册间隔时间)、`API_HOST``API_PORT` 等。
- **`.env` 文件**: 应用启动时及配置更新后,会通过 `python-dotenv` 库的 `load_dotenv()` 函数从项目根目录下的 `.env` 文件加载环境变量。这些变量通常包含敏感信息或环境特定配置。
### 3.7. 日志系统 (Logging)
- **`logger.py` (外部模块)**: 应用从该模块导入 `info``error` 函数,用于在控制台或日志文件(取决于 `logger.py` 的配置)中记录不同级别的事件信息和错误详情,包括堆栈跟踪。
### 3.8. 辅助函数与类 (Utility Functions & Classes)
- **数据库查询辅助函数**: `get_active_account_count()``get_account_count()` 用于高效查询数据库中符合特定条件的账号数量。
- **`Cursor` 类 (from `tokenManager.cursor`)**: 封装了与 Cursor 服务进行交互的逻辑,例如 `get_remaining_balance()``get_trial_remaining_days()` 方法用于查询账号的额度和试用期。
- **`CursorAuthManager` 类 (from `cursor_auth_manager`)**: 负责更新本地 Cursor IDE 的认证文件。
- **`CursorShadowPatcher` 类 (from `cursor_shadow_patcher`)**: 负责重置本地 Cursor IDE 的机器 ID。
## 4. 数据模型 (Data Models - Pydantic)
Pydantic 模型在 FastAPI 中扮演着数据校验、序列化和文档生成的关键角色:
- **`Account`**: 定义了一个 Cursor 账号的主要属性,如 `email`, `password`, `token`, `user`, `usage_limit`, `created_at`, `status`, `id`。它用于创建账号 (`POST /account`) 的请求体,并在多个响应中作为数据结构。`Config.from_attributes = True` 允许从 ORM 对象创建 Pydantic 模型实例。
- **`AccountResponse`**: 一个通用的响应模型,封装了操作是否成功 (`success`)、返回的数据 (`data`,通常是 `Account` 模型或其列表)以及可选的消息 (`message`)。
- **`StatusUpdate`**: 用于 `PUT /account/id/{id}/status` 端点的请求体,包含一个新的 `status` 字符串。
- **`ConfigModel`**: 定义了 `POST /config` 端点接受的配置项及其类型,例如 `BROWSER_HEADLESS`, `MAX_ACCOUNTS`, `EMAIL_DOMAINS`, 代理相关设置等。
这些模型确保了 API 接收的数据符合预期格式,并且响应数据也以结构化的方式返回。
## 5. 错误处理 (Error Handling)
应用实现了全局异常处理机制:
- **`@app.exception_handler(HTTPException)`**: 捕获 FastAPI 自身或其他地方抛出的 `HTTPException`。它会记录错误并通过 `JSONResponse` 返回一个包含 `success: False` 和错误详情(`exc.detail`)的 JSON 响应,状态码与原始异常一致。
- **`@app.exception_handler(Exception)`**: 捕获所有其他未被处理的 Python 异常。这确保了即使发生意外错误,应用也不会崩溃,而是返回一个标准的 500 内部服务器错误响应,其中包含 `success: False` 和通用错误消息。在调试模式下(`app.debug` 为 True响应中可能还会包含异常的详细信息。
这种集中的错误处理方式有助于提供一致的 API 错误响应格式。
## 6. 依赖与环境 (Dependencies & Environment)
### 主要依赖:
- **FastAPI**: Web 框架。
- **Uvicorn**: ASGI 服务器。
- **SQLAlchemy**: ORM用于数据库异步操作 (需要配合相应的数据库驱动,如 `asyncpg` for PostgreSQL, `aiomysql` for MySQL)。
- **Pydantic**: 数据验证和模型定义。
- **python-dotenv**: 加载 `.env` 文件中的环境变量。
- **requests**: (推断) `tokenManager.cursor.Cursor` 类可能使用此库进行 HTTP 请求以查询 Cursor API。
- **concurrent.futures**: 用于在 `check_usage` 接口中并发执行账号状态检查。
### 运行环境:
- **Python**: 版本 3.7+ (基于 FastAPI 和 `async/await` 语法)。
- **`.env` 文件**: 必须在项目根目录下存在,并包含所有必要的配置变量 (如数据库连接信息、API 密钥、邮箱配置、代理配置等)。`get_config``update_config` 端点直接与此文件交互。
- **数据库服务**: 需要一个 SQLAlchemy 支持的数据库正在运行,并在 `.env` 中配置好连接参数。
- **网络访问**: 自动注册和账号使用情况查询功能需要网络访问权限,以连接到 Cursor 服务和可能的邮件服务。
## 7. 部署与运行 (Deployment & Execution)
该 FastAPI 应用通过 Uvicorn ASGI 服务器运行。文件末尾的 `if __name__ == "__main__":` 块提供了一个直接运行应用的入口点:
```python
if __name__ == "__main__":
uvicorn.run(
"api:app",
host=API_HOST,
port=API_PORT,
reload=API_DEBUG,
access_log=True,
log_level="error",
workers=API_WORKERS,
loop="asyncio",
)
```
- `"api:app"`: 指示 Uvicorn 加载 `api.py` 文件中的 `app` FastAPI 实例。
- `host=API_HOST`, `port=API_PORT`: 从 `config.py` (或 `.env`) 加载监听的主机和端口。
- `reload=API_DEBUG`: 如果 `API_DEBUG` 为 True则启用热重载功能代码更改时服务器会自动重启。
- `access_log=True`: 启用访问日志。
- `log_level="error"`: 设置 Uvicorn 的日志级别。
- `workers=API_WORKERS`: 配置工作进程数量。对于生产环境,可以根据服务器核心数调整。
- `loop="asyncio"`: 明确指定使用 asyncio 事件循环。
## 8. 注意事项 (Considerations)
- **并发安全**: 虽然 FastAPI 和 asyncio 处理并发请求,但对全局变量 `registration_status``background_tasks` 的直接修改可能需要审慎处理,以避免潜在的竞争条件,尤其是在多 worker 配置下(尽管 Python 的 GIL 使得纯 Python 代码的并发问题不如其他语言复杂)。
- **安全性**:
- **敏感信息**: `.env` 文件中存储了大量敏感配置。需要确保此文件的权限得到妥善管理。
- **密码存储**: 如果 `AccountModel` 直接存储明文密码,这是严重的安全风险。密码应始终进行哈希处理 (如使用 bcrypt 或 Argon2) 后再存储。
- **API 认证/授权**: 当前 API 似乎没有实现任何认证或授权机制来保护其端点。在生产环境中,应考虑添加如 OAuth2 或 API 密钥等机制来限制对敏感操作的访问。
- **配置热重载**: `/restart` 接口通过修改 `.env` 文件中的一个时间戳变量来尝试触发 Uvicorn 的热重载。这种方法的有效性依赖于 Uvicorn 的 `--reload` 选项及其文件监控机制,可能并非在所有情况下都可靠或即时。
- **外部依赖**: 自动注册功能依赖于外部的 `register_account` 函数和 `tokenManager.cursor` 模块。这些外部组件的稳定性和行为直接影响本应用的功能。
- **错误处理细节**: 虽然有全局异常处理,但某些函数内部的 `try-except` 块可能会捕获并记录错误,然后继续执行或返回特定响应,这需要仔细审查以确保所有错误路径都得到妥善处理。
- **数据库迁移**: 随着 `AccountModel``AccountUsageRecordModel` 的演变,需要一个数据库迁移策略 (如使用 Alembic) 来管理数据库模式的变更。