使用自制Qt工具配合mitmproxy进行网络调试

news2024/12/28 19:06:28

在软件开发和网络调试过程中,抓包工具是不可或缺的。传统的抓包工具如Fiddler或Charles Proxy通常需要设置系统代理,这会抓到其他应用程序的网络连接,需要设置繁琐的过滤,导致不必要的干扰。为了解决这个问题,我们可以利用Qt的QWebView内嵌浏览器配合mitmproxy进行网络调试,从而实现更加灵活和高效的抓包体验。

什么是mitmproxy?

mitmproxy 是一个开源的交互式中间人代理工具,它允许用户拦截、查看和修改网络流量。它主要用于开发、测试和调试网络应用,以及进行安全研究。mitmproxy 提供了丰富的Python API,用户可以编写自定义脚本来处理网络流量。

为什么选择Qt的QWebView?

Qt是一个跨平台的C++应用程序开发框架,广泛用于桌面和移动应用开发。QWebView是Qt提供的一个组件,可以方便地嵌入到应用程序中,实现内嵌浏览器功能。使用QWebView的好处在于:

  1. 灵活性:QWebView可以轻松嵌入到任何Qt应用程序中,无需额外配置系统代理。
  2. 隔离性:内嵌浏览器不会影响其他应用程序的网络连接,避免了不必要的干扰。
  3. 可定制性:Qt提供了丰富的API,可以对QWebView进行深度定制,满足各种需求。

准备工作

1.安装python3.8及以上版本。

2.安装mitmproxy ,使用pip安装mitmproxy:

pip install mitmproxy
#如果速度慢,可用镜像源方式
pip install --index-url https://mirrors.aliyun.com/pypi/simple/ mitmproxy

3.pip镜像源的更改。

默认pip安装软件包比较慢,修改其为国内镜像源。方式有几种。上述的方式仅pip install 命令有效,且需要输入那么长一串。还用个办法是写入配置文件。

你可以编辑pip的配置文件。在Windows系统中,pip的配置文件位于用户的主目录下,路径通常是C:\Users\<username>\pip\pip.ini。如果文件不存在,你可以手动创建。

在Linux或macOS系统中,配置文件通常位于~/.config/pip/pip.conf。同样,如果文件不存在,你可以手动创建。

配置文件的内容可以如下所示: 

[global]
index-url = http://mirrors.tencentyun.com/pypi/simple
trusted-host = mirrors.tencentyun.com

这样设置后,每次使用pip安装包时都会默认使用配置的镜像源。 

工具实现原理

1.配置QWebView:在Qt应用程序中,配置QWebView使用mitmproxy作为代理。可以通过设置网络请求的代理来实现:

from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QUrl
from PyQt5.QtNetwork import QNetworkProxy

app = QApplication([])
view = QWebEngineView()

# 设置代理
proxy = QNetworkProxy()
proxy.setType(QNetworkProxy.HttpProxy)
proxy.setHostName("127.0.0.1")
proxy.setPort(8080)  # mitmproxy默认端口
QNetworkProxy.setApplicationProxy(proxy)

view.load(QUrl("http://example.com"))
view.show()
app.exec_()

2.编写mitmproxy脚本:编写一个mitmproxy脚本,用于拦截和处理网络流量。例如,以下脚本可以拦截包含“video”关键字的请求和响应,并将视频URL发送到Qt应用程序:

from mitmproxy import http
import socket

def request(flow: http.HTTPFlow) -> None:
    if "video" in flow.request.pretty_url:
        print(f"Detected video request: {flow.request.pretty_url}")

def response(flow: http.HTTPFlow) -> None:
    if "video" in flow.response.headers.get("Content-Type", ""):
        video_url = flow.request.pretty_url
        print(f"Detected video response: {flow.response.headers.get('Content-Type')}")
        print(f"Found video URL: {video_url}")
        send_to_qt(video_url)

def send_to_qt(video_url):
    host = '127.0.0.1'
    port = 12345
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        s.sendall(video_url.encode())

3.运行Qt应用程序

启动Qt应用程序,确保QWebView已经配置好代理,并加载目标网页。程序内部自动调用并打开mitmproxy。此时,mitmproxy会拦截并处理网络流量,根据脚本逻辑进行相应的操作。

优点总结

  1. 灵活性:使用QWebView内嵌浏览器,无需修改系统代理,避免了其他应用的干扰。
  2. 隔离性:内嵌浏览器不会影响其他应用程序的网络连接,确保调试环境的纯净。
  3. 可定制性:Qt提供了丰富的API,可以对QWebView进行深度定制,满足各种需求。
  4. 高效性:mitmproxy提供了强大的脚本支持,可以自动化处理网络流量,提高调试效率。

