Files
weibo_signin/WEIBO_QRCODE_LOGIN.md
2026-03-09 16:10:29 +08:00

241 lines
5.2 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.
# 微博扫码登录功能说明
## 功能概述
实现了基于微博网页版扫码登录接口的账号添加功能,无需注册微博开放平台应用,直接使用微博官方的扫码登录 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