"""Cookie提取器 - 使用DrissionPage库""" import tkinter as tk from tkinter import ttk, messagebox import json import os import logging from DrissionPage import ChromiumPage, ChromiumOptions 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): self.root = root self.root.title("Cookie提取器") self.root.geometry("600x250") self.root.resizable(True, True) self.page = None self._create_widgets() def _create_widgets(self): main_frame = ttk.Frame(self.root, padding="20") main_frame.pack(fill=tk.BOTH, expand=True) url_frame = ttk.LabelFrame(main_frame, text="网址输入", padding="10") url_frame.pack(fill=tk.X, pady=10) ttk.Label(url_frame, text="网址:").pack(side=tk.LEFT, padx=5) self.url_var = tk.StringVar(value="http://192.168.8.147:5666/login") self.url_entry = ttk.Entry(url_frame, textvariable=self.url_var, width=50) self.url_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5) button_frame = ttk.Frame(main_frame) button_frame.pack(fill=tk.X, pady=10) self.open_button = ttk.Button(button_frame, text="打开", command=self.open_website, width=15) self.open_button.pack(side=tk.LEFT, padx=5) self.save_button = ttk.Button(button_frame, text="保存", command=self.save_cookies, width=15, state=tk.DISABLED) self.save_button.pack(side=tk.LEFT, padx=5) self.import_button = ttk.Button(button_frame, text="导入", command=self.import_cookies, width=15) self.import_button.pack(side=tk.LEFT, padx=5) self.close_button = ttk.Button(button_frame, text="关闭", command=self.close_app, width=15) self.close_button.pack(side=tk.RIGHT, padx=5) self.status_var = tk.StringVar(value="就绪") status_frame = ttk.Frame(main_frame) status_frame.pack(fill=tk.X, pady=10) 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() if not url: messagebox.showerror("错误", "请输入网址") return if not (url.startswith("http://") or url.startswith("https://")): url = "https://" + url self.url_var.set(url) try: self._cleanup_browser() self.status_var.set("正在打开浏览器...") self.root.update() self._init_browser() self.status_var.set(f"正在访问: {url}") self.root.update() self.page.get(url) self._wait_page_loaded() self.status_var.set(f"已打开: {url}") self.save_button.config(state=tk.NORMAL) messagebox.showinfo("成功", f"已成功打开网址: {url}\n\n请在浏览器中完成登录操作后,点击'保存'按钮") except Exception as e: logger.error(f"打开网站失败: {e}") messagebox.showerror("错误", f"打开网站失败: {str(e)}") self.status_var.set("就绪") self._cleanup_browser() def save_cookies(self): """保存当前的cookie信息,并强制关闭浏览器""" if not self.page: messagebox.showerror("错误", "请先打开网站") return try: self.status_var.set("正在保存Cookies...") self.root.update() cookies = self.page.cookies() data = { "cookies": cookies, "url": 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.page.quit() self.page = None self.save_button.config(state=tk.DISABLED) self.status_var.set(f"Cookies已保存到 {output_file}") messagebox.showinfo('成功', 'Cookies保存成功,浏览器已关闭') except Exception as e: logger.error(f"保存cookies失败: {e}") messagebox.showerror("错误", f"保存cookies失败: {str(e)}") self.status_var.set("就绪") self._cleanup_browser() def import_cookies(self): """打开浏览器,导入cookie和localStorage信息,然后打开指定网站""" 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) url = data.get("url", "") cookies = data.get("cookies", []) local_storage = data.get("local_storage", {}) if not url: url = self.url_var.get().strip() if not url: messagebox.showerror("错误", "没有有效的网址") return if not (url.startswith("http://") or url.startswith("https://")): url = "https://" + url self._cleanup_browser() self.status_var.set("正在打开浏览器...") self.root.update() self._init_browser() self.status_var.set("等待浏览器就绪...") self.root.update() self.page.get("about:blank") time.sleep(1) from urllib.parse import urlparse parsed = urlparse(url) domain = parsed.netloc 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}") 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.status_var.set("刷新页面验证登录状态...") self.root.update() for i in range(3): self.page.refresh() self._wait_page_loaded() time.sleep(1) self.status_var.set(f"刷新第 {i+1} 次...") self.root.update() self.url_var.set(url) self.status_var.set(f"已导入并打开: {url}") self.save_button.config(state=tk.NORMAL) messagebox.showinfo("成功", f"已成功导入 {success_count} 个cookie并打开网址: {url}") except Exception as e: logger.error(f"导入cookies失败: {e}") messagebox.showerror("错误", f"导入cookies失败: {str(e)}") self.status_var.set("就绪") 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("就绪") def main(): root = tk.Tk() app = CookieExtractorApp(root) def on_closing(): app._cleanup_browser() root.destroy() root.protocol("WM_DELETE_WINDOW", on_closing) root.mainloop() if __name__ == "__main__": main()