给视频图片抓包写了个 GUI 工具:踩坑&解决方案完整记录


最近在写一个「视频图片媒体嗅探工具」,能自动抓取网页的图片、视频流等内容,并支持保存到本地。

最开始我只是用命令行跑 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,如果你能该内容感兴趣,请点击一下在看或者与你的好友分享。


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容