修改docker容器时间
This commit is contained in:
@@ -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/<state>`
|
|
||||||
- 检测到授权成功后,调用 `/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/<state>
|
|
||||||
```
|
|
||||||
|
|
||||||
返回:
|
|
||||||
```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)
|
|
||||||
@@ -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/<qrid>
|
|
||||||
↓
|
|
||||||
后端轮询微博 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/<qrid>
|
|
||||||
```
|
|
||||||
|
|
||||||
返回:
|
|
||||||
```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
|
|
||||||
@@ -16,6 +16,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|||||||
gcc default-libmysqlclient-dev curl \
|
gcc default-libmysqlclient-dev curl \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& 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 .
|
COPY requirements.txt .
|
||||||
RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt
|
RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|||||||
gcc default-libmysqlclient-dev curl \
|
gcc default-libmysqlclient-dev curl \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& 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 .
|
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
|
RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt
|
||||||
|
|
||||||
|
|||||||
@@ -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 \
|
RUN apt-get update && apt-get install -y --no-install-recommends curl \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& 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 .
|
COPY requirements.txt .
|
||||||
RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt
|
RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt
|
||||||
|
|
||||||
|
|||||||
9
migrate_fix_timezone.sql
Normal file
9
migrate_fix_timezone.sql
Normal file
@@ -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);
|
||||||
Reference in New Issue
Block a user