import tkinter as tk from tkinter import ttk, messagebox from DrissionPage import ChromiumPage, ChromiumOptions import json import threading import time class BrowserTool: def __init__(self, root): self.root = root self.root.title('浏览器Cookie管理工具') self.root.geometry('500x200') self.root.resizable(False, False) self.page = None self.cookie_file = 'd:\\test\\openUrl\\cookies.json' self.setup_ui() def setup_ui(self): frame = ttk.Frame(self.root, padding=20) frame.pack(fill=tk.BOTH, expand=True) ttk.Label(frame, text='网址:').grid(row=0, column=0, sticky=tk.W, pady=5) self.url_entry = ttk.Entry(frame, width=60) self.url_entry.grid(row=0, column=1, columnspan=3, pady=5, sticky=tk.W) self.url_entry.insert(0, 'https://yunlu.sinopec.com/AddressBook/AddressBookCheck') btn_frame = ttk.Frame(frame) btn_frame.grid(row=1, column=0, columnspan=4, pady=20) self.open_btn = ttk.Button(btn_frame, text='打开', width=15, command=self.open_browser) self.open_btn.pack(side=tk.LEFT, padx=10) self.save_btn = ttk.Button(btn_frame, text='保存', width=15, command=self.save_cookies) self.save_btn.pack(side=tk.LEFT, padx=10) self.import_btn = ttk.Button(btn_frame, text='导入', width=15, command=self.import_cookies) self.import_btn.pack(side=tk.LEFT, padx=10) self.status_var = tk.StringVar(value='就绪') ttk.Label(frame, textvariable=self.status_var).grid(row=2, column=0, columnspan=4, pady=10) def log(self, msg): self.status_var.set(msg) self.root.update() 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_browser(self): def run(): try: self.log('正在启动浏览器...') self.init_browser() url = self.url_entry.get().strip() if not url: messagebox.showerror('错误', '请输入网址') return self.log(f'正在打开: {url}') self.page.get(url) self.wait_page_loaded() self.log('页面加载完成') except Exception as e: self.log(f'错误: {str(e)}') messagebox.showerror('错误', str(e)) threading.Thread(target=run, daemon=True).start() def save_cookies(self): def run(): try: if not self.page: messagebox.showwarning('提示', '请先打开浏览器') return self.log('正在保存Cookies...') cookies = self.page.cookies() with open(self.cookie_file, 'w', encoding='utf-8') as f: json.dump(cookies, f, ensure_ascii=False, indent=2) self.log(f'Cookies已保存到 {self.cookie_file}') self.log('正在关闭浏览器...') self.page.quit() self.page = None self.log('浏览器已关闭') messagebox.showinfo('成功', 'Cookies保存成功,浏览器已关闭') except Exception as e: self.log(f'错误: {str(e)}') messagebox.showerror('错误', str(e)) threading.Thread(target=run, daemon=True).start() def import_cookies(self): def run(): try: import os if not os.path.exists(self.cookie_file): messagebox.showwarning('提示', 'Cookie文件不存在,请先保存Cookies') return self.log('正在启动浏览器...') self.init_browser() self.log('正在加载Cookies...') with open(self.cookie_file, 'r', encoding='utf-8') as f: cookies = json.load(f) url = self.url_entry.get().strip() if not url: messagebox.showerror('错误', '请输入网址') return from urllib.parse import urlparse parsed = urlparse(url) domain = parsed.netloc self.page.get('about:blank') for cookie in cookies: cookie_dict = { 'name': cookie.get('name'), 'value': cookie.get('value'), 'domain': cookie.get('domain', domain), 'path': cookie.get('path', '/') } try: self.page.set.cookies(cookie_dict) except Exception as ce: self.log(f'设置Cookie失败: {cookie.get("name")} - {str(ce)}') self.log(f'已导入 {len(cookies)} 个Cookie') self.log(f'正在打开: {url}') self.page.get(url) self.wait_page_loaded() self.log('刷新页面验证登录状态...') for i in range(3): self.page.refresh() self.wait_page_loaded() time.sleep(1) self.log(f'刷新第 {i+1} 次...') self.log('页面加载完成') except Exception as e: self.log(f'错误: {str(e)}') messagebox.showerror('错误', str(e)) threading.Thread(target=run, daemon=True).start() def on_closing(self): if self.page: try: self.page.quit() except: pass self.root.destroy() if __name__ == '__main__': root = tk.Tk() app = BrowserTool(root) root.protocol('WM_DELETE_WINDOW', app.on_closing) root.mainloop()