#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 一键Cookie捕获工具(适用于小火花客户端) 功能: 1. 自动设置系统代理 2. 启动mitmproxy捕获Cookie 3. 捕获完成后自动关闭代理 """ import sys import os import subprocess import time import winreg import ctypes import socket # 设置UTF-8编码 if sys.platform == 'win32': import io if not isinstance(sys.stdout, io.TextIOWrapper) or sys.stdout.encoding != 'utf-8': sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') if not isinstance(sys.stderr, io.TextIOWrapper) or sys.stderr.encoding != 'utf-8': sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') def check_port_available(port): """检查端口是否可用""" try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(1) result = sock.connect_ex(('127.0.0.1', port)) sock.close() return result != 0 except: return False def kill_mitmdump_processes(): """关闭所有mitmdump进程""" try: # 查找mitmdump进程 result = subprocess.run( ['tasklist', '/FI', 'IMAGENAME eq mitmdump.exe', '/FO', 'CSV', '/NH'], capture_output=True, text=True ) if 'mitmdump.exe' in result.stdout: print("[!] 检测到旧的mitmdump进程,正在关闭...") subprocess.run(['taskkill', '/F', '/IM', 'mitmdump.exe'], capture_output=True) time.sleep(1) print("[OK] 已关闭旧进程") return True return False except: return False def set_proxy(enable: bool, proxy_server: str = "127.0.0.1:8888"): """设置Windows系统代理""" try: internet_settings = winreg.OpenKey( winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows\CurrentVersion\Internet Settings', 0, winreg.KEY_WRITE ) if enable: winreg.SetValueEx(internet_settings, 'ProxyEnable', 0, winreg.REG_DWORD, 1) winreg.SetValueEx(internet_settings, 'ProxyServer', 0, winreg.REG_SZ, proxy_server) else: winreg.SetValueEx(internet_settings, 'ProxyEnable', 0, winreg.REG_DWORD, 0) winreg.CloseKey(internet_settings) # 刷新系统设置 INTERNET_OPTION_REFRESH = 37 INTERNET_OPTION_SETTINGS_CHANGED = 39 internet_set_option = ctypes.windll.Wininet.InternetSetOptionW internet_set_option(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0) internet_set_option(0, INTERNET_OPTION_REFRESH, 0, 0) return True except Exception as e: print(f"[X] 设置代理失败: {e}") return False def main(): print("\n" + "="*70) print("一键Cookie捕获工具(适用于小火花客户端)") print("="*70) print() # 检查并清理旧进程 kill_mitmdump_processes() # 检查端口是否可用 if not check_port_available(8888): print("[X] 错误:端口8888已被占用") print("正在尝试关闭占用进程...") kill_mitmdump_processes() time.sleep(2) if not check_port_available(8888): print("[X] 无法释放端口,请手动关闭占用端口8888的程序") input("\n按回车键退出...") return script_dir = os.path.dirname(os.path.abspath(__file__)) capture_script = os.path.join(script_dir, "mitmproxy_capture.py") if not os.path.exists(capture_script): print(f"[X] 错误:找不到捕获脚本 {capture_script}") input("\n按回车键退出...") return print("步骤1:启用系统代理...") if not set_proxy(True): print("[X] 启用代理失败") input("\n按回车键退出...") return print("[OK] 系统代理已启用: 127.0.0.1:8888") print() print("步骤2:启动mitmproxy...") print(f" 脚本路径: {capture_script}") print(f" 监听端口: 8888") print() print("现在可以在小火花客户端中切换账号,Cookie会自动捕获") print("="*70) print() print("按 Ctrl+C 停止捕获并恢复代理设置") print() process = None try: # 构建命令 # --ssl-insecure: 忽略上游SSL证书验证 # --ignore-hosts: 排除不需要拦截的域名(让其他网站正常访问) cmd = [ "mitmdump", "-s", capture_script, "-p", "8888", "--ssl-insecure", # 忽略SSL证书验证问题 "--set", "block_global=false" # 允许所有流量通过 ] # 在Windows上使用CREATE_NO_WINDOW避免窗口问题 CREATE_NO_WINDOW = 0x08000000 process = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, creationflags=CREATE_NO_WINDOW, text=True, encoding='utf-8', errors='replace', # 忽略编码错误,用?替换无法解码的字符 bufsize=1 ) print("[OK] mitmproxy已启动,正在监听...") print() # 实时输出日志 if process.stdout: for line in process.stdout: print(line, end='') process.wait() except KeyboardInterrupt: print("\n\n[!] 用户中断,正在停止...") if process: process.terminate() process.wait() except FileNotFoundError: print("\n[X] 错误:找不到mitmdump命令") print("请确保已安装mitmproxy:") print(" pip install mitmproxy") except Exception as e: print(f"\n[X] 启动失败: {e}") import traceback traceback.print_exc() finally: # 恢复系统代理设置 print("\n步骤3:恢复系统代理设置...") if set_proxy(False): print("[OK] 系统代理已禁用,已恢复正常上网") else: print("[!] 禁用代理失败,请手动关闭系统代理") print("\n" + "="*70) print("捕获完成!") print("Cookie已保存到: captured_account_cookies.json") print("="*70) input("\n按回车键退出...") if __name__ == '__main__': # 检查是否在Windows上运行 if sys.platform != 'win32': print("[X] 此工具仅支持Windows系统") input("\n按回车键退出...") sys.exit(1) main()