重构项目结构,优化模块划分,修复数据结构和登录验证问题

This commit is contained in:
2026-03-05 17:05:35 +08:00
parent e090f546c6
commit a70af1b0da
13 changed files with 625 additions and 1262 deletions
+43 -107
View File
@@ -1,35 +1,35 @@
"""Cookie提取器 - 使用DrissionPage库"""
import tkinter as tk
from tkinter import ttk, messagebox
import json
import os
import logging
from DrissionPage import ChromiumPage, ChromiumOptions
from browser_manager import BrowserManager
from config_manager import CookieDataManager
from logger import get_logger
logger = get_logger(__name__)
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('cookie_extractor.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
class CookieExtractorApp:
"""Cookie提取器应用"""
def __init__(self, root):
"""
初始化应用
Args:
root: 根窗口
"""
self.root = root
self.root.title("Cookie提取器")
self.root.geometry("600x250")
self.root.resizable(True, True)
self.page = None
self.browser_manager = BrowserManager()
self.cookie_data_manager = CookieDataManager()
self._create_widgets()
def _create_widgets(self):
"""创建界面控件"""
main_frame = ttk.Frame(self.root, padding="20")
main_frame.pack(fill=tk.BOTH, expand=True)
@@ -63,18 +63,6 @@ class CookieExtractorApp:
ttk.Label(status_frame, text="状态:").pack(side=tk.LEFT, padx=5)
ttk.Label(status_frame, textvariable=self.status_var, foreground="blue").pack(side=tk.LEFT, padx=5)
def _init_browser(self):
"""初始化浏览器"""
co = ChromiumOptions()
co.set_browser_path(r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe")
self.page = ChromiumPage(addr_or_opts=co)
def _wait_page_loaded(self, timeout=30):
"""等待页面加载完成"""
if self.page:
self.page.wait.doc_loaded(timeout=timeout)
self.page.ele('tag:body', timeout=timeout)
def open_website(self):
"""打开指定网站"""
url = self.url_var.get().strip()
@@ -93,13 +81,13 @@ class CookieExtractorApp:
self.status_var.set("正在打开浏览器...")
self.root.update()
self._init_browser()
self.browser_manager.init_browser()
self.status_var.set(f"正在访问: {url}")
self.root.update()
self.page.get(url)
self._wait_page_loaded()
self.browser_manager.page.get(url)
self.browser_manager.wait_page_loaded()
self.status_var.set(f"已打开: {url}")
self.save_button.config(state=tk.NORMAL)
@@ -113,30 +101,25 @@ class CookieExtractorApp:
def save_cookies(self):
"""保存当前的cookie信息,并强制关闭浏览器"""
if not self.page:
if not self.browser_manager.page:
messagebox.showerror("错误", "请先打开网站")
return
try:
self.status_var.set("正在保存Cookies...")
self.status_var.set("正在提取cookies...")
self.root.update()
cookies = self.page.cookies()
cookies = self.browser_manager.get_cookies()
logger.info(f"成功提取 {len(cookies)} 个 cookies")
data = {
"cookies": cookies,
"url": self.url_var.get()
}
self.cookie_data_manager.save_simple_cookies(cookies, self.url_var.get())
output_file = "cookie_data.json"
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
self.status_var.set("正在关闭浏览器...")
self.root.update()
self.page.quit()
self.page = None
self.save_button.config(state=tk.DISABLED)
self._cleanup_browser()
self.status_var.set(f"Cookies已保存到 {output_file}")
self.status_var.set(f"Cookies已保存到 cookie_data.json")
messagebox.showinfo('成功', 'Cookies保存成功,浏览器已关闭')
except Exception as e:
@@ -146,23 +129,13 @@ class CookieExtractorApp:
self._cleanup_browser()
def import_cookies(self):
"""打开浏览器,导入cookie和localStorage信息,然后打开指定网站"""
"""打开浏览器,导入cookie信息,然后打开指定网站"""
import time
try:
output_file = "cookie_data.json"
if not os.path.exists(output_file):
messagebox.showerror("错误", f"文件不存在: {output_file}")
return
self.status_var.set("正在读取cookies...")
self.root.update()
with open(output_file, 'r', encoding='utf-8') as f:
data = json.load(f)
data = self.cookie_data_manager.load_simple_cookies()
url = data.get("url", "")
cookies = data.get("cookies", [])
local_storage = data.get("local_storage", {})
if not url:
url = self.url_var.get().strip()
@@ -179,11 +152,11 @@ class CookieExtractorApp:
self.status_var.set("正在打开浏览器...")
self.root.update()
self._init_browser()
self.browser_manager.init_browser()
self.status_var.set("等待浏览器就绪...")
self.root.update()
self.page.get("about:blank")
self.browser_manager.page.get("about:blank")
time.sleep(1)
from urllib.parse import urlparse
@@ -193,55 +166,19 @@ class CookieExtractorApp:
if cookies:
self.status_var.set("正在导入cookies...")
self.root.update()
success_count = 0
for cookie in cookies:
try:
if not cookie.get('name') or not cookie.get('value'):
continue
cookie_dict = {
'name': cookie.get('name'),
'value': cookie.get('value'),
'domain': cookie.get('domain', domain),
'path': cookie.get('path', '/')
}
self.page.set.cookies(cookie_dict)
success_count += 1
except Exception as e:
logger.error(f"导入cookie失败: {cookie.get('name')} - {e}")
success_count = self.browser_manager.import_cookies(cookies, domain)
logger.info(f"成功导入 {success_count} 个 cookies")
if local_storage:
self.status_var.set("正在导入localStorage...")
self.root.update()
ls_count = 0
for ls_domain, items in local_storage.items():
try:
for key, value in items.items():
try:
self.page.set.local_storage(key, value)
ls_count += 1
except Exception as e:
logger.error(f"导入localStorage失败: {key} - {e}")
except Exception as e:
logger.error(f"导入localStorage域失败: {ls_domain} - {e}")
logger.info(f"成功导入 {ls_count} 个 localStorage")
self.status_var.set(f"正在访问: {url}")
self.root.update()
self.page.get(url)
self._wait_page_loaded()
self.browser_manager.page.get(url)
self.browser_manager.wait_page_loaded()
self.status_var.set("刷新页面验证登录状态...")
self.root.update()
for i in range(3):
self.page.refresh()
self._wait_page_loaded()
self.browser_manager.page.refresh()
self.browser_manager.wait_page_loaded()
time.sleep(1)
self.status_var.set(f"刷新第 {i+1} 次...")
self.root.update()
@@ -258,21 +195,19 @@ class CookieExtractorApp:
self._cleanup_browser()
def close_app(self):
"""关闭应用"""
self._cleanup_browser()
self.root.destroy()
def _cleanup_browser(self):
if self.page:
try:
self.page.quit()
except Exception as e:
logger.error(f"关闭浏览器失败: {e}")
finally:
self.page = None
self.save_button.config(state=tk.DISABLED)
self.status_var.set("就绪")
"""清理浏览器资源"""
self.browser_manager.close()
self.save_button.config(state=tk.DISABLED)
self.status_var.set("就绪")
def main():
"""主函数"""
root = tk.Tk()
app = CookieExtractorApp(root)
@@ -283,5 +218,6 @@ def main():
root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()
if __name__ == "__main__":
main()