97 lines
3.2 KiB
Markdown
97 lines
3.2 KiB
Markdown
# 小红书登录验证修复总结
|
|
|
|
## 问题描述
|
|
用户反馈验证登录功能失败,提示"未找到登录状态,请先登录",尽管已经成功登录并跳转到小红书广场页面。
|
|
|
|
## 根本原因
|
|
1. 浏览器实例在应用启动时未初始化,导致无法保存和验证登录状态
|
|
2. 原有的登录验证逻辑过于简单,仅检查基本的cookie存在性
|
|
3. 缺少可靠的登录状态验证机制
|
|
|
|
## 解决方案
|
|
|
|
### 1. 浏览器实例初始化
|
|
- 在应用启动事件(`startup_event`)中初始化浏览器实例
|
|
- 在应用关闭事件(`shutdown_event`)中清理浏览器资源
|
|
- 确保 browser 和 context 在整个应用生命周期中可用
|
|
|
|
### 2. 基于 storage_state 的登录验证
|
|
参考 `xhs_crawler_core.py` 文件的实现,采用了更可靠的 storage_state 机制:
|
|
|
|
```python
|
|
# 保存浏览器状态
|
|
await app_state.browser.context.storage_state(path=storage_file)
|
|
|
|
# 使用保存的状态创建临时浏览器实例验证
|
|
async with async_playwright() as p:
|
|
browser = await p.chromium.launch(headless=True)
|
|
context = await browser.new_context(storage_state=str(pth))
|
|
page = await context.new_page()
|
|
await page.goto("https://www.xiaohongshu.com")
|
|
```
|
|
|
|
### 3. 多层验证机制
|
|
1. **storage_state 验证**(首选):
|
|
- 保存完整的浏览器状态(cookies, localStorage, sessionStorage等)
|
|
- 创建临时浏览器实例验证登录有效性
|
|
- 使用更可靠的元素检查方式
|
|
|
|
2. **Cookie 检查**(备选):
|
|
- 检查 session、token、auth 等相关 cookies
|
|
- 支持多种 cookie 名称匹配
|
|
|
|
3. **本地状态文件**(兜底):
|
|
- 检查 auth_state.json 文件是否存在
|
|
- 验证登录是否过期
|
|
|
|
### 4. 改进的页面检查逻辑
|
|
- 使用 `page.get_by_text().first.is_visible()` 替代内容字符串检查
|
|
- 增加更精准的拦截关键词检测
|
|
- 添加 URL 重定向检查
|
|
- 优化页面标题验证
|
|
|
|
### 5. 详细的调试信息
|
|
添加了完整的调试日志输出:
|
|
```
|
|
[DEBUG] 开始验证登录状态...
|
|
[DEBUG] 尝试保存 storage_state 到: data/storage_state.json
|
|
[DEBUG] ✓ 成功保存 storage_state
|
|
[DEBUG] storage_state 文件大小: 2456 bytes
|
|
[DEBUG] 使用 storage_state 验证登录...
|
|
[DEBUG] ✓ 登录验证成功
|
|
```
|
|
|
|
## 主要改进文件
|
|
- `app/web.py`: 登录验证逻辑完全重写
|
|
- 添加浏览器生命周期管理
|
|
- 实现基于 storage_state 的验证
|
|
- 增强错误处理和调试信息
|
|
|
|
## 测试步骤
|
|
1. 启动应用:`python main.py`
|
|
2. 访问:`http://localhost:18085`
|
|
3. 点击"打开登录页"按钮
|
|
4. 在新窗口扫码登录小红书
|
|
5. 返回点击"验证登录"按钮
|
|
6. 观察控制台输出的调试信息
|
|
|
|
## 预期结果
|
|
- 成功登录时返回:
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "登录成功",
|
|
"logged_in": true,
|
|
"login_time": "2025-01-12T10:30:00",
|
|
"expire_time": "2025-01-13T10:30:00",
|
|
"expire_in_hours": 24
|
|
}
|
|
```
|
|
|
|
- 失败时返回具体错误信息,便于问题定位
|
|
|
|
## 注意事项
|
|
1. 确保 Playwright 浏览器已安装:`playwright install chromium`
|
|
2. 首次使用需要创建 `data/users.txt` 文件
|
|
3. 登录状态有效期为24小时
|
|
4. 如遇风控,系统会自动截图保存到 `data/screenshots/` 目录 |