自动同步: 2026-03-18 02:10
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
"""Cookie 管理模块
|
||||
|
||||
处理 Cookie 的导入、转换和持久化。
|
||||
"""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import List, Dict, Any
|
||||
|
||||
|
||||
def parse_json_cookies(json_path: str) -> str:
|
||||
"""从 JSON 文件解析 Cookie 为字符串格式
|
||||
|
||||
支持 Chrome Cookie Editor 导出的 JSON 格式:
|
||||
[{"name": "z_c0", "value": "xxx", "domain": ".zhihu.com"}, ...]
|
||||
|
||||
Args:
|
||||
json_path: JSON 文件路径
|
||||
|
||||
Returns:
|
||||
Cookie 字符串,格式: "name1=value1; name2=value2"
|
||||
|
||||
Raises:
|
||||
ValueError: JSON 格式无效或文件不存在
|
||||
"""
|
||||
path = Path(json_path)
|
||||
if not path.exists():
|
||||
raise ValueError(f"Cookie file not found: {json_path}")
|
||||
|
||||
try:
|
||||
with open(path, 'r', encoding='utf-8') as f:
|
||||
cookies = json.load(f)
|
||||
except json.JSONDecodeError as e:
|
||||
raise ValueError(f"Invalid JSON format: {e}")
|
||||
|
||||
if not isinstance(cookies, list):
|
||||
raise ValueError("Expected JSON array")
|
||||
|
||||
# 过滤知乎域名,转换为 name=value 格式
|
||||
zhihu_cookies = []
|
||||
for c in cookies:
|
||||
if not isinstance(c, dict):
|
||||
continue
|
||||
domain = c.get('domain', '')
|
||||
if 'zhihu.com' in domain:
|
||||
name = c.get('name', '')
|
||||
value = c.get('value', '')
|
||||
if name and value:
|
||||
zhihu_cookies.append(f"{name}={value}")
|
||||
|
||||
return '; '.join(zhihu_cookies)
|
||||
|
||||
|
||||
class CookieManager:
|
||||
"""Cookie 持久化管理器
|
||||
|
||||
管理 Cookie 在 ~/.kb_env 文件中的存储和读取。
|
||||
"""
|
||||
|
||||
ENV_FILE_NAME = ".kb_env"
|
||||
COOKIE_KEY = "ZHIHU_COOKIE"
|
||||
|
||||
def __init__(self, env_path: Path = None):
|
||||
"""初始化管理器
|
||||
|
||||
Args:
|
||||
env_path: 环境文件路径,默认 ~/.kb_env
|
||||
"""
|
||||
self.env_path = env_path or (Path.home() / self.ENV_FILE_NAME)
|
||||
|
||||
def save_cookie(self, cookie_str: str) -> None:
|
||||
"""保存 Cookie 到环境文件
|
||||
|
||||
格式: ZHIHU_COOKIE="name1=value1; name2=value2"
|
||||
|
||||
Args:
|
||||
cookie_str: Cookie 字符串
|
||||
"""
|
||||
# 读取现有内容
|
||||
lines = []
|
||||
if self.env_path.exists():
|
||||
lines = self.env_path.read_text(encoding='utf-8').splitlines()
|
||||
|
||||
# 更新或添加 ZHIHU_COOKIE 行
|
||||
cookie_line = f'{self.COOKIE_KEY}="{cookie_str}"'
|
||||
found = False
|
||||
for i, line in enumerate(lines):
|
||||
if line.startswith(f"{self.COOKIE_KEY}="):
|
||||
lines[i] = cookie_line
|
||||
found = True
|
||||
break
|
||||
if not found:
|
||||
lines.append(cookie_line)
|
||||
|
||||
# 写回文件,设置权限 600
|
||||
self.env_path.write_text('\n'.join(lines) + '\n', encoding='utf-8')
|
||||
self.env_path.chmod(0o600)
|
||||
|
||||
# 清除配置缓存
|
||||
from kb_workflow.pipeline.config import get_settings
|
||||
get_settings.cache_clear()
|
||||
|
||||
def load_cookie(self) -> str:
|
||||
"""从环境文件加载 Cookie
|
||||
|
||||
Returns:
|
||||
Cookie 字符串,不存在时返回空字符串
|
||||
"""
|
||||
if not self.env_path.exists():
|
||||
return ""
|
||||
|
||||
content = self.env_path.read_text(encoding='utf-8')
|
||||
for line in content.splitlines():
|
||||
if line.startswith(f"{self.COOKIE_KEY}="):
|
||||
# 提取引号内的值
|
||||
value = line[len(f"{self.COOKIE_KEY}="):]
|
||||
if value.startswith('"') and value.endswith('"'):
|
||||
value = value[1:-1]
|
||||
return value
|
||||
return ""
|
||||
Reference in New Issue
Block a user