feat: 接入真实微博OAuth 2.0登录

**实现内容**:

1. **微博OAuth 2.0登录**
   - 实现完整的OAuth授权流程
   - 支持开发模式(模拟数据)和生产模式(真实API)
   - 自动判断运行模式,无需手动切换

2. **微博账号绑定**
   - 获取授权URL接口:GET /api/weibo/bind-url
   - 处理授权回调:GET /api/weibo/callback
   - 绑定状态查询:GET /api/weibo/status
   - 解除绑定:DELETE /api/weibo/unbind

3. **超话功能(模拟实现)**
   - 超话列表查询:GET /api/topic/list
   - 单个签到:POST /api/topic/signin
   - 批量签到:POST /api/topic/batch-signin
   - 签到记录:GET /api/topic/records
   - 同步超话:POST /api/topic/sync

4. **环境配置**
   - 新增server/.env配置文件
   - 支持环境变量配置微博App Key/Secret
   - 安装@nestjs/config依赖

5. **技术文档**
   - 创建WEIBO_INTEGRATION_GUIDE.md完整接入指南
   - 包含微博开放平台配置步骤
   - 提供OAuth 2.0授权流程说明
   - 详细的风险提示和安全建议

**重要说明**:
- 超话功能目前使用模拟数据,真实实现需要调用微博移动端非官方API
- 非官方API存在法律和技术风险,使用需谨慎
- 系统已预留真实API接口实现位置和注释说明
This commit is contained in:
jaystar
2026-03-16 13:19:55 +08:00
parent 4b2fec96e9
commit 6885ec10d1
13 changed files with 888 additions and 165 deletions

30
pnpm-lock.yaml generated
View File

@@ -173,6 +173,9 @@ importers:
'@nestjs/common':
specifier: ^10.4.15
version: 10.4.20(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/config':
specifier: ^4.0.3
version: 4.0.3(@nestjs/common@10.4.20(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)
'@nestjs/core':
specifier: ^10.4.15
version: 10.4.20(@nestjs/common@10.4.20(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(reflect-metadata@0.2.2)(rxjs@7.8.2)
@@ -3108,6 +3111,12 @@ packages:
class-validator:
optional: true
'@nestjs/config@4.0.3':
resolution: {integrity: sha512-FQ3M3Ohqfl+nHAn5tp7++wUQw0f2nAk+SFKe8EpNRnIifPqvfJP6JQxPKtFLMOHbyer4X646prFG4zSRYEssQQ==}
peerDependencies:
'@nestjs/common': ^10.0.0 || ^11.0.0
rxjs: ^7.1.0
'@nestjs/core@10.4.20':
resolution: {integrity: sha512-kRdtyKA3+Tu70N3RQ4JgmO1E3LzAMs/eppj7SfjabC7TgqNWoS4RLhWl4BqmsNVmjj6D5jgfPVtHtgYkU3AfpQ==}
peerDependencies:
@@ -5961,6 +5970,10 @@ packages:
resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==}
engines: {node: '>=12'}
dotenv-expand@12.0.3:
resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==}
engines: {node: '>=12'}
dotenv@16.6.1:
resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
engines: {node: '>=12'}
@@ -7820,6 +7833,9 @@ packages:
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
lodash@4.17.23:
resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==}
log-symbols@4.1.0:
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
engines: {node: '>=10'}
@@ -14126,6 +14142,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@nestjs/config@4.0.3(@nestjs/common@10.4.20(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)':
dependencies:
'@nestjs/common': 10.4.20(reflect-metadata@0.2.2)(rxjs@7.8.2)
dotenv: 17.2.3
dotenv-expand: 12.0.3
lodash: 4.17.23
rxjs: 7.8.2
'@nestjs/core@10.4.20(@nestjs/common@10.4.20(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
dependencies:
'@nestjs/common': 10.4.20(reflect-metadata@0.2.2)(rxjs@7.8.2)
@@ -17711,6 +17735,10 @@ snapshots:
dependencies:
dotenv: 16.6.1
dotenv-expand@12.0.3:
dependencies:
dotenv: 16.6.1
dotenv@16.6.1: {}
dotenv@17.2.3: {}
@@ -19880,6 +19908,8 @@ snapshots:
lodash@4.17.21: {}
lodash@4.17.23: {}
log-symbols@4.1.0:
dependencies:
chalk: 4.1.2