Files
xhs_crawler_claude/login_verification_fix.md
T
2026-01-12 17:33:06 +08:00

3.2 KiB

小红书登录验证修复总结

问题描述

用户反馈验证登录功能失败,提示"未找到登录状态,请先登录",尽管已经成功登录并跳转到小红书广场页面。

根本原因

  1. 浏览器实例在应用启动时未初始化,导致无法保存和验证登录状态
  2. 原有的登录验证逻辑过于简单,仅检查基本的cookie存在性
  3. 缺少可靠的登录状态验证机制

解决方案

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. 多层验证机制

  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. 观察控制台输出的调试信息

预期结果

  • 成功登录时返回:
{
  "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/ 目录