最近在写一个「视频图片媒体嗅探工具」,能自动抓取网页的图片、视频流等内容,并支持保存到本地。
最开始我只是用命令行跑 mitmdump,后来想做计算机小白也能用的版本,于是做了一个 GUI,并且打包成 EXE…
结果一路踩坑 🤯
这篇就是整个过程的“复盘记录”,包括环境准备、失败经历、最终稳定方案,给需要做类似工作的同学一个完整参考。
🚩目标
希望这个工具做到:
✔ GUI 启动,一键抓包
✔ 不依赖 Python、conda、mitmproxy
✔ 打包成 EXE 分发
✔ 支持抓取 HLS/DASH 视频、图片、音频流
✔ 输出保存目录可配置
最终实现方式👇
👉 GUI 调用内置 python_runtime + mitmdump.exe
👉 自定义脚本负责媒体提取和保存
🧩踩坑过程(按时间顺序)
❌ 第一次方案:GUI 内部直接跑 mitmproxy API
最开始想在 GUI 内直接 new 一个 DumpMaster,然后 run():
opts = options.Options()
master = DumpMaster(opts)
master.addons.add(Script("wx_sniffer_addon.py"))
await master.run()
结果立刻踩坑👇
❌ API 版本差异巨大
❌ option 中不存在 scripts 字段
❌ Script 对象重复加载报 already exists
❌ 日志线程+事件循环冲突
结论:不稳定,不适合集成在 GUI 进程里。
❌ 第二次方案:GUI 用系统 PATH 下的 mitmdump
GUI 用 subprocess:
mitmdump -s wx_sniffer_addon.py
打包 EXE 后出现👇
未找到 mitmdump 命令
原因:
EXE 运行时不会继承 conda 环境,也不会自动从 PATH 找到 mitmdump。
❌ 第三次方案:硬编码 mitmdump 路径(依赖 conda)
C:\Users\xxx\anaconda3\envs\video\Scripts\mitmdump.exe
看似可以运行,但:
⚠ 用户电脑没有 conda 就用不了
⚠ conda 路径不固定,没法分发
仍然无法做到真正可执行交付。
✔ 最终方案 C:随 EXE 内置完整运行时
将整个 Python 环境 + mitmproxy 复制出来,随程序发布
就像绿色版软件一样,谁都能直接双击运行。
🧱 步骤如下👇
第一步:创建可复制的 Python 运行时
conda create -p C:\wx_sniffer_python python=3.11 -y
conda activate C:\wx_sniffer_python
pip install mitmproxy
完成后得到一份完整 runtime:
C:\wx_sniffer_python\
├ python.exe
├ Lib\
├ Scripts\
├ mitmdump.exe
└ mitmproxy.exe
第二步:复制 runtime 到项目目录
wx-sniffer-app/
├ wx_sniffer_gui.exe
├ wx_sniffer_addon.py
└ python_runtime/
├ python.exe
├ Scripts/mitmdump.exe
以后只要这三个东西放一起就能运行。
第三步:GUI 改成调用内置 mitmdump
cmd = [
str(self.mitmdump_exe),
"--listen-port", str(listen_port),
"-s", self.addon_script_path,
]
同时 GUI 监听 mitmdump 的 stdout,把日志实时写到窗口。
⚙️其他坑
🔥 8080 端口被占用(最常见错误)
报错:
[Errno 10048] failed to listen on *:8080
原因:
另一个代理已经在监听 8080。
解决:
✔ GUI 支持自定义端口
✔ 监听前自动检测端口
✔ Windows 下还能查出 PID 提示给用户
for /f "tokens=5" %i in ('netstat -ano ^| findstr :8080 ^| findstr LISTENING') do taskkill /PID %i /F
🧩 打包后 python_runtime 被 PyInstaller 搞错路径?
mitmproxy 会打印路径,发现是👇
C:\Users\admin\AppData\Local\Temp\_MEIxxxx\python_runtime
根源是:
PyInstaller 会把资源复制到临时目录 _MEIPASS
解决👇
⚠ python_runtime 不应被 PyInstaller 打包进去
✔ GUI 应该始终定位 EXE 所在目录作为 base
Path(sys.executable).parent
🎯最终效果
⏺ 运行 GUI
⏺ 选择工作目录
⏺ 设定端口(默认 8080)
⏺ 一键“启动抓包”
⏺ mitmdump 输出实时显示
⏺ 打开微信、网页
🟢 output 自动出现媒体文件
整个工具终于闭环运行 ✔
📝经验总结
这次踩坑最大的启发:
❌ 不要把 mitmproxy API 集成进 GUI
❌ 不要依赖系统环境和 PATH
❌ 不要让 PyInstaller 操控 runtime 路径
✔ 让 GUI 作为“进程挂件”来调用 mitmdump 才是最稳的做法
✔ runtime / 依赖全部自带,才能真正发布
📌如果你也要做类似工具,可以直接复用本思路:
☑ 建 runtime
☑ 复制 runtime
☑ 独立 mitmdump
☑ GUI 用子进程调用
☑ 输出日志
☑ 支持自定义端口
☑ EXE 运行完全独立
解压包地址:https://github.com/igool/wx_sniffer_app,如果你能该内容感兴趣,请点击一下在看或者与你的好友分享。