Files
cookie/browser_tool.py
T

180 lines
6.6 KiB
Python

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()