实现双重验证机制:优先使用本地cookies,失败时回退到服务器cookies

This commit is contained in:
2026-03-05 08:33:24 +08:00
parent 7a896f56ba
commit e090f546c6
3 changed files with 68 additions and 66 deletions
+2 -34
View File
@@ -8,44 +8,12 @@
},
"用户B": {
"lmkbi.95155.com": {
"cookies": [
{
"name": "_qimei_uuid42",
"value": "1a302130f16100ca18af370a47cb8afce807c4a076",
"domain": ".95155.com"
},
{
"name": "_qimei_fingerprint",
"value": "50aa79f919511142818459f44ac38dee",
"domain": ".95155.com"
},
{
"name": "_qimei_i_3",
"value": "64c844d0c35e05dc9796fc355d8470e5a3eba5f0410e00d3e78c2d0e2f95293d306031943c89e29eb6a6",
"domain": ".95155.com"
},
{
"name": "_qimei_h38",
"value": "f8e0750618af370a47cb8afc0200000c91a302",
"domain": ".95155.com"
},
{
"name": "_qimei_i_1",
"value": "42d946d49d0f50dcc497f83153d525e3f0eef5f51508518ae5d97b582493206c6163649c39d8e1dcd4a9dffb",
"domain": ".95155.com"
}
],
"cookies": [],
"url": "https://lmkbi.95155.com/bi-system/#/carUnpetrifiedComAll",
"website_name": "网站A"
},
"192.168.1.200:8006": {
"cookies": [
{
"name": "PVELangCookie",
"value": "zh_CN",
"domain": "192.168.1.200"
}
],
"cookies": [],
"url": "https://192.168.1.200:8006/",
"website_name": "网站B"
}
+66 -22
View File
@@ -192,18 +192,6 @@ class CookieMonitor:
logger.info(f"用户 {user_name} 没有配置网站,跳过")
return
cookie_cloud = CookieCloud(
api_url=cookie_cloud_config.get('api_url', ''),
uuid=cookie_cloud_config.get('uuid', ''),
password=cookie_cloud_config.get('password', '')
)
logger.info(f"步骤1: 从 Cookie Cloud 获取所有 cookies")
all_cookies = cookie_cloud.get_cookies()
total_domains = len(all_cookies)
total_cookies = sum(len(c) for c in all_cookies.values())
logger.info(f"获取到 {total_domains} 个域名,共 {total_cookies} 个 cookie")
browser = BrowserManager(
browser_type=browser_config.get('type', 'edge'),
headless=browser_config.get('headless', False)
@@ -218,6 +206,20 @@ class CookieMonitor:
}
try:
logger.info(f"步骤1: 从本地 cookie_data.json 读取用户 cookies")
local_cookies = self._load_local_cookies(user_name)
logger.info(f"步骤1.5: 从 Cookie Cloud 获取所有 cookies")
cookie_cloud = CookieCloud(
api_url=cookie_cloud_config.get('api_url', ''),
uuid=cookie_cloud_config.get('uuid', ''),
password=cookie_cloud_config.get('password', '')
)
all_cookies = cookie_cloud.get_cookies()
total_domains = len(all_cookies)
total_cookies = sum(len(c) for c in all_cookies.values())
logger.info(f"获取到 {total_domains} 个域名,共 {total_cookies} 个 cookie")
logger.info(f"步骤2: 初始化浏览器")
browser.init_browser()
@@ -227,7 +229,8 @@ class CookieMonitor:
user_name=user_name,
website_config=website,
browser=browser,
all_cookies=all_cookies
all_cookies=all_cookies,
local_cookies=local_cookies
)
user_results['websites'].append(result)
@@ -246,19 +249,33 @@ class CookieMonitor:
finally:
browser.close()
def _load_local_cookies(self, user_name: str) -> dict:
"""从本地 cookie_data.json 读取用户的 cookies"""
filename = "cookie_data.json"
if not os.path.exists(filename):
return {}
try:
with open(filename, 'r', encoding='utf-8') as f:
cookie_data = json.load(f)
return cookie_data.get(user_name, {})
except:
return {}
def process_website(
self,
user_name: str,
website_config: dict,
browser: BrowserManager,
all_cookies: dict
all_cookies: dict,
local_cookies: dict
) -> dict:
"""验证网站登录状态"""
website_name = website_config.get('name', '未知网站')
url = website_config.get('url', '')
check_selector = website_config.get('login_check_selector', '')
success_text = website_config.get('success_text', '')
logger.info(f"\n验证网站: {website_name}")
logger.info(f" URL: {url}")
@@ -279,18 +296,18 @@ class CookieMonitor:
domain = parsed.netloc
domain_cookies = []
for cookie_domain, cookies in all_cookies.items():
for cookie_domain, cookies in local_cookies.items():
clean_domain = cookie_domain.lstrip('.')
if domain in clean_domain or clean_domain in domain:
domain_cookies.extend(cookies)
if domain_cookies:
logger.info(f" 找到 {len(domain_cookies)}相关 cookie")
logger.info(f" 找到 {len(domain_cookies)}本地 cookie")
success_count = browser.import_cookies(domain_cookies, domain)
logger.info(f" 成功导入 {success_count} 个 cookie")
else:
logger.warning(f" 未找到相关 cookie")
logger.warning(f" 未找到本地 cookie")
login_success = browser.verify_login(
url=url,
check_selector=check_selector,
@@ -299,12 +316,39 @@ class CookieMonitor:
if login_success:
result['success'] = True
logger.info(f" ✓ 登录验证成功")
logger.info(f" 使用本地 cookie 登录验证成功")
self._save_cookies_to_file(domain_cookies, url, website_name, user_name)
else:
result['error'] = '登录状态验证失败(cookies可能已过期或选择器配置错误)'
logger.warning(f"{result['error']}")
logger.warning(f" ✗ 本地 cookie 登录失败,尝试使用服务器 cookie")
domain_cookies = []
for cookie_domain, cookies in all_cookies.items():
clean_domain = cookie_domain.lstrip('.')
if domain in clean_domain or clean_domain in domain:
domain_cookies.extend(cookies)
if domain_cookies:
logger.info(f" 找到 {len(domain_cookies)} 个服务器 cookie")
success_count = browser.import_cookies(domain_cookies, domain)
logger.info(f" 成功导入 {success_count} 个 cookie")
else:
logger.warning(f" 未找到服务器 cookie")
login_success = browser.verify_login(
url=url,
check_selector=check_selector,
success_text=success_text
)
if login_success:
result['success'] = True
logger.info(f" ✓ 使用服务器 cookie 登录验证成功")
self._save_cookies_to_file(domain_cookies, url, website_name, user_name)
else:
result['error'] = '登录状态验证失败(本地和服务器 cookie 都无效)'
logger.warning(f"{result['error']}")
except Exception as e:
result['error'] = f'处理异常: {str(e)}'
-10
View File
@@ -1,10 +0,0 @@
{
"用户A": {
"date": "2026-03-04",
"hour": 22
},
"用户B": {
"date": "2026-03-04",
"hour": 22
}
}