Spaces:
Running
Running
File size: 4,995 Bytes
3085164 a61399c e15281a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
def convert_cookie_editor_to_playwright(cookies_from_editor, logger=None):
"""
将从 Cookie-Editor 插件导出的 Cookie 列表转换为 Playwright 兼容的格式。
"""
playwright_cookies = []
for cookie in cookies_from_editor:
pw_cookie = {}
for key in ['name', 'value', 'domain', 'path', 'httpOnly', 'secure']:
if key in cookie:
pw_cookie[key] = cookie[key]
if cookie.get('session', False):
pw_cookie['expires'] = -1
elif 'expirationDate' in cookie:
if cookie['expirationDate'] is not None:
pw_cookie['expires'] = int(cookie['expirationDate'])
else:
pw_cookie['expires'] = -1
if 'sameSite' in cookie:
same_site_value = str(cookie['sameSite']).lower()
if same_site_value == 'no_restriction':
pw_cookie['sameSite'] = 'None'
elif same_site_value in ['lax', 'strict']:
pw_cookie['sameSite'] = same_site_value.capitalize()
elif same_site_value == 'unspecified':
pw_cookie['sameSite'] = 'Lax'
if all(key in pw_cookie for key in ['name', 'value', 'domain', 'path']):
playwright_cookies.append(pw_cookie)
else:
if logger:
logger.warning(f"跳过一个格式不完整的 Cookie: {cookie}")
return playwright_cookies
def convert_kv_to_playwright(kv_string, default_domain=".google.com", logger=None):
"""
将键值对格式的 Cookie 字符串转换为 Playwright 兼容的格式。
Args:
kv_string (str): 包含 Cookie 的键值对字符串,格式为 "name1=value1; name2=value2; ..."
default_domain (str): 默认域名,默认为".google.com"
logger: 日志记录器
Returns:
list: Playwright 兼容的 Cookie 列表
"""
playwright_cookies = []
# 按分号分割 Cookie
cookie_pairs = kv_string.split(';')
for pair in cookie_pairs:
pair = pair.strip() # 去除首尾空白字符
if not pair: # 跳过空字符串
continue
# 跳过无效的 Cookie(不包含等号)
if '=' not in pair:
if logger:
logger.warning(f"跳过无效的 Cookie 格式: '{pair}'")
continue
# 分割name和value
name, value = pair.split('=', 1) # 只分割第一个等号
name = name.strip()
value = value.strip()
if not name: # 跳过空名称
if logger:
logger.warning(f"跳过空名称的 Cookie: '{pair}'")
continue
# 构造 Playwright 格式的 Cookie
pw_cookie = {
'name': name,
'value': value,
'domain': default_domain,
'path': '/',
'expires': -1, # 默认为会话 Cookie
'httpOnly': False, # KV 格式无法确定 httpOnly 状态,默认为 False
'secure': True, # 假设为安全 Cookie
'sameSite': 'Lax' # 默认 SameSite 策略
}
playwright_cookies.append(pw_cookie)
if logger:
logger.debug(f"成功转换 Cookie: {name} -> domain={default_domain}")
return playwright_cookies
def auto_convert_to_playwright(cookie_data, default_domain=".google.com", logger=None):
"""
自动识别 Cookie 数据格式并转换为 Playwright 兼容格式。
支持两种输入格式:
1. JSON 数组 (Cookie-Editor 导出格式)
2. KV 字符串 (键值对格式: "name1=value1; name2=value2; ...")
Args:
cookie_data: Cookie 数据,可以是 list (JSON格式) 或 str (KV格式)
default_domain (str): KV格式使用的默认域名,默认为".google.com"
logger: 日志记录器
Returns:
list: Playwright 兼容的 Cookie 列表
Raises:
ValueError: 当格式无法识别时抛出异常
"""
# 格式1: JSON 数组格式 (Cookie-Editor 导出格式)
if isinstance(cookie_data, list):
if logger:
logger.debug(f"检测到 JSON 数组格式的 Cookie 数据,共 {len(cookie_data)} 个条目")
return convert_cookie_editor_to_playwright(cookie_data, logger=logger)
# 格式2: KV 字符串格式
if isinstance(cookie_data, str):
# 去除首尾空白字符
cookie_str = cookie_data.strip()
if not cookie_str:
if logger:
logger.warning("收到空的 Cookie 字符串")
return []
if logger:
logger.debug(f"检测到 KV 字符串格式的 Cookie 数据")
return convert_kv_to_playwright(
cookie_str,
default_domain=default_domain,
logger=logger
)
# 无法识别的格式
error_msg = f"无法识别的 Cookie 数据格式: {type(cookie_data).__name__}"
if logger:
logger.error(error_msg)
raise ValueError(error_msg)
|