Przeglądaj źródła

docs: 重构文档结构并迁移云浏览器指南到docs目录

将云浏览器相关文档从examples目录迁移到docs目录,并整合为统一的文档文件。
删除原有的分散文档文件,包括README_CLOUD_BROWSER.md、CLOUD_BROWSER_GUIDE.md、
LOGIN_HANDLING_GUIDE.md和LOGIN_UPDATE_SUMMARY.md。
新增统一的docs/cloud_browser_guide.md文档,整合所有云浏览器相关内容,
提供完整的使用指南、示例代码和最佳实践。
max_liu 1 miesiąc temu
rodzic
commit
12207151a8

+ 0 - 0
examples/CLOUD_BROWSER_GUIDE.md → docs/cloud_browser_guide.md


+ 0 - 875
examples/LOGIN_HANDLING_GUIDE.md

@@ -1,875 +0,0 @@
-# Browser-Use 登录处理完整指南
-
-## 目录
-- [概述](#概述)
-- [登录场景分类](#登录场景分类)
-- [三种登录处理方式](#三种登录处理方式)
-- [方式1: 手动登录(推荐)](#方式1-手动登录推荐)
-- [方式2: Cookie复用](#方式2-cookie复用)
-- [方式3: 自动化登录](#方式3-自动化登录)
-- [完整实战示例](#完整实战示例)
-- [登录状态检测](#登录状态检测)
-- [Cookie管理最佳实践](#cookie管理最佳实践)
-- [常见问题](#常见问题)
-- [安全建议](#安全建议)
-
----
-
-## 概述
-
-在使用 Browser-Use 进行网页自动化时,很多网站需要登录才能访问完整内容。本文档详细介绍如何在云浏览器模式下处理各种登录场景。
-
-### 为什么需要登录处理?
-
-- 🔒 **内容保护** - 很多网站的核心内容需要登录才能访问
-- 🚫 **反爬虫** - 未登录用户可能被限流或拦截
-- 📊 **个性化数据** - 某些数据只对登录用户可见
-- 🎯 **操作权限** - 发布、评论等操作需要登录
-
----
-
-## 登录场景分类
-
-### 1. 简单账号密码登录
-- 输入用户名/邮箱
-- 输入密码
-- 点击登录按钮
-- **示例**: GitHub, Twitter
-
-### 2. 扫码登录
-- 显示二维码
-- 用户扫码确认
-- **示例**: 微信, 小红书, 淘宝
-
-### 3. 验证码登录
-- 输入手机号
-- 接收验证码
-- 输入验证码
-- **示例**: 大部分国内网站
-
-### 4. 第三方登录
-- OAuth 授权
-- 跳转到第三方平台
-- **示例**: Google登录, Facebook登录
-
-### 5. 多因素认证 (MFA)
-- 密码 + 验证码
-- 密码 + 邮箱确认
-- **示例**: 银行网站, 企业系统
-
----
-
-## 三种登录处理方式
-
-| 方式 | 适用场景 | 优点 | 缺点 |
-|------|---------|------|------|
-| **手动登录** | 扫码、验证码、复杂登录 | 最灵活,成功率高 | 需要人工介入 |
-| **Cookie复用** | 频繁使用同一账号 | 快速,无需重复登录 | Cookie会过期 |
-| **自动化登录** | 简单账号密码登录 | 完全自动化 | 容易被反爬虫检测 |
-
----
-
-## 方式1: 手动登录(推荐)
-
-### 核心思路
-
-1. 启动云浏览器(非无头模式)
-2. 导航到登录页面
-3. 使用 `wait_for_user_action` 暂停自动化
-4. 用户在 Live URL 中手动完成登录
-5. 用户按 Enter 继续自动化流程
-
-### 完整代码示例
-
-```python
-import asyncio
-from dotenv import load_dotenv
-from agent.tools.builtin.baseClass import (
-    init_browser_session,
-    cleanup_browser_session,
-    navigate_to_url,
-    wait,
-    wait_for_user_action,
-    evaluate,
-)
-
-load_dotenv()
-
-async def manual_login_example():
-    """
-    手动登录示例 - 适用于所有登录场景
-    """
-    try:
-        # 步骤 1: 初始化云浏览器(非无头模式)
-        print("🌐 启动云浏览器...")
-        browser, tools = await init_browser_session(
-            headless=False,  # 关键:设置为 False
-            use_cloud=True,
-        )
-
-        print("✅ 云浏览器已启动")
-        print("📝 提示: 查找日志中的 '🔗 Live URL',在浏览器中打开该链接")
-
-        # 步骤 2: 导航到目标网站
-        print("\n📍 导航到小红书...")
-        await navigate_to_url("https://www.xiaohongshu.com")
-        await wait(3)
-
-        # 步骤 3: 检查登录状态(可选)
-        print("\n🔍 检查登录状态...")
-        check_login_js = """
-        (function() {
-            // 检查是否有用户头像或用户名
-            const userAvatar = document.querySelector('[class*="avatar"]');
-            const userName = document.querySelector('[class*="username"]');
-            const loginBtn = document.querySelector('[class*="login"]');
-
-            return {
-                isLoggedIn: !!(userAvatar || userName),
-                hasLoginBtn: !!loginBtn
-            };
-        })()
-        """
-
-        status = await evaluate(check_login_js)
-        print(f"   登录状态: {status.output}")
-
-        # 步骤 4: 等待用户手动登录
-        print("\n👤 等待用户登录...")
-        print("=" * 60)
-        print("请按以下步骤操作:")
-        print("1. 在日志中找到 '🔗 Live URL'")
-        print("2. 复制该 URL 并在浏览器中打开")
-        print("3. 在 Live URL 页面中完成登录(扫码或账号密码)")
-        print("4. 登录成功后,回到这里按 Enter 继续")
-        print("=" * 60)
-
-        await wait_for_user_action(
-            message="请在云浏览器中完成登录,完成后按 Enter 继续",
-            timeout=300  # 5 分钟超时
-        )
-
-        print("\n✅ 用户已确认登录完成")
-
-        # 步骤 5: 验证登录状态
-        print("\n🔍 验证登录状态...")
-        status = await evaluate(check_login_js)
-        print(f"   登录状态: {status.output}")
-
-        # 步骤 6: 继续后续操作
-        print("\n🎯 开始执行后续任务...")
-        # 这里可以继续你的自动化任务
-        # 例如:搜索、爬取数据等
-
-        print("\n✅ 任务完成")
-
-    except Exception as e:
-        print(f"❌ 错误: {str(e)}")
-    finally:
-        await cleanup_browser_session()
-
-if __name__ == "__main__":
-    asyncio.run(manual_login_example())
-```
-
-### 关键点说明
-
-1. **headless=False**: 必须设置为 False,否则无法在 Live URL 中看到页面
-2. **Live URL**: 云浏览器启动时会输出,格式如 `https://live.browser-use.com?wss=...`
-3. **wait_for_user_action**: 暂停自动化,等待用户操作
-4. **timeout**: 设置合理的超时时间(建议 3-5 分钟)
-
----
-
-## 方式2: Cookie复用
-
-### 核心思路
-
-1. 第一次手动登录并保存 Cookie
-2. 后续使用 BrowserProfile 预设 Cookie
-3. 跳过登录步骤,直接访问内容
-
-### 步骤 1: 首次登录并保存 Cookie
-
-```python
-import asyncio
-import json
-from pathlib import Path
-from dotenv import load_dotenv
-from agent.tools.builtin.baseClass import (
-    init_browser_session,
-    cleanup_browser_session,
-    navigate_to_url,
-    wait,
-    wait_for_user_action,
-    evaluate,
-)
-
-load_dotenv()
-
-async def save_cookies_after_login():
-    """
-    首次登录并保存 Cookie
-    """
-    try:
-        # 初始化浏览器
-        browser, tools = await init_browser_session(
-            headless=False,
-            use_cloud=True,
-        )
-
-        print("✅ 云浏览器已启动")
-
-        # 导航到网站
-        await navigate_to_url("https://www.xiaohongshu.com")
-        await wait(3)
-
-        # 等待用户登录
-        print("\n👤 请在 Live URL 中完成登录...")
-        await wait_for_user_action(
-            message="登录完成后按 Enter 继续",
-            timeout=300
-        )
-
-        # 获取 Cookie
-        print("\n💾 保存 Cookie...")
-        get_cookies_js = """
-        (function() {
-            return document.cookie;
-        })()
-        """
-
-        cookies_result = await evaluate(get_cookies_js)
-        cookies_str = cookies_result.output
-
-        # 解析 Cookie 字符串为列表
-        cookies = []
-        for cookie_str in cookies_str.split('; '):
-            if '=' in cookie_str:
-                name, value = cookie_str.split('=', 1)
-                cookies.append({
-                    "name": name,
-                    "value": value,
-                    "domain": ".xiaohongshu.com",
-                    "path": "/",
-                })
-
-        # 保存到文件
-        cookie_file = Path("cookies_xhs.json")
-        with open(cookie_file, "w", encoding="utf-8") as f:
-            json.dump(cookies, f, ensure_ascii=False, indent=2)
-
-        print(f"✅ Cookie 已保存到: {cookie_file}")
-        print(f"   共 {len(cookies)} 个 Cookie")
-
-    except Exception as e:
-        print(f"❌ 错误: {str(e)}")
-    finally:
-        await cleanup_browser_session()
-
-if __name__ == "__main__":
-    asyncio.run(save_cookies_after_login())
-```
-
-### 步骤 2: 使用保存的 Cookie
-
-```python
-import asyncio
-import json
-from pathlib import Path
-from dotenv import load_dotenv
-from browser_use import BrowserProfile
-from agent.tools.builtin.baseClass import (
-    init_browser_session,
-    cleanup_browser_session,
-    navigate_to_url,
-    wait,
-    evaluate,
-)
-
-load_dotenv()
-
-async def use_saved_cookies():
-    """
-    使用保存的 Cookie 跳过登录
-    """
-    try:
-        # 读取保存的 Cookie
-        cookie_file = Path("cookies_xhs.json")
-        if not cookie_file.exists():
-            print("❌ Cookie 文件不存在,请先运行 save_cookies_after_login()")
-            return
-
-        with open(cookie_file, "r", encoding="utf-8") as f:
-            cookies = json.load(f)
-
-        print(f"✅ 加载了 {len(cookies)} 个 Cookie")
-
-        # 创建 BrowserProfile 并预设 Cookie
-        profile = BrowserProfile(
-            cookies=cookies,
-            user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
-        )
-
-        # 初始化浏览器(使用 profile)
-        browser, tools = await init_browser_session(
-            headless=True,  # 可以使用无头模式
-            use_cloud=True,
-            browser_profile=profile,  # 传入 profile
-        )
-
-        print("✅ 云浏览器已启动(带 Cookie)")
-
-        # 直接访问需要登录的页面
-        print("\n📍 访问小红书(应该已登录)...")
-        await navigate_to_url("https://www.xiaohongshu.com")
-        await wait(3)
-
-        # 验证登录状态
-        print("\n🔍 验证登录状态...")
-        check_login_js = """
-        (function() {
-            const userAvatar = document.querySelector('[class*="avatar"]');
-            const userName = document.querySelector('[class*="username"]');
-            return {
-                isLoggedIn: !!(userAvatar || userName)
-            };
-        })()
-        """
-
-        status = await evaluate(check_login_js)
-        print(f"   登录状态: {status.output}")
-
-        # 继续后续操作
-        print("\n🎯 开始执行任务...")
-        # 你的自动化任务...
-
-        print("\n✅ 任务完成")
-
-    except Exception as e:
-        print(f"❌ 错误: {str(e)}")
-    finally:
-        await cleanup_browser_session()
-
-if __name__ == "__main__":
-    asyncio.run(use_saved_cookies())
-```
-
-### Cookie 复用的注意事项
-
-1. **Cookie 过期**: Cookie 有有效期,过期后需要重新登录
-2. **安全性**: Cookie 文件包含敏感信息,不要提交到 Git
-3. **域名匹配**: Cookie 的 domain 必须正确设置
-4. **定期更新**: 建议定期重新获取 Cookie
-
----
-
-## 方式3: 自动化登录
-
-### 适用场景
-
-- 简单的账号密码登录
-- 没有验证码或反爬虫检测
-- 测试环境或内部系统
-
-### 示例代码
-
-```python
-import asyncio
-from dotenv import load_dotenv
-from agent.tools.builtin.baseClass import (
-    init_browser_session,
-    cleanup_browser_session,
-    navigate_to_url,
-    wait,
-    get_selector_map,
-    input_text,
-    click_element,
-    evaluate,
-)
-
-load_dotenv()
-
-async def automated_login_example():
-    """
-    自动化登录示例(仅适用于简单场景)
-    """
-    try:
-        # 初始化浏览器
-        browser, tools = await init_browser_session(
-            headless=True,
-            use_cloud=True,
-        )
-
-        print("✅ 云浏览器已启动")
-
-        # 导航到登录页面
-        print("\n📍 导航到登录页面...")
-        await navigate_to_url("https://example.com/login")
-        await wait(2)
-
-        # 获取页面元素
-        print("\n🎯 获取页面元素...")
-        selector_result = await get_selector_map()
-        print(f"   找到 {selector_result.long_term_memory}")
-
-        # 注意:需要根据实际页面找到正确的元素索引
-        # 这里假设:
-        # - 索引 0 是用户名输入框
-        # - 索引 1 是密码输入框
-        # - 索引 2 是登录按钮
-
-        # 输入用户名
-        print("\n📝 输入用户名...")
-        await input_text(index=0, text="your_username", clear=True)
-        await wait(1)
-
-        # 输入密码
-        print("\n🔑 输入密码...")
-        await input_text(index=1, text="your_password", clear=True)
-        await wait(1)
-
-        # 点击登录按钮
-        print("\n🖱️ 点击登录按钮...")
-        await click_element(index=2)
-        await wait(3)
-
-        # 验证登录状态
-        print("\n🔍 验证登录状态...")
-        check_login_js = """
-        (function() {
-            // 检查是否跳转到首页或有用户信息
-            const currentUrl = window.location.href;
-            const userInfo = document.querySelector('[class*="user"]');
-            return {
-                currentUrl: currentUrl,
-                isLoggedIn: !!userInfo
-            };
-        })()
-        """
-
-        status = await evaluate(check_login_js)
-        print(f"   登录状态: {status.output}")
-
-        print("\n✅ 登录完成")
-
-    except Exception as e:
-        print(f"❌ 错误: {str(e)}")
-    finally:
-        await cleanup_browser_session()
-
-if __name__ == "__main__":
-    asyncio.run(automated_login_example())
-```
-
-### 自动化登录的风险
-
-⚠️ **警告**: 自动化登录容易被检测,可能导致:
-- 账号被封禁
-- IP 被拉黑
-- 触发验证码
-- 登录失败
-
-**建议**: 优先使用手动登录或 Cookie 复用。
-
----
-
-## 完整实战示例
-
-### 小红书搜索(带登录处理)
-
-这是一个完整的实战示例,展示了如何处理小红书的登录并进行搜索。
-
-```python
-# 完整代码见 examples/cloud_browser_example.py 中的 example_6_xhs_search_save()
-```
-
-**执行流程**:
-
-1. ✅ 启动云浏览器(非无头模式)
-2. 📍 访问小红书首页
-3. 🔍 检查登录状态
-4. 👤 等待用户手动登录(通过 Live URL)
-5. ✅ 用户确认登录完成
-6. 🔍 执行搜索
-7. 📜 滚动加载更多内容
-8. 📊 提取搜索结果
-9. 💾 保存到 JSON 文件
-
-**运行方式**:
-
-```bash
-python examples/cloud_browser_example.py --example 6
-```
-
----
-
-## 登录状态检测
-
-### 通用检测方法
-
-```javascript
-// 方法 1: 检查用户相关元素
-(function() {
-    const userAvatar = document.querySelector('[class*="avatar"]');
-    const userName = document.querySelector('[class*="username"]');
-    const userMenu = document.querySelector('[class*="user-menu"]');
-    const loginBtn = document.querySelector('[class*="login"]');
-
-    return {
-        isLoggedIn: !!(userAvatar || userName || userMenu),
-        hasLoginBtn: !!loginBtn
-    };
-})()
-
-// 方法 2: 检查 Cookie
-(function() {
-    const cookies = document.cookie;
-    const hasSessionCookie = cookies.includes('session') ||
-                            cookies.includes('token') ||
-                            cookies.includes('auth');
-    return {
-        hasCookie: hasSessionCookie,
-        cookieCount: cookies.split(';').length
-    };
-})()
-
-// 方法 3: 检查 LocalStorage
-(function() {
-    const hasToken = !!localStorage.getItem('token') ||
-                    !!localStorage.getItem('user') ||
-                    !!localStorage.getItem('auth');
-    return {
-        hasLocalStorageAuth: hasToken
-    };
-})()
-```
-
-### 网站特定检测
-
-不同网站的登录状态检测方式不同,需要根据实际情况调整:
-
-```python
-# 小红书
-check_login_js = """
-(function() {
-    const userAvatar = document.querySelector('.user-avatar');
-    return { isLoggedIn: !!userAvatar };
-})()
-"""
-
-# 知乎
-check_login_js = """
-(function() {
-    const userLink = document.querySelector('.AppHeader-userInfo');
-    return { isLoggedIn: !!userLink };
-})()
-"""
-
-# 微博
-check_login_js = """
-(function() {
-    const userName = document.querySelector('.gn_name');
-    return { isLoggedIn: !!userName };
-})()
-"""
-```
-
----
-
-## Cookie管理最佳实践
-
-### 1. Cookie 存储结构
-
-```json
-{
-  "website": "xiaohongshu.com",
-  "saved_at": "2026-01-30T10:00:00",
-  "expires_at": "2026-02-30T10:00:00",
-  "cookies": [
-    {
-      "name": "session_id",
-      "value": "abc123...",
-      "domain": ".xiaohongshu.com",
-      "path": "/",
-      "secure": true,
-      "httpOnly": true
-    }
-  ]
-}
-```
-
-### 2. Cookie 管理类
-
-```python
-import json
-from pathlib import Path
-from datetime import datetime, timedelta
-from typing import List, Dict, Optional
-
-class CookieManager:
-    """Cookie 管理器"""
-
-    def __init__(self, storage_dir: str = "cookies"):
-        self.storage_dir = Path(storage_dir)
-        self.storage_dir.mkdir(parents=True, exist_ok=True)
-
-    def save_cookies(
-        self,
-        website: str,
-        cookies: List[Dict],
-        expires_days: int = 30
-    ):
-        """保存 Cookie"""
-        cookie_file = self.storage_dir / f"{website}.json"
-
-        data = {
-            "website": website,
-            "saved_at": datetime.now().isoformat(),
-            "expires_at": (datetime.now() + timedelta(days=expires_days)).isoformat(),
-            "cookies": cookies
-        }
-
-        with open(cookie_file, "w", encoding="utf-8") as f:
-            json.dump(data, f, ensure_ascii=False, indent=2)
-
-        print(f"✅ Cookie 已保存: {cookie_file}")
-
-    def load_cookies(self, website: str) -> Optional[List[Dict]]:
-        """加载 Cookie"""
-        cookie_file = self.storage_dir / f"{website}.json"
-
-        if not cookie_file.exists():
-            print(f"❌ Cookie 文件不存在: {cookie_file}")
-            return None
-
-        with open(cookie_file, "r", encoding="utf-8") as f:
-            data = json.load(f)
-
-        # 检查是否过期
-        expires_at = datetime.fromisoformat(data["expires_at"])
-        if datetime.now() > expires_at:
-            print(f"⚠️ Cookie 已过期: {cookie_file}")
-            return None
-
-        print(f"✅ Cookie 已加载: {len(data['cookies'])} 个")
-        return data["cookies"]
-
-    def is_valid(self, website: str) -> bool:
-        """检查 Cookie 是否有效"""
-        cookies = self.load_cookies(website)
-        return cookies is not None
-
-# 使用示例
-cookie_manager = CookieManager()
-
-# 保存 Cookie
-cookie_manager.save_cookies(
-    website="xiaohongshu",
-    cookies=[...],
-    expires_days=30
-)
-
-# 加载 Cookie
-cookies = cookie_manager.load_cookies("xiaohongshu")
-if cookies:
-    # 使用 Cookie
-    profile = BrowserProfile(cookies=cookies)
-```
-
-### 3. 自动刷新 Cookie
-
-```python
-async def auto_refresh_cookies(website: str, cookie_manager: CookieManager):
-    """自动刷新 Cookie"""
-
-    # 检查 Cookie 是否有效
-    if cookie_manager.is_valid(website):
-        print("✅ Cookie 有效,直接使用")
-        cookies = cookie_manager.load_cookies(website)
-        return cookies
-
-    # Cookie 无效,重新登录
-    print("⚠️ Cookie 无效,需要重新登录")
-
-    # 启动浏览器并等待用户登录
-    browser, tools = await init_browser_session(
-        headless=False,
-        use_cloud=True,
-    )
-
-    await navigate_to_url(f"https://www.{website}.com")
-    await wait(3)
-
-    await wait_for_user_action(
-        message="请完成登录,然后按 Enter",
-        timeout=300
-    )
-
-    # 获取新的 Cookie
-    get_cookies_js = "(function() { return document.cookie; })()"
-    cookies_result = await evaluate(get_cookies_js)
-
-    # 解析并保存
-    cookies = parse_cookies(cookies_result.output, website)
-    cookie_manager.save_cookies(website, cookies)
-
-    await cleanup_browser_session()
-
-    return cookies
-```
-
----
-
-## 常见问题
-
-### Q1: Live URL 在哪里找?
-
-**A**: 云浏览器启动时会在日志中输出,格式如下:
-
-```
-INFO [cloud] 🔗 Live URL: https://live.browser-use.com?wss=https%3A%2F%2F...
-```
-
-复制这个 URL 并在浏览器中打开即可。
-
-### Q2: 为什么 Live URL 打不开?
-
-**A**: 可能的原因:
-1. 网络问题 - 检查网络连接
-2. 浏览器已关闭 - 确保云浏览器还在运行
-3. URL 复制不完整 - 确保复制了完整的 URL
-
-### Q3: Cookie 多久会过期?
-
-**A**: 不同网站的 Cookie 过期时间不同:
-- 会话 Cookie: 浏览器关闭后失效
-- 持久 Cookie: 通常 7-30 天
-- 建议定期(每周)重新获取 Cookie
-
-### Q4: 如何处理验证码?
-
-**A**: 验证码必须手动处理:
-1. 使用 `wait_for_user_action` 暂停
-2. 用户在 Live URL 中完成验证码
-3. 按 Enter 继续
-
-### Q5: 可以同时登录多个账号吗?
-
-**A**: 可以,但需要:
-1. 为每个账号保存独立的 Cookie 文件
-2. 使用不同的 BrowserProfile
-3. 或者使用多个浏览器会话
-
-### Q6: 登录后如何保持会话?
-
-**A**:
-1. 不要调用 `cleanup_browser_session()`
-2. 浏览器会话会一直保持
-3. 可以继续执行多个任务
-
----
-
-## 安全建议
-
-### 1. 保护敏感信息
-
-```python
-# ❌ 不要硬编码密码
-password = "my_password"
-
-# ✅ 使用环境变量
-import os
-password = os.getenv("MY_PASSWORD")
-
-# ✅ 使用配置文件(不提交到 Git)
-import json
-with open("config.json") as f:
-    config = json.load(f)
-    password = config["password"]
-```
-
-### 2. Cookie 文件安全
-
-```bash
-# .gitignore 中添加
-cookies/
-*.cookies.json
-config.json
-.env
-```
-
-### 3. 使用代理
-
-```python
-from browser_use.browser.profile import ProxySettings
-
-proxy = ProxySettings(
-    server="http://proxy.example.com:8080",
-    username="user",
-    password="pass"
-)
-
-profile = BrowserProfile(proxy=proxy)
-```
-
-### 4. 限制登录频率
-
-```python
-import time
-
-# 避免频繁登录
-last_login_time = 0
-MIN_LOGIN_INTERVAL = 3600  # 1小时
-
-def should_login():
-    global last_login_time
-    current_time = time.time()
-    if current_time - last_login_time < MIN_LOGIN_INTERVAL:
-        return False
-    last_login_time = current_time
-    return True
-```
-
----
-
-## 总结
-
-### 登录处理决策树
-
-```
-需要登录?
-├─ 是
-│  ├─ 有保存的 Cookie?
-│  │  ├─ 是 → 使用 Cookie 复用(方式2)
-│  │  └─ 否 → 继续
-│  ├─ 是扫码/验证码登录?
-│  │  ├─ 是 → 使用手动登录(方式1)
-│  │  └─ 否 → 继续
-│  └─ 是简单账号密码?
-│     ├─ 是 → 可尝试自动化登录(方式3)
-│     └─ 否 → 使用手动登录(方式1)
-└─ 否 → 直接访问
-```
-
-### 推荐方案
-
-1. **首次使用**: 手动登录 + 保存 Cookie
-2. **日常使用**: Cookie 复用
-3. **Cookie 过期**: 手动登录 + 更新 Cookie
-
-### 最佳实践
-
-- ✅ 优先使用手动登录(最可靠)
-- ✅ 保存 Cookie 以便复用
-- ✅ 定期更新 Cookie
-- ✅ 使用非无头模式方便调试
-- ✅ 设置合理的超时时间
-- ❌ 避免硬编码密码
-- ❌ 不要频繁自动化登录
-- ❌ 不要提交 Cookie 文件到 Git
-
----
-
-**更新时间**: 2026-01-30
-**相关文档**: [CLOUD_BROWSER_GUIDE.md](./CLOUD_BROWSER_GUIDE.md)

+ 0 - 370
examples/LOGIN_UPDATE_SUMMARY.md

@@ -1,370 +0,0 @@
-# 登录处理功能更新总结
-
-## ✅ 已完成的工作
-
-### 1. 修改示例6 - 添加完整的登录处理流程
-
-**文件**: `examples/cloud_browser_example.py`
-
-**主要改进**:
-- ✅ 添加了 `wait_for_user_action` 工具导入
-- ✅ 重构了 `example_6_xhs_search_save()` 函数
-- ✅ 添加了 5 个清晰的步骤标注
-- ✅ 实现了登录状态检测
-- ✅ 集成了手动登录等待机制
-- ✅ 添加了详细的用户提示信息
-- ✅ 增加了结果预览功能
-
-**新增功能**:
-
-```python
-# 步骤 1: 访问小红书首页
-await navigate_to_url("https://www.xiaohongshu.com")
-
-# 步骤 2: 检查登录状态
-check_login_js = """..."""  # JavaScript 检测代码
-login_status = await evaluate(check_login_js)
-
-# 步骤 3: 等待用户手动登录
-await wait_for_user_action(
-    message="请在云浏览器中完成小红书登录,完成后按 Enter 继续",
-    timeout=300  # 5 分钟超时
-)
-
-# 步骤 4: 执行搜索和数据提取
-# 步骤 5: 保存结果并显示预览
-```
-
-**运行方式**:
-```bash
-python examples/cloud_browser_example.py --example 6
-```
-
----
-
-### 2. 创建详细的登录处理文档
-
-**文件**: `examples/LOGIN_HANDLING_GUIDE.md`
-
-**文档内容** (约 800 行):
-
-#### 📚 主要章节
-
-1. **概述** - 为什么需要登录处理
-2. **登录场景分类** - 5 种常见登录场景
-3. **三种登录处理方式对比**
-   - 方式1: 手动登录(推荐)
-   - 方式2: Cookie复用
-   - 方式3: 自动化登录
-
-4. **方式1: 手动登录(推荐)**
-   - 核心思路
-   - 完整代码示例
-   - 关键点说明
-
-5. **方式2: Cookie复用**
-   - 步骤1: 首次登录并保存 Cookie
-   - 步骤2: 使用保存的 Cookie
-   - Cookie 复用的注意事项
-
-6. **方式3: 自动化登录**
-   - 适用场景
-   - 示例代码
-   - 风险警告
-
-7. **完整实战示例** - 小红书搜索(带登录处理)
-
-8. **登录状态检测**
-   - 通用检测方法
-   - 网站特定检测
-
-9. **Cookie管理最佳实践**
-   - Cookie 存储结构
-   - Cookie 管理类
-   - 自动刷新 Cookie
-
-10. **常见问题** - 6 个常见问题及解答
-
-11. **安全建议**
-    - 保护敏感信息
-    - Cookie 文件安全
-    - 使用代理
-    - 限制登录频率
-
-12. **总结**
-    - 登录处理决策树
-    - 推荐方案
-    - 最佳实践
-
----
-
-## 🎯 核心解决方案
-
-### 问题1: 小红书需要登录时,在哪一步去登录?
-
-**答案**: 在访问小红书首页后,执行搜索之前
-
-**具体步骤**:
-
-```python
-# 1. 启动云浏览器(非无头模式)
-await init_browser_session(
-    headless=False,  # 关键:设置为 False
-    use_cloud=True,
-)
-
-# 2. 访问小红书首页
-await navigate_to_url("https://www.xiaohongshu.com")
-
-# 3. 检查登录状态(可选)
-login_status = await evaluate(check_login_js)
-
-# 4. 等待用户手动登录 ⭐ 关键步骤
-await wait_for_user_action(
-    message="请在云浏览器中完成小红书登录,完成后按 Enter 继续",
-    timeout=300
-)
-
-# 5. 继续执行搜索和数据提取
-await navigate_to_url(search_url)
-```
-
-**用户操作流程**:
-1. 程序启动后,查找日志中的 `🔗 Live URL`
-2. 复制 Live URL 并在浏览器中打开
-3. 在 Live URL 页面中完成登录(扫码或账号密码)
-4. 登录成功后,回到终端按 Enter 继续
-
----
-
-### 问题2: 如果后续操作需要登录后才能获得数据,应该在哪一步介入?
-
-**答案**: 有三种介入方式,根据场景选择
-
-#### 方式1: 手动登录(推荐,适用于所有场景)
-
-**介入时机**: 在访问需要登录的页面之前
-
-```python
-# 通用模板
-async def task_with_login():
-    # 1. 启动浏览器
-    await init_browser_session(headless=False, use_cloud=True)
-
-    # 2. 访问网站首页
-    await navigate_to_url("https://target-website.com")
-
-    # 3. 【介入点】等待用户登录
-    await wait_for_user_action(
-        message="请完成登录,然后按 Enter",
-        timeout=300
-    )
-
-    # 4. 继续执行需要登录的操作
-    await navigate_to_url("https://target-website.com/protected-page")
-    # 提取数据...
-```
-
-#### 方式2: Cookie复用(推荐,适用于频繁使用)
-
-**介入时机**: 在初始化浏览器时
-
-```python
-# 首次使用:保存 Cookie
-async def first_time_save_cookies():
-    await init_browser_session(headless=False, use_cloud=True)
-    await navigate_to_url("https://target-website.com")
-
-    # 【介入点】等待用户登录
-    await wait_for_user_action("请完成登录", timeout=300)
-
-    # 保存 Cookie
-    cookies = await get_cookies()
-    save_to_file(cookies, "cookies.json")
-
-# 后续使用:加载 Cookie
-async def subsequent_use():
-    cookies = load_from_file("cookies.json")
-    profile = BrowserProfile(cookies=cookies)
-
-    # 【介入点】使用 profile 初始化
-    await init_browser_session(
-        headless=True,
-        use_cloud=True,
-        browser_profile=profile  # 预设 Cookie
-    )
-
-    # 直接访问需要登录的页面(已登录)
-    await navigate_to_url("https://target-website.com/protected-page")
-```
-
-#### 方式3: 自动化登录(不推荐,仅适用于简单场景)
-
-**介入时机**: 在登录页面加载后
-
-```python
-async def automated_login():
-    await init_browser_session(headless=True, use_cloud=True)
-    await navigate_to_url("https://target-website.com/login")
-
-    # 【介入点】自动填写表单
-    await input_text(index=0, text="username")
-    await input_text(index=1, text="password")
-    await click_element(index=2)
-
-    # 等待登录完成
-    await wait(3)
-
-    # 继续执行任务
-    await navigate_to_url("https://target-website.com/protected-page")
-```
-
----
-
-## 📊 三种方式对比
-
-| 方式 | 介入时机 | 适用场景 | 优点 | 缺点 |
-|------|---------|---------|------|------|
-| **手动登录** | 访问网站后 | 所有场景 | 最可靠,成功率高 | 需要人工操作 |
-| **Cookie复用** | 初始化浏览器时 | 频繁使用 | 快速,无需重复登录 | Cookie会过期 |
-| **自动化登录** | 登录页面加载后 | 简单账号密码 | 完全自动化 | 容易被检测 |
-
----
-
-## 🎓 实战建议
-
-### 首次使用(推荐流程)
-
-```python
-# 第一次:手动登录 + 保存 Cookie
-async def first_time():
-    # 1. 手动登录
-    await init_browser_session(headless=False, use_cloud=True)
-    await navigate_to_url("https://www.xiaohongshu.com")
-    await wait_for_user_action("请完成登录", timeout=300)
-
-    # 2. 保存 Cookie
-    cookies = await get_cookies()
-    save_cookies("xiaohongshu", cookies)
-
-    # 3. 执行任务
-    await do_task()
-```
-
-### 日常使用(推荐流程)
-
-```python
-# 后续:直接使用 Cookie
-async def daily_use():
-    # 1. 加载 Cookie
-    cookies = load_cookies("xiaohongshu")
-
-    # 2. 检查 Cookie 是否有效
-    if not cookies or is_expired(cookies):
-        # Cookie 无效,重新登录
-        await first_time()
-        return
-
-    # 3. 使用 Cookie 初始化
-    profile = BrowserProfile(cookies=cookies)
-    await init_browser_session(
-        headless=True,
-        use_cloud=True,
-        browser_profile=profile
-    )
-
-    # 4. 直接执行任务(已登录)
-    await do_task()
-```
-
----
-
-## 📁 相关文件
-
-1. **示例代码**: `examples/cloud_browser_example.py`
-   - 示例6: 小红书搜索(带登录)
-   - 运行: `python examples/cloud_browser_example.py --example 6`
-
-2. **详细文档**: `examples/LOGIN_HANDLING_GUIDE.md`
-   - 完整的登录处理指南
-   - 包含所有代码示例和最佳实践
-
-3. **云浏览器指南**: `examples/CLOUD_BROWSER_GUIDE.md`
-   - 云浏览器基础使用
-   - 环境配置和快速开始
-
-4. **快速入门**: `examples/README_CLOUD_BROWSER.md`
-   - 快速开始步骤
-   - 示例列表
-
----
-
-## 🚀 快速开始
-
-### 运行小红书登录示例
-
-```bash
-# 1. 确保已安装依赖
-pip install python-socks
-
-# 2. 配置环境变量(.env 文件)
-BROWSER_USE_API_KEY=your_api_key_here
-
-# 3. 运行示例6
-python examples/cloud_browser_example.py --example 6
-
-# 4. 按照提示操作
-#    - 查找日志中的 Live URL
-#    - 在浏览器中打开 Live URL
-#    - 完成登录
-#    - 回到终端按 Enter
-```
-
-### 查看结果
-
-```bash
-# 结果保存在
-cat output/xhs.json
-```
-
----
-
-## 💡 关键要点
-
-1. **Live URL 是关键**
-   - 云浏览器启动时会输出
-   - 在浏览器中打开可以实时查看和操作
-   - 格式: `https://live.browser-use.com?wss=...`
-
-2. **headless=False 很重要**
-   - 登录时必须设置为 False
-   - 否则无法在 Live URL 中看到页面
-
-3. **wait_for_user_action 是核心**
-   - 暂停自动化流程
-   - 等待用户手动操作
-   - 设置合理的超时时间(3-5分钟)
-
-4. **Cookie 复用提高效率**
-   - 首次手动登录并保存 Cookie
-   - 后续使用 Cookie 跳过登录
-   - 定期更新 Cookie(建议每周)
-
-5. **安全第一**
-   - 不要硬编码密码
-   - Cookie 文件不要提交到 Git
-   - 使用环境变量管理敏感信息
-
----
-
-## 📞 技术支持
-
-- **详细文档**: [LOGIN_HANDLING_GUIDE.md](./LOGIN_HANDLING_GUIDE.md)
-- **云浏览器指南**: [CLOUD_BROWSER_GUIDE.md](./CLOUD_BROWSER_GUIDE.md)
-- **示例代码**: `examples/cloud_browser_example.py`
-- **基础类源码**: `agent/tools/builtin/baseClass.py`
-
----
-
-**更新时间**: 2026-01-30
-**版本**: v1.0.0

+ 0 - 111
examples/README_CLOUD_BROWSER.md

@@ -1,111 +0,0 @@
-# Browser-Use 云浏览器模式示例
-
-本目录包含 Browser-Use 云浏览器模式的完整示例和文档。
-
-## 📁 文件说明
-
-- **cloud_browser_example.py** - 云浏览器模式示例代码(包含 5 个示例)
-- **CLOUD_BROWSER_GUIDE.md** - 详细使用文档
-
-## 🚀 快速开始
-
-### 1. 安装依赖
-
-```bash
-pip install python-socks
-```
-
-### 2. 配置环境变量
-
-在项目根目录的 `.env` 文件中添加:
-
-```bash
-BROWSER_USE_API_KEY=your_api_key_here
-```
-
-### 3. 运行示例
-
-```bash
-# 运行默认示例(示例 1: 基础导航操作)
-python examples/cloud_browser_example.py
-
-# 运行指定示例
-python examples/cloud_browser_example.py --example 2
-
-# 运行所有示例
-python examples/cloud_browser_example.py --all
-```
-
-## 📚 示例列表
-
-1. **基础导航操作** - 访问网页、获取页面信息、截图
-2. **搜索和内容提取** - 使用搜索引擎、提取页面内容
-3. **使用 BrowserProfile** - 预设 cookies、localStorage、User-Agent
-4. **表单交互** - 填写表单、提交数据
-5. **多标签页操作** - 管理多个标签页
-
-## 📖 详细文档
-
-查看 [CLOUD_BROWSER_GUIDE.md](./CLOUD_BROWSER_GUIDE.md) 获取完整的使用指南,包括:
-
-- 云浏览器 vs 本地浏览器对比
-- 环境配置详解
-- 核心概念和 API 说明
-- 完整示例代码
-- 高级用法
-- 常见问题解答
-- 最佳实践
-
-## 🔑 核心代码
-
-```python
-import asyncio
-from dotenv import load_dotenv
-from agent.tools.builtin.baseClass import (
-    init_browser_session,
-    cleanup_browser_session,
-    navigate_to_url,
-)
-
-load_dotenv()
-
-async def main():
-    # 初始化云浏览器
-    browser, tools = await init_browser_session(
-        headless=True,
-        use_cloud=True,  # 关键:启用云浏览器
-    )
-
-    # 访问网页
-    await navigate_to_url("https://www.baidu.com")
-
-    # 清理
-    await cleanup_browser_session()
-
-asyncio.run(main())
-```
-
-## 🌟 云浏览器优势
-
-- ✅ 无需本地安装 Chrome/Chromium
-- ✅ 可在无头服务器上运行
-- ✅ 提供 Live URL 实时查看
-- ✅ 更好的稳定性和性能
-- ✅ 支持分布式部署
-
-## 🛠️ 技术支持
-
-- **详细文档**: [CLOUD_BROWSER_GUIDE.md](./CLOUD_BROWSER_GUIDE.md)
-- **基础类源码**: `agent/tools/builtin/baseClass.py`
-- **Browser-Use 官方文档**: https://docs.browser-use.com
-
-## 📝 注意事项
-
-1. 确保已安装 `python-socks` 依赖
-2. 确保 `.env` 文件中配置了有效的 `BROWSER_USE_API_KEY`
-3. 云浏览器需要网络连接,可能有轻微延迟
-4. 使用 Live URL 可以实时查看云浏览器操作
-
----
-
-**更新时间**: 2026-01-30

+ 1 - 1
examples/cloud_browser_example.py

@@ -323,7 +323,7 @@ async def example_5_multi_tab():
         await cleanup_browser_session()
         await cleanup_browser_session()
         print("🧹 浏览器会话已清理")
         print("🧹 浏览器会话已清理")
 
 
-
+ 
 def load_cookies(cookie_str, domain, url=None):
 def load_cookies(cookie_str, domain, url=None):
     cookies = []
     cookies = []
     try:
     try: