217 lines
6.6 KiB
Python
217 lines
6.6 KiB
Python
#!/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()
|