优化cookie提取器,移除Playwright依赖,重新设计界面和功能
This commit is contained in:
+147
-179
@@ -1,69 +1,62 @@
|
||||
"""Cookie和LocalStorage提取器 - 使用DrissionPage库"""
|
||||
"""Cookie提取器 - 使用DrissionPage库"""
|
||||
import tkinter as tk
|
||||
from tkinter import ttk, messagebox
|
||||
import json
|
||||
import os
|
||||
import logging
|
||||
from DrissionPage import Chromium, ChromiumOptions
|
||||
from applogger import setup_logging, get_logger
|
||||
|
||||
# 初始化日志
|
||||
setup_logging()
|
||||
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和LocalStorage提取器应用"""
|
||||
"""Cookie提取器应用"""
|
||||
|
||||
def __init__(self, root):
|
||||
"""
|
||||
初始化应用
|
||||
|
||||
Args:
|
||||
root: 根窗口
|
||||
"""
|
||||
self.root = root
|
||||
self.root.title("Cookie和LocalStorage提取器")
|
||||
self.root.geometry("600x300")
|
||||
self.root.title("Cookie提取器")
|
||||
self.root.geometry("600x250")
|
||||
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_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_url, width=15)
|
||||
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_data, width=15, state=tk.DISABLED)
|
||||
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.restore_button = ttk.Button(button_frame, text="恢复", command=self.restore_data, width=15)
|
||||
self.restore_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)
|
||||
@@ -71,8 +64,8 @@ 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 open_url(self):
|
||||
"""打开网址"""
|
||||
def open_website(self):
|
||||
"""打开指定网站"""
|
||||
url = self.url_var.get().strip()
|
||||
|
||||
if not url:
|
||||
@@ -84,128 +77,12 @@ class CookieExtractorApp:
|
||||
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')
|
||||
@@ -213,60 +90,153 @@ class CookieExtractorApp:
|
||||
self.browser = Chromium(co)
|
||||
self.tab = self.browser.new_tab()
|
||||
|
||||
# 访问网址(先访问一个空白页面,以便注入localStorage)
|
||||
self.status_var.set("正在准备注入环境...")
|
||||
self.status_var.set(f"正在访问: {url}")
|
||||
self.root.update()
|
||||
|
||||
self.tab.get(url)
|
||||
|
||||
self.status_var.set("等待页面加载...")
|
||||
self.root.update()
|
||||
|
||||
self.tab.wait.load_start()
|
||||
self.tab.wait.doc_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.browser or not self.tab:
|
||||
messagebox.showerror("错误", "请先打开网站")
|
||||
return
|
||||
|
||||
try:
|
||||
self.status_var.set("正在提取cookies...")
|
||||
self.root.update()
|
||||
|
||||
cookies = self.browser.cookies()
|
||||
logger.info(f"成功提取 {len(cookies)} 个 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.status_var.set("正在关闭浏览器...")
|
||||
self.root.update()
|
||||
|
||||
self._cleanup_browser()
|
||||
|
||||
self.status_var.set(f"数据已保存到: {output_file}")
|
||||
messagebox.showinfo("成功", f"已成功保存 {len(cookies)} 个cookie到: {output_file}\n\n浏览器已关闭")
|
||||
|
||||
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信息,然后打开指定网站"""
|
||||
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", [])
|
||||
|
||||
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()
|
||||
|
||||
co = ChromiumOptions()
|
||||
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("正在准备环境...")
|
||||
self.root.update()
|
||||
self.tab.get("about:blank")
|
||||
|
||||
# 注入cookies到浏览器
|
||||
if cookies:
|
||||
self.status_var.set("正在注入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}")
|
||||
|
||||
success_count = 0
|
||||
for cookie in cookies:
|
||||
try:
|
||||
if not cookie.get('name') or not cookie.get('value'):
|
||||
continue
|
||||
|
||||
cookie.setdefault('path', '/')
|
||||
cookie.setdefault('httpOnly', False)
|
||||
cookie.setdefault('secure', False)
|
||||
|
||||
self.browser.set.cookies([cookie])
|
||||
success_count += 1
|
||||
except Exception as e:
|
||||
logger.error(f"导入cookie失败: {cookie.get('name')} - {e}")
|
||||
|
||||
logger.info(f"成功导入 {success_count} 个 cookies")
|
||||
|
||||
# 注入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.status_var.set("等待页面加载...")
|
||||
self.root.update()
|
||||
self.tab.wait.load_start()
|
||||
self.tab.wait.doc_loaded()
|
||||
|
||||
self.url_var.set(url)
|
||||
self.status_var.set(f"已恢复: {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)}")
|
||||
messagebox.showinfo("成功", f"已成功导入 {success_count} 个cookie并打开网址: {url}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"恢复数据失败: {e}")
|
||||
messagebox.showerror("错误", f"恢复数据失败: {str(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.browser:
|
||||
try:
|
||||
self.browser.quit()
|
||||
@@ -279,11 +249,9 @@ class CookieExtractorApp:
|
||||
self.status_var.set("就绪")
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
root = tk.Tk()
|
||||
app = CookieExtractorApp(root)
|
||||
|
||||
# 处理窗口关闭事件
|
||||
def on_closing():
|
||||
app._cleanup_browser()
|
||||
root.destroy()
|
||||
|
||||
Reference in New Issue
Block a user