Files
weibo_signin/.kiro/specs/multi-user-signin/requirements.md
2026-03-09 14:05:00 +08:00

139 lines
9.7 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.
# 需求文档Weibo-HotSign 多用户签到系统
## 简介
Weibo-HotSign 是一个分布式微博超话自动签到系统采用微服务架构FastAPI + Celery + MySQL + Redis。本需求文档覆盖系统的五大核心模块用户认证含 Token 刷新)、微博账号管理、定时签到任务配置、签到执行引擎、以及整体架构重构。目标是将当前分散的、含大量 Mock 实现的代码库重构为一个真正可运行的、模块间紧密集成的生产级系统。
## 术语表
- **System**: 指 Weibo-HotSign 后端系统整体
- **Auth_Service**: 用户认证与授权服务(`backend/auth_service`
- **API_Service**: API 网关与账号/任务管理服务(`backend/api_service`
- **Task_Scheduler**: 基于 Celery Beat 的定时任务调度服务(`backend/task_scheduler`
- **Signin_Executor**: 签到执行 Worker 服务(`backend/signin_executor`
- **User**: 使用本系统的注册用户
- **Weibo_Account**: 用户绑定到系统中的微博账号,以 Cookie 形式存储凭证
- **Task**: 用户为某个 Weibo_Account 配置的定时签到任务
- **Cookie**: 微博网站的登录凭证,用于模拟已登录状态
- **Cron_Expression**: 标准 Cron 表达式,用于定义任务调度时间
- **Signin_Log**: 每次签到执行的结果记录
- **JWT**: JSON Web Token用于用户身份认证
- **Refresh_Token**: 用于在 Access Token 过期后获取新 Token 的长期凭证
- **AES-256-GCM**: 对称加密算法,用于加密存储 Cookie
## 需求
### 需求 1用户认证与 Token 管理
**用户故事:** 作为用户,我希望能够注册、登录并安全地维持会话,以便长期使用系统而无需频繁重新登录。
#### 验收标准
1. WHEN 用户提交有效的注册信息用户名、邮箱、密码THE Auth_Service SHALL 创建用户账户并返回用户信息
2. WHEN 用户提交的用户名或邮箱已存在THE Auth_Service SHALL 返回 409 Conflict 错误并指明冲突字段
3. WHEN 用户提交有效的邮箱和密码进行登录THE Auth_Service SHALL 返回包含 Access Token 和 Refresh Token 的认证响应
4. WHEN 用户提交无效的邮箱或密码进行登录THE Auth_Service SHALL 返回 401 Unauthorized 错误
5. WHEN 用户携带有效的 Refresh Token 请求刷新THE Auth_Service SHALL 返回新的 Access Token 和新的 Refresh Token
6. WHEN 用户携带过期或无效的 Refresh Token 请求刷新THE Auth_Service SHALL 返回 401 Unauthorized 错误
7. WHEN 用户携带有效的 Access Token 请求 `/auth/me`THE Auth_Service SHALL 返回当前用户的完整信息
8. IF 用户密码不满足强度要求至少8位含大小写字母、数字和特殊字符THEN THE Auth_Service SHALL 返回 400 Bad Request 并说明密码强度不足
### 需求 2微博账号管理
**用户故事:** 作为用户,我希望能够添加、查看、更新和删除我的微博账号,以便集中管理多个微博账号的签到。
#### 验收标准
1. WHEN 用户提交微博 Cookie 和备注信息THE API_Service SHALL 使用 AES-256-GCM 加密 Cookie 后存储,并返回新创建的账号信息
2. WHEN 用户请求获取账号列表THE API_Service SHALL 返回该用户拥有的所有 Weibo_Account不包含解密后的 Cookie
3. WHEN 用户请求获取单个账号详情THE API_Service SHALL 返回该账号的状态、备注和最近签到信息
4. WHEN 用户请求更新账号的备注或 CookieTHE API_Service SHALL 更新对应字段并返回更新后的账号信息
5. WHEN 用户请求删除一个账号THE API_Service SHALL 级联删除该账号关联的所有 Task 和 Signin_Log并返回成功响应
6. IF 用户尝试操作不属于自己的账号THEN THE API_Service SHALL 返回 403 Forbidden 错误
7. WHEN 账号被创建时THE API_Service SHALL 将账号状态初始化为 "pending"
8. THE API_Service SHALL 对所有账号管理接口要求有效的 JWT Access Token 认证
### 需求 3Cookie 加密与验证
**用户故事:** 作为用户,我希望我的微博 Cookie 被安全存储,并且系统能自动检测 Cookie 是否失效,以便我及时更新。
#### 验收标准
1. WHEN 存储 Cookie 时THE API_Service SHALL 使用 AES-256-GCM 算法加密,并将密文和 IV 分别存储到 `encrypted_cookies``iv` 字段
2. WHEN 读取 Cookie 用于签到时THE Signin_Executor SHALL 使用对应的 IV 解密 Cookie 并还原为原始字符串
3. FOR ALL 有效的 Cookie 字符串,加密后再解密 SHALL 产生与原始字符串完全相同的结果Round-trip 属性)
4. IF 解密过程中发生错误密钥不匹配、数据损坏THEN THE System SHALL 将账号状态标记为 "invalid_cookie" 并记录错误日志
### 需求 4定时签到任务配置
**用户故事:** 作为用户,我希望能够为每个微博账号配置独立的签到时间计划,以便灵活控制签到频率和时间。
#### 验收标准
1. WHEN 用户为某个账号创建签到任务并提供有效的 Cron_ExpressionTHE API_Service SHALL 创建任务记录并将任务注册到 Task_Scheduler
2. WHEN 用户提交无效的 Cron_ExpressionTHE API_Service SHALL 返回 400 Bad Request 并说明表达式格式错误
3. WHEN 用户请求获取某个账号的任务列表THE API_Service SHALL 返回该账号关联的所有 Task 及其启用状态
4. WHEN 用户启用或禁用一个任务THE API_Service SHALL 更新数据库中的 `is_enabled` 字段,并同步更新 Task_Scheduler 中的调度状态
5. WHEN 用户删除一个任务THE API_Service SHALL 从数据库删除任务记录,并从 Task_Scheduler 中移除对应的调度
6. IF 用户尝试为不属于自己的账号创建任务THEN THE API_Service SHALL 返回 403 Forbidden 错误
### 需求 5任务调度引擎
**用户故事:** 作为系统,我需要根据用户配置的 Cron 表达式准时触发签到任务,以确保签到按时执行。
#### 验收标准
1. WHEN Task_Scheduler 启动时THE Task_Scheduler SHALL 从数据库加载所有 `is_enabled=True` 的任务并注册到 Celery Beat 调度器
2. WHEN Celery Beat 根据 Cron_Expression 触发一个任务THE Task_Scheduler SHALL 向消息队列发送包含 `task_id``account_id` 的签到消息
3. WHEN 新任务被创建或现有任务被更新THE Task_Scheduler SHALL 动态更新 Celery Beat 的调度配置而无需重启服务
4. IF 任务执行失败THEN THE Task_Scheduler SHALL 按照配置的重试策略最多3次间隔60秒进行重试
5. WHILE Task_Scheduler 运行中THE Task_Scheduler SHALL 使用 Redis 分布式锁确保同一任务不会被重复调度
### 需求 6签到执行引擎
**用户故事:** 作为系统,我需要真正执行微博超话签到操作,并将结果持久化到数据库,以替代当前的 Mock 实现。
#### 验收标准
1. WHEN Signin_Executor 从消息队列接收到签到任务THE Signin_Executor SHALL 从数据库查询对应的 Weibo_Account 信息(替代 Mock 数据)
2. WHEN 执行签到前THE Signin_Executor SHALL 解密 Cookie 并验证其有效性
3. WHEN Cookie 有效时THE Signin_Executor SHALL 获取该账号关注的超话列表并逐一执行签到
4. WHEN 单个超话签到完成后THE Signin_Executor SHALL 将结果(成功/失败/已签到、奖励信息、错误信息)写入 `signin_logs`
5. IF Cookie 已失效THEN THE Signin_Executor SHALL 将账号状态更新为 "invalid_cookie" 并终止该账号的签到流程
6. IF 签到过程中遇到网络错误THEN THE Signin_Executor SHALL 记录错误日志并将该超话的签到状态标记为 "failed_network"
### 需求 7反爬虫防护
**用户故事:** 作为系统,我需要在执行签到时采取反爬虫措施,以降低被微博风控系统检测和封禁的风险。
#### 验收标准
1. WHEN 执行签到请求时THE Signin_Executor SHALL 在每次请求之间插入随机延迟1-3秒可配置
2. WHEN 构造 HTTP 请求时THE Signin_Executor SHALL 从预定义的 User-Agent 列表中随机选择一个
3. WHEN 代理池服务可用时THE Signin_Executor SHALL 为每次签到请求分配一个代理 IP
4. IF 代理池服务不可用THEN THE Signin_Executor SHALL 使用直连方式继续执行签到并记录警告日志
### 需求 8签到日志与查询
**用户故事:** 作为用户,我希望能够查看每个微博账号的签到历史记录,以便了解签到执行情况。
#### 验收标准
1. WHEN 用户请求查看某个账号的签到日志THE API_Service SHALL 返回按时间倒序排列的 Signin_Log 列表
2. WHEN 用户请求签到日志时提供分页参数THE API_Service SHALL 返回对应页码的日志数据和总记录数
3. WHEN 用户请求签到日志时提供状态过滤参数THE API_Service SHALL 仅返回匹配该状态的日志记录
4. THE API_Service SHALL 对签到日志查询接口要求有效的 JWT Access Token 认证
5. IF 用户尝试查看不属于自己账号的签到日志THEN THE API_Service SHALL 返回 403 Forbidden 错误
### 需求 9统一 API 响应格式与错误处理
**用户故事:** 作为 API 消费者,我希望所有接口返回统一格式的响应,以便前端能够一致地处理成功和错误情况。
#### 验收标准
1. THE API_Service SHALL 对所有成功响应返回 `{"success": true, "data": ..., "message": ...}` 格式
2. THE API_Service SHALL 对所有错误响应返回 `{"success": false, "data": null, "message": ..., "error": {"code": ..., "details": [...]}}` 格式
3. WHEN 请求参数校验失败THE API_Service SHALL 返回 400 状态码,并在 `error.details` 中列出每个字段的具体错误
4. WHEN 未认证用户访问受保护接口THE API_Service SHALL 返回 401 状态码和标准错误响应