diff --git a/WEIBO_OAUTH_SETUP.md b/WEIBO_OAUTH_SETUP.md deleted file mode 100644 index ccbe28f..0000000 --- a/WEIBO_OAUTH_SETUP.md +++ /dev/null @@ -1,214 +0,0 @@ -# 微博 OAuth2 扫码授权配置指南 - -## 功能说明 - -实现了微博 OAuth2 扫码授权功能,用户可以通过手机微博 APP 扫码快速添加账号,无需手动复制 Cookie。 - -## 配置步骤 - -### 1. 注册微博开放平台应用 - -1. 访问 [微博开放平台](https://open.weibo.com/) -2. 登录你的微博账号 -3. 进入"微连接" > "网站接入" -4. 创建新应用,填写应用信息: - - 应用名称:Weibo-HotSign(或自定义) - - 应用简介:微博自动签到系统 - - 应用类型:网站 - - 应用地址:http://localhost:5000(开发环境) - -5. 提交审核(测试阶段可以使用未审核的应用) - -### 2. 配置回调地址 - -在应用管理页面: -1. 进入"应用信息" > "高级信息" -2. 设置"授权回调页"为:`http://localhost:5000/auth/weibo/callback` -3. 保存设置 - -### 3. 获取 APP KEY 和 APP SECRET - -在应用管理页面: -1. 进入"应用信息" > "基本信息" -2. 复制 `App Key` 和 `App Secret` - -### 4. 配置环境变量 - -编辑 `backend/.env` 和 `frontend/.env` 文件: - -```env -# 微博 OAuth2 配置 -WEIBO_APP_KEY=你的_App_Key -WEIBO_APP_SECRET=你的_App_Secret -WEIBO_REDIRECT_URI=http://localhost:5000/auth/weibo/callback -``` - -### 5. 重启服务 - -```bash -# 停止所有服务 -stop_all.bat - -# 启动所有服务 -start_all.bat -``` - -## 使用流程 - -### 用户端操作 - -1. 登录系统后,进入"添加账号"页面 -2. 切换到"微博授权"标签页 -3. 点击"生成授权二维码"按钮 -4. 使用手机微博 APP 扫描二维码 -5. 在手机上点击"同意授权" -6. 等待页面自动完成账号添加 -7. 自动跳转到 Dashboard - -### 技术流程 - -1. **生成授权 URL** - - 前端调用 `/auth/weibo/authorize` 接口 - - 后端生成包含 `state` 参数的授权 URL - - 前端使用 QRCode.js 生成二维码 - -2. **用户扫码授权** - - 用户用手机微博扫码 - - 跳转到微博授权页面(移动端适配) - - 用户点击"同意授权" - -3. **微博回调** - - 微博跳转到 `/auth/weibo/callback?code=xxx&state=xxx` - - 后端用 `code` 换取 `access_token` - - 调用微博 API 获取用户信息 - - 更新授权状态为成功 - -4. **前端轮询** - - 前端每 2 秒轮询 `/auth/weibo/check/` - - 检测到授权成功后,调用 `/api/weibo/add-account` - - 自动添加账号到系统 - -5. **完成添加** - - 账号添加成功 - - 跳转到 Dashboard - -## API 接口说明 - -### 1. 生成授权 URL - -``` -GET /auth/weibo/authorize -``` - -返回: -```json -{ - "auth_url": "https://api.weibo.com/oauth2/authorize?...", - "state": "random_state_string", - "expires_in": 180 -} -``` - -### 2. 检查授权状态 - -``` -GET /auth/weibo/check/ -``` - -返回: -```json -{ - "status": "pending|success|error|expired", - "account_info": {...} // 仅在 success 时返回 -} -``` - -### 3. 微博回调 - -``` -GET /auth/weibo/callback?code=xxx&state=xxx -``` - -返回 HTML 页面,显示授权结果 - -### 4. 添加账号 - -``` -POST /api/weibo/add-account -Content-Type: application/json - -{ - "state": "state_string", - "remark": "备注(可选)" -} -``` - -返回: -```json -{ - "success": true, - "message": "Account added successfully", - "account": {...} -} -``` - -## 安全说明 - -1. **State 参数**:用于防止 CSRF 攻击,每次授权生成唯一的 state -2. **Session 存储**:授权状态临时存储在 session 中(生产环境建议使用 Redis) -3. **Token 加密**:access_token 会被加密存储在数据库中 -4. **HTTPS**:生产环境必须使用 HTTPS - -## 生产环境配置 - -### 1. 更新回调地址 - -```env -WEIBO_REDIRECT_URI=https://yourdomain.com/auth/weibo/callback -``` - -### 2. 在微博开放平台更新回调地址 - -进入应用管理 > 高级信息 > 授权回调页: -``` -https://yourdomain.com/auth/weibo/callback -``` - -### 3. 使用 Redis 存储授权状态 - -修改 `frontend/app.py`,将 session 存储改为 Redis 存储。 - -## 故障排查 - -### 问题1:二维码生成失败 - -- 检查 `WEIBO_APP_KEY` 是否配置正确 -- 检查网络连接 - -### 问题2:扫码后提示"回调地址不匹配" - -- 检查 `WEIBO_REDIRECT_URI` 是否与微博开放平台配置一致 -- 确保包含协议(http:// 或 https://) - -### 问题3:授权成功但添加账号失败 - -- 检查后端 API 服务是否正常运行 -- 查看后端日志排查错误 - -### 问题4:二维码过期 - -- 默认有效期 3 分钟 -- 重新生成二维码即可 - -## 注意事项 - -1. 微博开放平台应用需要审核,测试阶段可以使用未审核的应用 -2. 未审核的应用只能授权给应用创建者和测试账号 -3. 建议使用小号或测试账号进行测试 -4. access_token 有效期通常为 30 天,过期后需要重新授权 -5. 生产环境必须使用 HTTPS - -## 参考文档 - -- [微博 OAuth2 文档](https://open.weibo.com/wiki/Oauth2) -- [微博 API 文档](https://open.weibo.com/wiki/API) diff --git a/WEIBO_QRCODE_LOGIN.md b/WEIBO_QRCODE_LOGIN.md deleted file mode 100644 index 5b0b3ef..0000000 --- a/WEIBO_QRCODE_LOGIN.md +++ /dev/null @@ -1,240 +0,0 @@ -# 微博扫码登录功能说明 - -## 功能概述 - -实现了基于微博网页版扫码登录接口的账号添加功能,无需注册微博开放平台应用,直接使用微博官方的扫码登录 API。 - -## 实现原理 - -通过逆向微博网页版(weibo.com)的扫码登录流程,调用微博的内部 API: - -1. **生成二维码**:调用 `https://login.sina.com.cn/sso/qrcode/image` 获取二维码图片 -2. **轮询状态**:调用 `https://login.sina.com.cn/sso/qrcode/check` 检查扫码状态 -3. **获取 Cookie**:扫码成功后通过跳转 URL 获取登录 Cookie -4. **获取用户信息**:使用 Cookie 调用微博 API 获取用户 UID 和昵称 -5. **自动添加账号**:将获取的信息自动添加到系统 - -## 使用流程 - -### 用户操作 - -1. 登录系统后,进入"添加账号"页面 -2. 切换到"扫码添加"标签页 -3. 点击"生成二维码"按钮 -4. 使用手机微博 APP 扫描二维码 -5. 在手机上点击"确认登录" -6. 等待页面自动完成账号添加 -7. 自动跳转到 Dashboard - -### 技术流程 - -``` -用户点击生成二维码 - ↓ -调用 /api/weibo/qrcode/generate - ↓ -请求微博 API 获取二维码 - ↓ -显示二维码图片 - ↓ -前端开始轮询 /api/weibo/qrcode/check/ - ↓ -后端轮询微博 API 检查状态 - ↓ -状态变化:waiting → scanned → success - ↓ -获取跳转 URL 和 Cookie - ↓ -调用微博 API 获取用户信息 - ↓ -前端调用 /api/weibo/qrcode/add-account - ↓ -添加账号到系统 - ↓ -跳转到 Dashboard -``` - -## API 接口 - -### 1. 生成二维码 - -``` -POST /api/weibo/qrcode/generate -``` - -返回: -```json -{ - "success": true, - "qrid": "qr_id_string", - "qr_image": "data:image/png;base64,...", - "expires_in": 180 -} -``` - -### 2. 检查扫码状态 - -``` -GET /api/weibo/qrcode/check/ -``` - -返回: -```json -{ - "status": "waiting|scanned|success|expired|cancelled|error", - "weibo_uid": "123456789", // 仅在 success 时返回 - "screen_name": "用户昵称" // 仅在 success 时返回 -} -``` - -状态说明: -- `waiting`: 等待扫码 -- `scanned`: 已扫码,等待确认 -- `success`: 确认成功 -- `expired`: 二维码过期 -- `cancelled`: 取消登录 -- `error`: 发生错误 - -### 3. 添加账号 - -``` -POST /api/weibo/qrcode/add-account -Content-Type: application/json - -{ - "qrid": "qr_id_string", - "remark": "备注(可选)" -} -``` - -返回: -```json -{ - "success": true, - "message": "Account added successfully", - "account": {...} -} -``` - -## 微博 API 说明 - -### 生成二维码接口 - -``` -GET https://login.sina.com.cn/sso/qrcode/image?entry=weibo&size=180&callback=STK_xxx -``` - -返回 JSONP 格式: -```javascript -STK_xxx({ - "retcode": 20000000, - "qrid": "xxx", - "image": "data:image/png;base64,..." -}) -``` - -### 检查扫码状态接口 - -``` -GET https://login.sina.com.cn/sso/qrcode/check?entry=weibo&qrid=xxx&callback=STK_xxx -``` - -返回 JSONP 格式: -```javascript -STK_xxx({ - "retcode": 20000000, // 或其他状态码 - "alt": "跳转URL" // 仅在登录成功时返回 -}) -``` - -状态码说明: -- `20000000`: 等待扫码 -- `50050001`: 已扫码,等待确认 -- `20000001`: 确认成功 -- `50050002`: 二维码过期 -- `50050004`: 取消授权 - -### 获取用户信息接口 - -``` -GET https://weibo.com/ajax/profile/info -Cookie: xxx -``` - -返回: -```json -{ - "ok": 1, - "data": { - "user": { - "idstr": "123456789", - "screen_name": "用户昵称", - ... - } - } -} -``` - -## 优势 - -1. **无需注册应用**:不需要在微博开放平台注册应用 -2. **无需配置**:不需要配置 APP_KEY 和 APP_SECRET -3. **真实 Cookie**:获取的是真实的登录 Cookie,可用于签到 -4. **用户体验好**:扫码即可完成,无需手动复制 Cookie - -## 注意事项 - -1. **接口稳定性**:使用的是微博内部 API,可能会变化 -2. **Cookie 有效期**:获取的 Cookie 有效期通常较长,但仍可能过期 -3. **安全性**:Cookie 会被加密存储在数据库中 -4. **二维码有效期**:默认 3 分钟,过期后需重新生成 -5. **轮询频率**:前端每 2 秒轮询一次状态 - -## 故障排查 - -### 问题1:生成二维码失败 - -- 检查网络连接 -- 检查微博 API 是否可访问 -- 查看后端日志 - -### 问题2:扫码后长时间无响应 - -- 检查轮询是否正常 -- 查看浏览器控制台是否有错误 -- 刷新页面重试 - -### 问题3:添加账号失败 - -- 检查后端 API 服务是否正常 -- 查看后端日志排查错误 -- 确认 Cookie 是否有效 - -### 问题4:二维码过期 - -- 默认有效期 3 分钟 -- 重新生成二维码即可 - -## 与 OAuth2 方案对比 - -| 特性 | 扫码登录(当前方案) | OAuth2 授权 | -|------|---------------------|-------------| -| 需要注册应用 | ❌ 不需要 | ✅ 需要 | -| 配置复杂度 | 低 | 高 | -| 获取的凭证 | 真实 Cookie | Access Token | -| 接口稳定性 | 中(内部 API) | 高(官方 API) | -| 用户体验 | 好 | 好 | -| 适用场景 | 个人项目 | 商业项目 | - -## 未来改进 - -1. 添加错误重试机制 -2. 优化轮询策略(WebSocket) -3. 添加二维码刷新功能 -4. 支持多账号批量添加 -5. 添加扫码记录和统计 - -## 参考资料 - -- 微博网页版:https://weibo.com -- 微博登录页面:https://login.sina.com.cn diff --git a/backend/Dockerfile b/backend/Dockerfile index 4d66ee5..9a0441c 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -16,6 +16,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ gcc default-libmysqlclient-dev curl \ && rm -rf /var/lib/apt/lists/* +# 设置时区为上海 +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + COPY requirements.txt . RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt diff --git a/backend/task_scheduler/Dockerfile b/backend/task_scheduler/Dockerfile index 13a463f..f5c0a92 100644 --- a/backend/task_scheduler/Dockerfile +++ b/backend/task_scheduler/Dockerfile @@ -11,6 +11,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ gcc default-libmysqlclient-dev curl \ && rm -rf /var/lib/apt/lists/* +# 设置时区为上海 +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + COPY task_scheduler/requirements.txt . RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt diff --git a/frontend/Dockerfile b/frontend/Dockerfile index f897216..e8ab7a3 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -13,6 +13,10 @@ RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debia RUN apt-get update && apt-get install -y --no-install-recommends curl \ && rm -rf /var/lib/apt/lists/* +# 设置时区为上海 +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + COPY requirements.txt . RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt diff --git a/migrate_fix_timezone.sql b/migrate_fix_timezone.sql new file mode 100644 index 0000000..39f2ca5 --- /dev/null +++ b/migrate_fix_timezone.sql @@ -0,0 +1,9 @@ +-- 一次性迁移:将所有时间字段从 UTC 修正为 Asia/Shanghai (+8h) +-- 用法: mysql -u weibo -p weibo_hotsign < migrate_fix_timezone.sql +-- 注意: 只执行一次!重复执行会多加 8 小时 + +UPDATE signin_logs SET signed_at = DATE_ADD(signed_at, INTERVAL 8 HOUR); +UPDATE accounts SET last_checked_at = DATE_ADD(last_checked_at, INTERVAL 8 HOUR) WHERE last_checked_at IS NOT NULL; +UPDATE accounts SET created_at = DATE_ADD(created_at, INTERVAL 8 HOUR); +UPDATE tasks SET created_at = DATE_ADD(created_at, INTERVAL 8 HOUR); +UPDATE users SET created_at = DATE_ADD(created_at, INTERVAL 8 HOUR);