|
@@ -62,6 +62,9 @@ from ....llm.openrouter import openrouter_llm_call
|
|
|
# 将项目根目录添加到 Python 路径
|
|
# 将项目根目录添加到 Python 路径
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
|
|
|
|
|
|
+# 配置日志
|
|
|
|
|
+logger = logging.getLogger(__name__)
|
|
|
|
|
+
|
|
|
# 导入框架的工具装饰器和结果类
|
|
# 导入框架的工具装饰器和结果类
|
|
|
from agent.tools import tool, ToolResult
|
|
from agent.tools import tool, ToolResult
|
|
|
from agent.tools.builtin.browser.sync_mysql_help import mysql
|
|
from agent.tools.builtin.browser.sync_mysql_help import mysql
|
|
@@ -1997,14 +2000,17 @@ async def browser_export_cookies(name: str = "", account: str = "") -> ToolResul
|
|
|
|
|
|
|
|
|
|
|
|
|
@tool()
|
|
@tool()
|
|
|
-async def browser_load_cookies(url: str, name: str = "") -> ToolResult:
|
|
|
|
|
|
|
+async def browser_load_cookies(url: str, name: str = "", auto_navigate: bool = True) -> ToolResult:
|
|
|
"""
|
|
"""
|
|
|
根据目标 URL 自动查找本地 Cookie 文件,注入浏览器并导航到目标页面恢复登录态。
|
|
根据目标 URL 自动查找本地 Cookie 文件,注入浏览器并导航到目标页面恢复登录态。
|
|
|
|
|
+ 如果找不到 Cookie 文件,会根据 auto_navigate 参数决定是否直接导航到目标页面。
|
|
|
|
|
+
|
|
|
重要:此工具会自动完成导航,调用前不需要先调用 browser_navigate_to_url。
|
|
重要:此工具会自动完成导航,调用前不需要先调用 browser_navigate_to_url。
|
|
|
|
|
|
|
|
Args:
|
|
Args:
|
|
|
url: 目标 URL(必须提供,同时用于自动匹配 Cookie 文件)
|
|
url: 目标 URL(必须提供,同时用于自动匹配 Cookie 文件)
|
|
|
name: Cookie 文件名(可选,不传则根据 URL 域名自动查找)
|
|
name: Cookie 文件名(可选,不传则根据 URL 域名自动查找)
|
|
|
|
|
+ auto_navigate: 找不到 Cookie 时是否自动导航到目标页面(默认 True)
|
|
|
"""
|
|
"""
|
|
|
try:
|
|
try:
|
|
|
browser, tools = await get_browser_session()
|
|
browser, tools = await get_browser_session()
|
|
@@ -2017,19 +2023,95 @@ async def browser_load_cookies(url: str, name: str = "") -> ToolResult:
|
|
|
from urllib.parse import urlparse
|
|
from urllib.parse import urlparse
|
|
|
domain = urlparse(url).netloc.replace("www.", "")
|
|
domain = urlparse(url).netloc.replace("www.", "")
|
|
|
if _COOKIES_DIR.exists():
|
|
if _COOKIES_DIR.exists():
|
|
|
- matches = list(_COOKIES_DIR.glob(f"{domain}*.json"))
|
|
|
|
|
|
|
+ # 尝试多种匹配模式
|
|
|
|
|
+ matches = []
|
|
|
|
|
+
|
|
|
|
|
+ # 1. 精确匹配完整域名(如 xiaohongshu.com.json)
|
|
|
|
|
+ exact_match = _COOKIES_DIR / f"{domain}.json"
|
|
|
|
|
+ if exact_match.exists():
|
|
|
|
|
+ matches.append(exact_match)
|
|
|
|
|
+ logger.info(f"Cookie 精确匹配成功: {exact_match.name}")
|
|
|
|
|
+
|
|
|
|
|
+ # 2. 匹配域名前缀(如 xiaohongshu.com*.json)
|
|
|
|
|
+ if not matches:
|
|
|
|
|
+ prefix_matches = list(_COOKIES_DIR.glob(f"{domain}*.json"))
|
|
|
|
|
+ if prefix_matches:
|
|
|
|
|
+ matches = prefix_matches
|
|
|
|
|
+ logger.info(f"Cookie 前缀匹配成功: {[m.name for m in matches]}")
|
|
|
|
|
+
|
|
|
|
|
+ # 3. 模糊匹配:提取主域名(如 xiaohongshu)
|
|
|
|
|
+ if not matches:
|
|
|
|
|
+ main_domain = domain.split('.')[0] # 提取第一部分
|
|
|
|
|
+ fuzzy_matches = list(_COOKIES_DIR.glob(f"{main_domain}*.json"))
|
|
|
|
|
+ if fuzzy_matches:
|
|
|
|
|
+ matches = fuzzy_matches
|
|
|
|
|
+ logger.info(f"Cookie 模糊匹配成功: {[m.name for m in matches]} (主域名: {main_domain})")
|
|
|
|
|
+
|
|
|
if matches:
|
|
if matches:
|
|
|
cookie_file = matches[0] # 取第一个匹配的
|
|
cookie_file = matches[0] # 取第一个匹配的
|
|
|
|
|
+ logger.info(f"使用 Cookie 文件: {cookie_file.name}")
|
|
|
else:
|
|
else:
|
|
|
available = [f.stem for f in _COOKIES_DIR.glob("*.json")]
|
|
available = [f.stem for f in _COOKIES_DIR.glob("*.json")]
|
|
|
- return ToolResult(title="未找到 Cookie", output=f"没有匹配 {domain} 的文件,可用: {available}", error=f"无 {domain} 的 Cookie 文件")
|
|
|
|
|
|
|
+ logger.warning(f"未找到匹配的 Cookie 文件。域名: {domain}, 可用: {available}")
|
|
|
|
|
+ hint = f"可用的 Cookie 文件: {available}" if available else "提示:首次使用需要先手动登录,然后使用 browser_export_cookies 保存 Cookie"
|
|
|
|
|
+
|
|
|
|
|
+ # 如果启用自动导航,直接访问目标页面
|
|
|
|
|
+ if auto_navigate:
|
|
|
|
|
+ await tools.navigate(url=url, browser_session=browser)
|
|
|
|
|
+ await tools.wait(seconds=2, browser_session=browser)
|
|
|
|
|
+ return ToolResult(
|
|
|
|
|
+ title="未找到 Cookie,已导航到目标页面",
|
|
|
|
|
+ output=f"没有找到 {domain} 的 Cookie 文件,已自动导航到 {url}。\n\n{hint}\n\n建议:如需保持登录态,请手动登录后使用 browser_export_cookies 保存 Cookie。",
|
|
|
|
|
+ error=None,
|
|
|
|
|
+ long_term_memory=f"未找到 {domain} 的 Cookie,已导航到 {url}"
|
|
|
|
|
+ )
|
|
|
|
|
+ else:
|
|
|
|
|
+ return ToolResult(
|
|
|
|
|
+ title="未找到 Cookie",
|
|
|
|
|
+ output=f"没有匹配 {domain} 的 Cookie 文件。{hint}\n\n建议:使用 browser_navigate_to_url 访问 {url} 并手动登录,或使用 browser_export_cookies 保存当前 Cookie。",
|
|
|
|
|
+ error=None,
|
|
|
|
|
+ long_term_memory=f"未找到 {domain} 的 Cookie 文件"
|
|
|
|
|
+ )
|
|
|
else:
|
|
else:
|
|
|
- return ToolResult(title="未找到 Cookie", output=".cookies 目录不存在", error="Cookie 目录不存在")
|
|
|
|
|
|
|
+ # Cookie 目录不存在
|
|
|
|
|
+ if auto_navigate:
|
|
|
|
|
+ await tools.navigate(url=url, browser_session=browser)
|
|
|
|
|
+ await tools.wait(seconds=2, browser_session=browser)
|
|
|
|
|
+ return ToolResult(
|
|
|
|
|
+ title="首次使用 Cookie 功能,已导航到目标页面",
|
|
|
|
|
+ output=f"这是首次使用 Cookie 功能,已自动导航到 {url}。\n\n建议:手动完成登录后,使用 browser_export_cookies 保存 Cookie 供下次使用。",
|
|
|
|
|
+ error=None,
|
|
|
|
|
+ long_term_memory="首次使用 Cookie 功能,已导航到目标页面"
|
|
|
|
|
+ )
|
|
|
|
|
+ else:
|
|
|
|
|
+ return ToolResult(
|
|
|
|
|
+ title="Cookie 目录不存在",
|
|
|
|
|
+ output=f"这是首次使用 Cookie 功能。建议:\n1. 使用 browser_navigate_to_url 访问 {url}\n2. 手动完成登录\n3. 使用 browser_export_cookies 保存 Cookie 供下次使用",
|
|
|
|
|
+ error=None,
|
|
|
|
|
+ long_term_memory="Cookie 目录不存在,这是首次使用"
|
|
|
|
|
+ )
|
|
|
else:
|
|
else:
|
|
|
cookie_file = _COOKIES_DIR / f"{name}.json"
|
|
cookie_file = _COOKIES_DIR / f"{name}.json"
|
|
|
if not cookie_file.exists():
|
|
if not cookie_file.exists():
|
|
|
available = [f.stem for f in _COOKIES_DIR.glob("*.json")] if _COOKIES_DIR.exists() else []
|
|
available = [f.stem for f in _COOKIES_DIR.glob("*.json")] if _COOKIES_DIR.exists() else []
|
|
|
- return ToolResult(title="文件不存在", output=f"可用: {available}", error=f"未找到 .cookies/{name}.json")
|
|
|
|
|
|
|
+ hint = f"可用的 Cookie 文件: {available}" if available else "提示:使用 browser_export_cookies 保存 Cookie"
|
|
|
|
|
+
|
|
|
|
|
+ if auto_navigate:
|
|
|
|
|
+ await tools.navigate(url=url, browser_session=browser)
|
|
|
|
|
+ await tools.wait(seconds=2, browser_session=browser)
|
|
|
|
|
+ return ToolResult(
|
|
|
|
|
+ title="Cookie 文件不存在,已导航到目标页面",
|
|
|
|
|
+ output=f"未找到 .cookies/{name}.json,已自动导航到 {url}。\n\n{hint}",
|
|
|
|
|
+ error=None,
|
|
|
|
|
+ long_term_memory=f"未找到 {name}.json,已导航到目标页面"
|
|
|
|
|
+ )
|
|
|
|
|
+ else:
|
|
|
|
|
+ return ToolResult(
|
|
|
|
|
+ title="Cookie 文件不存在",
|
|
|
|
|
+ output=f"未找到 .cookies/{name}.json。{hint}",
|
|
|
|
|
+ error=None,
|
|
|
|
|
+ long_term_memory=f"未找到 {name}.json Cookie 文件"
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
cookies = json.loads(cookie_file.read_text(encoding="utf-8"))
|
|
cookies = json.loads(cookie_file.read_text(encoding="utf-8"))
|
|
|
|
|
|