通过结合Qt的QWebView和mitmproxy,成功地创建了一个基于Qt的网络调试工具,它能够精确地抓取和分析Qt应用的网络请求,而不会受到其他应用的干扰。这种方法不仅提高了调试效率,还降低了系统代理设置带来的潜在风险,为软件开发人员提供了一种更为灵活和可控的网络调试手段。

http接口调试

使用该工具调试http接口也是相当的简单。不但可以调试,还可以抓包监控接口通信的每一个细节。是不是该工具有强大的接口调试页面?没必要,采用开源免费的http在线调试工具hoppscotch就行了。

hoppscotch介绍

Hoppscotch 是一个开源的、轻量级的 API 开发工具,它允许开发者通过直观的用户界面来创建和测试 HTTP 请求。Hoppscotch 的前身是 Postwoman,后来改名为 Hoppscotch。它可以直接在浏览器中使用,无需安装任何软件,因此非常方便。

Hoppscotch 的主要特点包括:

  • 开源: 代码托管在 GitHub 上,任何人都可以查看、使用和贡献代码。
  • 免费: 使用 Hoppscotch 是完全免费的,没有任何隐藏费用。
  • 轻量级: 界面简洁,加载速度快,不会占用太多系统资源。
  • 跨平台: 可以在任何支持现代浏览器的设备上使用。
  • 支持多种请求方法: 包括 GET、POST、PUT、DELETE 等。
  • 支持多种认证方式: 如 Basic Auth、Bearer Token、OAuth 等。
  • 环境变量: 可以设置和管理不同的环境变量,方便在不同环境中切换。
  • 历史记录: 保存请求历史,方便重复使用。

总之,Hoppscotch 是一个功能强大且免费的 API 调试工具,适合开发者进行快速、高效的 API 测试。只需要在地址栏中输入 :

https://hoppscotch.io/

http接口调试界面就有了。 

Hoppscotch • Open source API development ecosystem

HTTPie介绍

类似好用的在线api调试工具还有HTTPie,但它也提供了一个网页界面(HTTPie for Web),可以让你在浏览器中发送 HTTP 请求。它支持多种请求方法,并且有一个简洁的用户界面。我喜欢这个,因为界面更好看😄。

网址: https://httpie.io/

HTTPie 还有强大的命令行的使用方式,在各个平台都能下载使用,比如python环境下

pip install httpie

它比curl的命令行好用和简单多了。用法:

http [方法] URL [请求项…]

http GET http://localhost:8083/getdemo username==admin password==123456

post:

http --form POST localhost:8083/postdemo2 username='admin' password='123456'
#post json
http POST localhost:8083/header Content-Type:application/json username=admin password=123456

其他资源

Index of /qt/archive/online_installers/4.6/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1927740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个引发openssl崩溃问题案例

1 背景 最近用libevent写了一个https代理功能&#xff0c;在调研的时候&#xff0c;遇到了一个项目用到了本地多个openssl库引发的ssl握手崩溃问题。 2 开发环境 项目库版本号依赖项libeventlibevent-2.1.8-stableopenssl 1.1openssl1.0u / 1.1.1w / 3.3.1...... 3 问题现象…

FlinkErr:org/apache/hadoop/hive/ql/parse/SemanticException

在flink项目中跑 上面这段代码出现如下这个异常&#xff0c; java.lang.NoClassDefFoundError: org/apache/thrift/TException 加上下面这个依赖后不报错 <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId…

springmvc1

以前的servlet程序&#xff1a; springmvc 不同的处理器&#xff1a;不同的方法或者处理类 所有的请求都会经过dispathcherservlet的doservice方法&#xff1a; mvc原理&#xff1a; 前端控制器&#xff1a;jsp或者什么东西

axios以post方式提交表单形式数据

某些后端框架请求接口必须走form表单提交的那种形式&#xff0c;但前端很少有<form action"接口地址" method"post"></form>这种写法去提交表单数据&#xff0c;所以前端需要用axios模拟一个表单提交接口。 Content-Type 代表发送端&#xff0…

【Unity学习笔记】第二十 · 物理引擎脉络梳理(数值积分、碰撞检测、约束解决)

转载请注明出处: https://blog.csdn.net/weixin_44013533/article/details/139808452 作者&#xff1a;CSDN|Ringleader| 物理引擎综述 物理引擎是利用物理规则模拟物体运动和碰撞的模块&#xff0c;以在重力、弹力、摩擦力等各种力作用下做出真实运动表现&#xff0c;并对碰…

实现将Nginx的每个网站配置单独的nginx配置文件——每个网站单独管理

