Files
cookie/cookie_extractor.py
T
bwadmin c3d07f7325 完善 cookie 监控系统:
1. 修复 browser_login.py 中的 cookie 处理错误
2. 重构 cookie_cloud.py 实现浏览器实例级 cookie 共享
3. 创建 cookie_extractor.py GUI 应用程序,支持打开、保存和恢复功能
4. 优化 cookie 导入方式,支持批量导入和回退机制
5. 修复 localStorage 注入问题,确保特殊字符正确处理
2026-03-03 17:10:50 +08:00

296 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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()