You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pygame实时显示mitmproxy捕获的请求URL?

解决mitmproxy结合Pygame实时显示请求URL的无响应问题

问题描述

使用mitmproxy调试时,尝试通过Pygame GUI实时显示捕获的请求URL,但执行mitmdump.exe -s addon_tmp.py后,mitmdump控制台输出正常,Pygame窗口却无响应且无法显示内容。

问题原因

  1. Pygame运行线程错误:Pygame的窗口创建、事件处理和渲染操作必须在主线程执行,原脚本将Pygame主循环放到子线程,导致窗口无法正常响应事件。
  2. 线程安全问题:原脚本用普通列表作为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导致界面内容溢出。

运行方式

  1. 直接执行该Python脚本:python addon.py
  2. 将系统或浏览器的代理设置为127.0.0.1:8080
  3. 发起网络请求后,即可在Pygame窗口实时看到捕获的URL

内容的提问来源于stack exchange,提问作者mingchau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:17:44