3.2 KiB
3.2 KiB
小红书登录验证修复总结
问题描述
用户反馈验证登录功能失败,提示"未找到登录状态,请先登录",尽管已经成功登录并跳转到小红书广场页面。
根本原因
- 浏览器实例在应用启动时未初始化,导致无法保存和验证登录状态
- 原有的登录验证逻辑过于简单,仅检查基本的cookie存在性
- 缺少可靠的登录状态验证机制
解决方案
1. 浏览器实例初始化
- 在应用启动事件(
startup_event)中初始化浏览器实例 - 在应用关闭事件(
shutdown_event)中清理浏览器资源 - 确保 browser 和 context 在整个应用生命周期中可用
2. 基于 storage_state 的登录验证
参考 xhs_crawler_core.py 文件的实现,采用了更可靠的 storage_state 机制:
# 保存浏览器状态
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. 多层验证机制
-
storage_state 验证(首选):
- 保存完整的浏览器状态(cookies, localStorage, sessionStorage等)
- 创建临时浏览器实例验证登录有效性
- 使用更可靠的元素检查方式
-
Cookie 检查(备选):
- 检查 session、token、auth 等相关 cookies
- 支持多种 cookie 名称匹配
-
本地状态文件(兜底):
- 检查 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 的验证
- 增强错误处理和调试信息
测试步骤
- 启动应用:
python main.py - 访问:
http://localhost:18085 - 点击"打开登录页"按钮
- 在新窗口扫码登录小红书
- 返回点击"验证登录"按钮
- 观察控制台输出的调试信息
预期结果
- 成功登录时返回:
{
"success": true,
"message": "登录成功",
"logged_in": true,
"login_time": "2025-01-12T10:30:00",
"expire_time": "2025-01-13T10:30:00",
"expire_in_hours": 24
}
- 失败时返回具体错误信息,便于问题定位
注意事项
- 确保 Playwright 浏览器已安装:
playwright install chromium - 首次使用需要创建
data/users.txt文件 - 登录状态有效期为24小时
- 如遇风控,系统会自动截图保存到
data/screenshots/目录