"""Cookie和LocalStorage提取器 - 使用DrissionPage库""" import tkinter as tk from tkinter import ttk, messagebox import json import os from DrissionPage import Chromium, ChromiumOptions from applogger import setup_logging, get_logger # 初始化日志 setup_logging() logger = get_logger(__name__) class CookieExtractorApp: """Cookie和LocalStorage提取器应用""" def __init__(self, root): """ 初始化应用 Args: root: 根窗口 """ self.root = root self.root.title("Cookie和LocalStorage提取器") self.root.geometry("600x300") self.root.resizable(True, True) # 浏览器实例 self.browser = None self.tab = 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="https://") 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_url, width=15) self.open_button.pack(side=tk.LEFT, padx=5) self.save_button = ttk.Button(button_frame, text="保存", command=self.save_data, width=15, state=tk.DISABLED) self.save_button.pack(side=tk.LEFT, padx=5) self.restore_button = ttk.Button(button_frame, text="恢复", command=self.restore_data, width=15) self.restore_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 open_url(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: if not self.browser or not self.tab: self.status_var.set("正在打开浏览器...") self.root.update() # 创建浏览器实例 co = ChromiumOptions() # 设置Edge浏览器路径 co.set_browser_path(r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe") co.set_argument('--no-sandbox') co.set_argument('--disable-dev-shm-usage') self.browser = Chromium(co) self.tab = self.browser.new_tab() self.status_var.set(f"正在访问: {url}") self.root.update() # 在当前页面打开网址 self.tab.get(url) 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_data(self): """保存cookie和localStorage数据""" if not self.browser or not self.tab: messagebox.showerror("错误", "请先打开网址") return try: self.status_var.set("正在提取数据...") self.root.update() # 提取浏览器的cookies信息 cookies = self.browser.cookies() # 提取localStorage数据 localStorage = self._get_local_storage() # 整合数据 data = { "cookies": cookies, "localStorage": localStorage, "url": self.url_var.get(), "timestamp": os.path.getmtime(__file__) } # 保存到JSON文件 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(f"数据已保存到: {output_file}") messagebox.showinfo("成功", f"数据已成功保存到: {output_file}\n\n- Cookie数量: {len(cookies)}\n- LocalStorage项目数量: {len(localStorage)}") except Exception as e: logger.error(f"保存数据失败: {e}") messagebox.showerror("错误", f"保存数据失败: {str(e)}") self.status_var.set("就绪") def _get_local_storage(self): """获取localStorage数据""" try: # 使用JavaScript获取localStorage数据 js_code = """ var result = {}; for (var i = 0; i < localStorage.length; i++) { var key = localStorage.key(i); result[key] = localStorage.getItem(key); } JSON.stringify(result); """ result = self.tab.run_js(js_code) return json.loads(result) if result else {} except Exception as e: logger.error(f"获取localStorage失败: {e}") return {} def restore_data(self): """从cookie_data.json恢复数据""" try: self.status_var.set("正在恢复数据...") self.root.update() # 检查文件是否存在 output_file = "cookie_data.json" if not os.path.exists(output_file): messagebox.showerror("错误", f"文件不存在: {output_file}") self.status_var.set("就绪") return # 读取数据 with open(output_file, 'r', encoding='utf-8') as f: data = json.load(f) # 提取数据 url = data.get("url", "") cookies = data.get("cookies", []) localStorage = data.get("localStorage", {}) if not url: messagebox.showerror("错误", "文件中没有保存的网址") self.status_var.set("就绪") return # 关闭现有浏览器 self._cleanup_browser() self.status_var.set("正在打开浏览器...") self.root.update() # 创建浏览器实例 co = ChromiumOptions() # 设置Edge浏览器路径 co.set_browser_path(r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe") co.set_argument('--no-sandbox') co.set_argument('--disable-dev-shm-usage') self.browser = Chromium(co) self.tab = self.browser.new_tab() # 访问网址(先访问一个空白页面,以便注入localStorage) self.status_var.set("正在准备注入环境...") self.root.update() self.tab.get("about:blank") # 注入cookies到浏览器 if cookies: self.status_var.set("正在注入cookies...") self.root.update() try: self.browser.set.cookies(cookies) logger.info(f"成功注入 {len(cookies)} 个 cookies 到浏览器") except Exception as e: logger.error(f"注入cookies失败: {e}") # 注入localStorage if localStorage: self.status_var.set("正在注入localStorage...") self.root.update() try: # 使用更安全的方式注入localStorage for key, value in localStorage.items(): # 转义单引号和双引号 safe_value = value.replace("'", "\\'").replace('"', '\\"') js_code = f"localStorage.setItem('{key}', '{safe_value}');" self.tab.run_js(js_code) logger.info(f"成功注入 {len(localStorage)} 个 localStorage 项目") except Exception as e: logger.error(f"注入localStorage失败: {e}") # 访问目标网址 self.status_var.set(f"正在访问: {url}") self.root.update() self.tab.get(url) # 更新界面 self.url_var.set(url) self.status_var.set(f"已恢复: {url}") self.save_button.config(state=tk.NORMAL) messagebox.showinfo("成功", f"已成功恢复数据并打开网址: {url}\n\n- Cookie数量: {len(cookies)}\n- LocalStorage项目数量: {len(localStorage)}") except Exception as e: logger.error(f"恢复数据失败: {e}") messagebox.showerror("错误", f"恢复数据失败: {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.browser: try: self.browser.quit() except Exception as e: logger.error(f"关闭浏览器失败: {e}") finally: self.browser = None self.tab = 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()