PyQt6+mitmproxy,实现抓取网络请求并打印到桌面的窗口中

发布于:2024-06-26 ⋅ 阅读:(19) ⋅ 点赞:(0)

你可以将你的PyQt6应用程序与mitmproxy结合使用,以便在GUI中显示拦截的HTTP请求和响应。以下是修改后的代码:

  1. 安装依赖项
    确保你已经安装了PyQt6mitmproxy

    pip install PyQt6 mitmproxy
    
  2. 编写Python代码

    创建一个Python文件,例如 hello_world_with_proxy.py,并在其中编写以下代码:

import sys
import asyncio
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QTextEdit
from PyQt6.QtCore import Qt, QTimer
from threading import Thread
from mitmproxy import http
from mitmproxy.tools.dump import DumpMaster
from mitmproxy.options import Options
from queue import Queue

class HelloWorldApp(QWidget):
def init(self):
super().init()

    self.initUI()

def initUI(self):
    self.setWindowTitle('Hello World App')
    self.setGeometry(100, 100, 500, 400)

    layout = QVBoxLayout()

    self.text_edit = QTextEdit(self)
    self.text_edit.setReadOnly(True)

    self.button = QPushButton('Start Proxy', self)
    self.button.clicked.connect(self.start_proxy)

    layout.addWidget(self.text_edit)
    layout.addWidget(self.button)
    self.setLayout(layout)

    self.queue = Queue()

def start_proxy(self):
    self.thread = Thread(target=self.run_proxy, daemon=True)
    self.thread.start()
    self.button.setEnabled(False)

def run_proxy(self):
    asyncio.run(self.start_mitmproxy())

async def start_mitmproxy(self):
    options = Options(listen_host='127.0.0.1', listen_port=7890)
    master = DumpMaster(options)
    master.addons.add(ProxyAddon(self.queue))
    await master.run()

def update_text_edit(self):
    while not self.queue.empty():
        message = self.queue.get()
        self.text_edit.append(message)

class ProxyAddon:
def init(self, queue):
self.queue = queue

def request(self, flow: http.HTTPFlow) -> None:
    if "https://bizapi.csdn.net/community-personal/v1/get-work?username=sunyuhua_keyboard" in flow.request.pretty_url:
        message = f"请求URL: {flow.request.pretty_url}  请求内容: {flow.request.content}"
        self.queue.put(message)

def response(self, flow: http.HTTPFlow) -> None:
    if "https://bizapi.csdn.net/community-personal/v1/get-work?username=sunyuhua_keyboard" in flow.request.pretty_url:
        message = f"响应内容: {flow.response.content}"
        self.queue.put(message)

def main():
app = QApplication(sys.argv)
ex = HelloWorldApp()
ex.show()

timer = QTimer()
timer.timeout.connect(ex.update_text_edit)
timer.start(100)  # 100毫秒检查一次队列

sys.exit(app.exec())

if name == ‘main’:
main()


这个代码创建了一个PyQt6的GUI应用程序,包含一个文本编辑框和一个按钮。点击按钮将启动`mitmproxy`代理服务器,并监控指定的URL请求和响应。拦截到的信息将被打印到文本编辑框中。

3. **运行程序**:

在终端中运行这个Python脚本:
```bash
python hello_world_with_proxy.py

请确保你的浏览器或其他应用程序的代理设置指向127.0.0.1:8080,这样流量就会通过你的代理服务器进行拦截和处理。

这个代码应该能够在按钮点击后启动代理,并在拦截到指定URL的请求和响应时,在GUI中显示这些信息。