如何用Pygame实时显示mitmproxy捕获的请求URL?
解决mitmproxy结合Pygame实时显示请求URL的无响应问题
问题描述
使用mitmproxy调试时,尝试通过Pygame GUI实时显示捕获的请求URL,但执行mitmdump.exe -s addon_tmp.py后,mitmdump控制台输出正常,Pygame窗口却无响应且无法显示内容。
问题原因
- Pygame运行线程错误:Pygame的窗口创建、事件处理和渲染操作必须在主线程执行,原脚本将Pygame主循环放到子线程,导致窗口无法正常响应事件。
- 线程安全问题:原脚本用普通列表作为URL存储容器,多线程读写时存在数据竞争风险,可能导致界面无法正确获取新URL。
修正后的代码
import pygame import threading from mitmproxy import http from mitmproxy.tools.dump import DumpMaster from mitmproxy.options import Options import queue # 线程安全的URL队列,用于跨线程传递数据 url_queue = queue.Queue() class URLCaptureAddon: """mitmproxy插件类,负责捕获请求URL并放入队列""" def request(self, flow: http.HTTPFlow): print(flow.request.url) url_queue.put(flow.request.url) def run_proxy(): """启动mitmproxy代理服务(子线程运行)""" options = Options(listen_host='0.0.0.0', listen_port=8080) master = DumpMaster(options) master.addons.add(URLCaptureAddon()) master.run() def main(): # 初始化Pygame(主线程执行) pygame.init() screen = pygame.display.set_mode((500, 300)) pygame.display.set_caption("mitmproxy 请求URL实时显示") font = pygame.font.Font(None, 24) clock = pygame.time.Clock() running = True # 启动mitmproxy子线程,设置为守护线程以随主线程退出 proxy_thread = threading.Thread(target=run_proxy, daemon=True) proxy_thread.start() # 存储最近的URL,避免界面溢出,最多显示8条 displayed_urls = [] max_display_count = 8 while running: # 处理Pygame事件(必须在主线程) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 从队列获取新捕获的URL while not url_queue.empty(): new_url = url_queue.get() displayed_urls.append(new_url) # 超过最大显示数时删除最早的一条 if len(displayed_urls) > max_display_count: displayed_urls.pop(0) # 渲染界面 screen.fill((255, 255, 255)) for idx, url in enumerate(displayed_urls): text_surface = font.render(url, True, (0, 0, 0)) screen.blit(text_surface, (20, 20 + idx * 30)) pygame.display.flip() # 控制帧率 clock.tick(30) pygame.quit() if __name__ == "__main__": main()
关键改进点
- 线程安全队列:使用
queue.Queue替代普通列表,保证多线程环境下URL的添加和读取操作安全无冲突。 - 主线程运行Pygame:将Pygame的初始化、事件循环和渲染逻辑移到主线程,符合Pygame的运行规范,解决窗口无响应问题。
- mitmproxy作为子线程启动:通过mitmproxy官方API直接启动代理服务,以守护线程方式运行,不阻塞主线程的GUI循环。
- 限制显示数量:设置最大显示URL条数,避免过多URL导致界面内容溢出。
运行方式
- 直接执行该Python脚本:
python addon.py - 将系统或浏览器的代理设置为
127.0.0.1:8080 - 发起网络请求后,即可在Pygame窗口实时看到捕获的URL
内容的提问来源于stack exchange,提问作者mingchau
相关产品推荐
相关产品推荐