一、问题描述 Nginx默认地配置文件【nginx.conf】是包含了所有网站的配置内容,如果我们需要配置很多网站的话,就需要在默认的配置文件中给每个网站都添加一条server记录,这样下去nginx默认配置文件会变得很大,很难管理(比如有些网站不使用了,需要注销掉,也需要到该文件操…

YOLOv8白皮书-第Y7周:训练自己的数据集

本文为365天深度学习训练营中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 本文可以参考《YOLOv5白皮书-第Y2周:训练自己的数据集》 这次试着用YOLOv8训练自己的数据。 一、配置环境 1、官网下载源码 官网地址:【YOLOv8开源地址】 2、安装需要的环境 配置P…

快捷工具(提升工作效率)

文章目录 一、notepad++设置转json1.下载插件二、截图工具(可以将截图并粘贴到窗口)1.下载安装软件:snipaste三、idea 日志控制台查找日志1.idea 安装插件:Grep console四、beyond compare 4项目工程比较工具1.浏览器下载安装。本地运行五、xampp快速部署本地mysql,tomacat1.浏…

物体检测单阶段SSD

Faster RCNN 数据增广&#xff1a;

外包干了1个月,技术明显退步。。。

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

Redislnsight-v2远程连接redis

redis安装内容添加&#xff1a; Linux 下使用Docker安装redis-CSDN博客 点击添加 添加ip地址&#xff0c;密码&#xff0c;端口号 创建完成 点击查看内容&#xff1a;

python初学者知识点笔记更新

文章目录 1.main函数入口2.__init__.py 文件作用3.from .applications import server解释4.变量没有修饰&#xff0c;直接创建使用1. 内置数据类型和函数2. 类和对象3.总结 5.mod app.__module__6.集合对比区分集合类型&#xff1a;混合集合类型 7.安装包失败 1.main函数入口 …

利用react和chainlit开发大模型结果人工评测平台

项目背景 利用LLM的prompt做了个简单的服务推荐助手&#xff0c;依据用户的提问找出合适的服务项目推荐给的用户。为了测评prompt的效果&#xff0c;使用reactchainlit开发了一个简单的效果测评平台。在该平台上&#xff0c;可以模拟用户向LLM发出问题&#xff0c;并对大模型返…

阿里通义音频生成大模型 FunAudioLLM 开源

简介 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的进步极大地改变了人类与机器的互动方式&#xff0c;特别是在语音处理领域。阿里巴巴通义实验室最近开源了一个名为FunAudioLLM的语音大模型项目&#xff0c;旨在促进人类与大型语言模型&#xff08;LLMs&…

【过题笔记】 7.15

Array Without Local Maximums 算法&#xff1a;动态规划 简要思路&#xff1a; 考虑左边的数跟当前位置的关系&#xff0c;不难想到只有三种情况&#xff1a;大于&#xff0c;小于&#xff0c;等于。 于是可以得到状态 f [ i ] [ j ] [ 0 / 1 / 2 ] f[i][j][0/1/2] f[i][j][…

数据库的管理

目录 远程连接的方式 修改数据库uuid流程 数据库的概念 关系型数据库 非关系型数据库 关系型数据和非关系型数据库优缺点 mysql的数据类型 数据库的管理 sql中的名词 sql语言的分类 1.DDL&#xff1a;创建库和表的语句 create 2.DML: 插入数据 insert 修改和更…

内存函数(C语言)

内存函数 以下函数的头文件&#xff1a;string.h 针对内存块进行处理的函数 memcpy 函数原型&#xff1a; void* memcpy(void* destination, const void* source, size_t num);目标空间地址 源空间地址num&#xff0c;被拷贝的字节个数 返回目标空间的起始地…

STM32智能医疗监测系统教程

目录 引言环境准备智能医疗监测系统基础代码实现&#xff1a;实现智能医疗监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;医疗监测与管理问题解决方案与优化收尾与总结 1. 引言 智能医疗监测系统通…

RocketMQ源码学习笔记:Producer发送消息流程

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、验证消息3、查找路由4、选择消息发送队列4.1、选择队列的策略4.2、源码阅读4.2.1、轮询规避4.2.2、故障延迟规避4.2.2.1、计算规避时间4.2.2.2、选择队列 4.2.3、ThreadLocal的…

正运动控制器:EtherCAT总线初始化

1、EtherCAT总线初始化的目的 运动控制器的EtherCAT 总线接口可用于连接 EtherCAT 伺服驱动器和 EtherCAT 扩展模块&#xff0c;无论连接什么模块&#xff0c; EtherCAT 总线都需要编写一段 EtherCAT 总线初始化程序来进行电机和 EtherCAT 扩展模块的使能。使能之后的应用与脉…